<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.5 (Ruby 2.7.0) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-netmod-schedule-yang-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Common Schedule YANG">A Common YANG Data Model for Scheduling</title>

    <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="April" day="28"/>

    <area>Operations and Management</area>
    <workgroup>netmod</workgroup>
    <keyword>calendaring</keyword> <keyword>scheduling</keyword> <keyword>YANG</keyword> <keyword>groupings</keyword>

    <abstract>


<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 basic, intermediate, and advanced versions of recurrence
   related groupings.</t>



    </abstract>



  </front>

  <middle>


<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>Examples to illustrate the use of the common groupings are provided in <xref target="usage"/>.
Also, sample modules to exemplify how future modules can use the extensibility
provisions in "ietf-schedule" are provided in <xref target="sec-ext"/>.</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>

<t><list style="symbols">
  <t>XXXX --&gt; the assigned RFC number for this draft</t>
  <t>2024-04-16 --&gt; the actual date of the publication of this document</t>
</list></t>

</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>

<t>The meanings of the symbols in tree diagrams are defined in
   <xref target="RFC8340"/>.</t>

<t>Also, this document uses the YANG terminology defined in <xref section="3" sectionFormat="of" target="RFC7950"/>.</t>

</section>
<section anchor="module-overview"><name>Module Overview</name>

<t>The "ietf-schedule" module (<xref target="sec-schedule"/>) defines the following groupings:</t>

<t><list style="symbols">
  <t>"generic-schedule-params" (<xref target="sec-gen"/>)</t>
  <t>"period-of-time" (<xref target="sec-period"/>)</t>
  <t>"recurrence" (<xref target="sec-rec"/>)</t>
  <t>"recurrence-utc" (<xref target="sec-rec-utc"/>)</t>
  <t>"recurrence-with-time-zone" (<xref target="sec-rec-tz"/>)</t>
  <t>"recurrence-utc-with-date-times" (<xref target="sec-rec-utc-dt"/>)</t>
  <t>"recurrence-time-zone-with-date-times" (<xref target="sec-rec-tz-dt"/>)</t>
  <t>"icalendar-recurrence" (<xref target="sec-ical-rec"/>)</t>
  <t>"schedule-status" (<xref target="sec-schedule-status"/>)</t>
</list></t>

<t><xref target="schedule-tree"/> provides an overview of the tree structure <xref target="RFC8340"/> of
   the "ietf-schedule" module in terms of its groupings.</t>

<figure title="Overall Schedule Tree Structure" anchor="schedule-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  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:
    ...
]]></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 title="Generic Schedule Configuration Tree Structure" anchor="gsp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    +-- 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:
    ...
  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:
    ...
]]></artwork></figure>

<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>

<figure title="Period of Time Grouping Tree Structure" anchor="pt-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    +-- 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:
    ...
  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:
    ...

]]></artwork></figure>

</section>
<section anchor="sec-rec"><name>The "recurrence" Grouping</name>

<t>The "recurrence" grouping (<xref target="rec-grp-tree"/>) specifies a simple recurrence rule.</t>

<figure title="recurrence Grouping Tree Structure" anchor="rec-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    +-- recurrence-first
    |  +-- date-time-start?   yang:date-and-time
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
       +--:(until)
       |  +-- until?        yang:date-and-time
       +--:(count)
          +-- count?        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:
    ...

]]></artwork></figure>

<t>The "recurrence-first" container defines the first instance in the recurrence
  set, and the "date-time-start" specifies the date and time at which the first
  instance in the recurrence set occurs.</t>

<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>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 repetition can be scoped by a specified end time or by a count of occurrences,
  indicated by the "recurrence-bound" choice. The "date-time-start" value always counts
  as the first occurrence.</t>

</section>
<section anchor="sec-rec-utc"><name>The "recurrence-utc" Grouping</name>

<t>The "recurrence-utc" grouping (<xref target="rec-utc-grp-tree"/>) specifies a simple recurrence
   rule in UTC format.</t>

<figure title="recurrence-utc Grouping Tree Structure" anchor="rec-utc-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  grouping recurrence-utc:
    +-- recurrence-first
    |  +-- date-time-start?   yang:date-and-time
    |  +-- duration?          int32
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
       +--:(until)
       |  +-- until?        yang:date-and-time
       +--:(count)
          +-- count?        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:
    ...

]]></artwork></figure>

<t>The "recurrence-utc" grouping refines the "recurrence" grouping to require
   that the date and time values to describe the recurrence be reported in UTC format.</t>

<t>It also augments the "recurrence-first" container with a parameter "duration"
   in units of seconds to allow the time period of the first occurrence to be
   specified. The "duration" also applies to subsequent recurrence instances.</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"/>) specifies a simple recurrence
   rule with a time zone.</t>

<figure title="recurrence-with-time-zone Grouping Tree Structure" anchor="rec-tz-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    +-- recurrence-first
    |  +-- date-time-start?        yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
       +--:(until)
       |  +-- until?        yang:date-and-time
       +--:(count)
          +-- count?        uint32
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...

]]></artwork></figure>

<t>The "recurrence-with-time-zone" grouping augments the "recurrence-first" container
   with the "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>It also augments the "recurrence-first" container with a parameter "duration"
   to allow the time period of the first occurrence to be specified. The
   "duration" also applies to subsequent recurrence instances.</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 title="recurrence-utc-with-date-times Grouping Tree Structure" anchor="rec-utc-dt-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    +-- recurrence-first
    |  +-- date-time-start?   yang:date-and-time
    |  +-- duration?          int32
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
    |  +--:(until)
    |  |  +-- until?        yang:date-and-time
    |  +--:(count)
    |     +-- count?        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:
    ...

]]></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 title="recurrence-time-zone-with-date-times Grouping Tree Structure" anchor="rec-tz-dt-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    +-- recurrence-first
    |  +-- date-time-start?        yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
    |  +--:(until)
    |  |  +-- until?        yang:date-and-time
    |  +--:(count)
    |     +-- count?        uint32
    +-- period* [period-start]
       +-- 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:
    ...

]]></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 title="icalendar-recurrence Grouping Tree Structure" anchor="ical-grp-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  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
    |  +-- date-time-start?        yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- frequency           identityref
    +-- interval?           uint32
    +-- (recurrence-bound)?
    |  +--:(until)
    |  |  +-- until?        yang:date-and-time
    |  +--:(count)
    |     +-- count?        uint32
    +-- period* [period-start]
    |  +-- 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:
    ...

]]></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" Grouping</name>

<t>The "schedule-status" grouping (<xref target="sche-status-tree"/>) defines common parameters
   for scheduling management/status exposure.</t>

<figure title="Schedule Status Grouping Tree Structure" anchor="sche-status-tree"><artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence:
    ...
  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:
    +-- schedule-id?           string
    +-- state?                 identityref
    +-- version?               uint16
    +--ro schedule-type?         identityref
    +--ro last-update?           yang:date-and-time
    +--ro counter?               uint32
    +--ro last-occurrence?       yang:date-and-time
    +--ro upcoming-occurrence?   yang:date-and-time

]]></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. The "identityref" type is used for this
   parameter to allow extensibility in future modules. For example, a "conflict"
   state is valid in scheduling contexts where multiple systems struggle for the
   scheduling of the same property. The conflict may be induced by, e.g., multiple
   entities managing the schedules for the same target component.</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>The current grouping captures common parameters that is 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="features-and-augmentations"><name>Features and Augmentations</name>

<t>The "ietf-schedule" data model defines the recurrence related groupings using
   a modular approach. Basic, intermediate, and advanced representation of recurrence
   groupings are defined, with each reusing the previous one and adding more parameters.
   To allow for different options, two features are defined in the data model:</t>

<t><list style="symbols">
  <t>'basic-recurrence-supported'</t>
  <t>'icalendar-recurrence-supported'</t>
</list></t>

<t><xref target="features"/> provides an example about how that could 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>These groupings 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 anchor="note-and-restrictions"><name>Note and Restrictions</name>

<t>There are some restrictions that need to be followed when using groupings defined
   in "ietf-schedule" yang module:</t>

<t><list style="symbols">
  <t>The instant in time represented by "period-start" <bcp14>MUST</bcp14> be before the
"period-end" for "period-of-time" grouping</t>
  <t>The combination of the day, month, and year represented for date and time
value <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>
  <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 value</t>
  <t>Care must be taken when defining recurrence 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>
  <t>Schedules received with a starting time in the past with respect to
current time <bcp14>SHOULD</bcp14> be ignored</t>
</list></t>

</section>
<section anchor="sec-schedule"><name>The "ietf-schedule" YANG Module</name>

<t>This module imports types defined in <xref target="RFC6991"/>.</t>

<figure><artwork><![CDATA[
<CODE BEGINS> file "ietf-schedule@2024-04-16.yang"
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 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-supported {
    description
      "Indicates that the server supports configuring a basic
       scheduled recurrence.";
  }

  feature icalendar-recurrence-supported {
    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 period {
    base schedule-type;
    description
      "Indicates a period based schedule.";
  }
  
  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 recurrence with an enabled state.";
  }
  identity disabled {
    base schedule-state;
    description
      "Indicates a recurrence with a disabled state.";
  }
  identity out-of-date {
    base schedule-state;
    description
      "Indicates a recurrence with an out-of-date state.";
  }
  
  identity discard-action {
    description
      "Indicates that 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
      "Incldues a set of generic configuration parameters that are
       followed by the entity that supports schedules.

       These parameters apply to all schedules.

       Such parameters are used as guards to prevent, e.g., stale
       configuration.";
    leaf time-zone-identifier {
      type sys:timezone-name;
      description
        "Indicates the identifier for the time zone in a time zone
         database.";
    }
    leaf validity {
      type yang:date-and-time;
      description
        "Specifies the date and time after which a schedule will
         be considered as invalid. This paratemer 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 instance whose first occurrence after 
         this value cannot be accepted by the entity. Specifically, 
         a requested schedule will be rejected if the first 
         occurrence of that new 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 instance whose first occurrence before 
         this value cannot be accepted by the entity. Specifically, 
         a requested schedule will be rejected if the first  
         occurrence of that new 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-start {
      type yang:date-and-time;
      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 {
    description
      "A simple definition of recurrence.";
    container recurrence-first {
      description
        "Specifies the first instance of the recurrence.";
      leaf date-time-start {
        type yang:date-and-time;
        description
          "Defines the instant date and time of the first instance 
           in the recurrence set.";
      }  
    }
    leaf frequency {
      type identityref {
        base frequency-type;
      }
      mandatory true;
      description
        "This parameter is defined to identify 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.";
    }
    choice recurrence-bound {
      description
        "Modes to bound the recurrence rule. If no choice is
         indicated, the recurrence rule is considered to repeat
         forever.";
      case until {
        description
          "This case defines a way that bounds the recurrence
           rule in an inclusive manner.";
        leaf until {
          type yang:date-and-time;
          description
            "This parameter specifies a date and time value to 
             bound 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
          "This case defines the number of occurrences at which
           to range-bound the recurrence.";
        leaf count {
          type uint32;
          description
            "The positive number of occurrences at which to
             range-bound the recurrence.";
        }
      }
    }
  }
  
  grouping recurrence-utc {
    description
      "A simple definition of recurrence with time specified in 
       UTC. This grouping is intended to be machine-friendly.";  
    uses recurrence {
      refine "recurrence-first/date-time-start" {
        description
          "Defines the instant date and time of the first instance 
           in the recurrence set. A UTC format MUST be used.";
      }
      refine "recurrence-bound/until" {
        description
          "This parameter specifies a date and time value to 
           bound the recurrence. If the value specified by this 
           parameter is synchronized with the specified 
           recurrence, it becomes the last instance of the 
           recurrence. A UTC format MUST be used.";
      }
      augment "recurrence-first" {
        description
          "Adds a parameter indicating how long the occurrence 
           lasts.";
        leaf duration {
          type int32;
          units "seconds";
          description
            "When specified, it refers to the duration of each 
             occurrence. The duration is in units of seconds. The 
             exact duration also applies to all the recurrence 
             instance.";
        }      
      }
    }
  }
  
  grouping recurrence-with-time-zone {
    description
      "A simple definition of recurrence that allows the time to
       be specified with a local time and time zone. This grouping
       is intended to be human-friendly.";
    uses recurrence {
      augment "recurrence-first" {
        description
          "Adds parameters indicating how long the occurrence 
           lasts and time zone identifier of the occurrence.";
        leaf duration {
          type duration;
          description
            "When specified, it refers to the duration of the first 
             occurrence. The exact duration also applies to all the 
             recurrence instance.";
        }
        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 
             'date-time-start' and/or 'until' value is neither 
             reported in the format of UTC nor time zone offset to 
             UTC.";    
        }      
      }
    }
  }

  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 union of 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 period 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 union of 
       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 period with date-and-time formats.";
      uses period-of-time;
    }
  }

  grouping icalendar-recurrence {
    description
      "This grouping is defined to identify properties that 
       contain 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
        "A list of seconds within a minute.";
    }
    leaf-list byminute {
      type uint32 {
        range "0..59";
      }
      description
        "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
          "Corredponds 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 is defined to identify common properties of 
       scheduling status.";
    leaf schedule-id {
      type string;
      description
        "The schedule identifier that globally identifies a
         schedule in a device, controller, network, etc. 
         The unicity scope depends on the implementation.";
    }
    leaf state {
      type identityref {
        base schedule-state;
      }
      description
        "The current state of the schedule.";
    }
    leaf version {
      type uint16;
      description
        "The version number of the schedule.";
    }
    leaf schedule-type {
      type identityref {
        base schedule-type;
      }
      config false;
      description
        "The schedule type.";
    }
    leaf last-update {
      type yang:date-and-time;
      config false;
      description
        "The timestamp that the schedule is last updated.";
    }
    leaf counter {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')";
      type uint32;
      config false;
      description
        "The counter of occurrences since the schedule was enabled.
         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
        "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
        "The timestamp of next occurrence.";
    }    
  }
}
<CODE ENDS>
]]></artwork></figure>

</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>

</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>

<figure><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></figure>

</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>

<figure><artwork><![CDATA[
        name:               ietf-schedule
        namespace:          urn:ietf:params:xml:ns:yang:ietf-schedule
        prefix:             schedule
        maintained by IANA: N
        reference:          RFC XXXX
]]></artwork></figure>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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='RFC6241' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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 title='Informative References'>




<reference anchor='I-D.ietf-opsawg-ucl-acl' target='https://datatracker.ietf.org/doc/html/draft-ietf-opsawg-ucl-acl-03'>
   <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='2' month='February' 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 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-03'/>
   
</reference>


<reference anchor='I-D.contreras-opsawg-scheduling-oam-tests' target='https://datatracker.ietf.org/doc/html/draft-contreras-opsawg-scheduling-oam-tests-01'>
   <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='10' month='July' year='2023'/>
      <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 &#x27;oam-unitary-test&#x27; and &#x27;oam-test-sequence&#x27;
   data models to enable on-demand activation of network diagnosis
   procedures.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-contreras-opsawg-scheduling-oam-tests-01'/>
   
</reference>


<reference anchor='I-D.ietf-tvr-schedule-yang' target='https://datatracker.ietf.org/doc/html/draft-ietf-tvr-schedule-yang-00'>
   <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='16' month='April' 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-00'/>
   
</reference>

<reference anchor='RFC8340' target='https://www.rfc-editor.org/info/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' target='https://datatracker.ietf.org/doc/html/draft-ietf-netmod-rfc8407bis-11'>
   <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='18' month='April' 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.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-ietf-netmod-rfc8407bis-11'/>
   
</reference>

<reference anchor='RFC3339' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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='I-D.ietf-tvr-use-cases' target='https://datatracker.ietf.org/doc/html/draft-ietf-tvr-use-cases-09'>
   <front>
      <title>TVR (Time-Variant Routing) Use Cases</title>
      <author fullname='Edward J. Birrane' initials='E. J.' surname='Birrane'>
         <organization>JHU/APL</organization>
      </author>
      <author fullname='Nicolas Kuhn' initials='N.' surname='Kuhn'>
         <organization>Thales Alenia Space</organization>
      </author>
      <author fullname='Yingzhen Qu' initials='Y.' surname='Qu'>
         <organization>Futurewei Technologies</organization>
      </author>
      <author fullname='Rick Taylor' initials='R.' surname='Taylor'>
         <organization>Ori Industries</organization>
      </author>
      <author fullname='Li Zhang' initials='L.' surname='Zhang'>
         <organization>Huawei</organization>
      </author>
      <date day='29' month='February' year='2024'/>
      <abstract>
	 <t>   This document introduces use cases where Time-Variant Routing (TVR)
   computations (i.e. routing computations taking into considerations
   time-based or scheduled changes to a network) could improve routing
   protocol convergence and/or network performance.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-ietf-tvr-use-cases-09'/>
   
</reference>


<reference anchor='I-D.ietf-netmod-eca-policy' target='https://datatracker.ietf.org/doc/html/draft-ietf-netmod-eca-policy-01'>
   <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>




    </references>


<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 as YANG groupings. Note that "grouping"
   does not define any data nodes in the schema tree, the examples illustrated are
   just for the ease of understanding. Only the message body is provided with
   JSON used for encoding <xref target="RFC7951"/>.</t>

<section anchor="the-generic-schedule-params-grouping"><name>The "generic-schedule-params" Grouping</name>

<t><xref target="ex-0"/> indicates 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.</t>

<figure title="Generic Parameters for Schedule Validation" anchor="ex-0"><artwork><![CDATA[
{
  "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>

</section>
<section anchor="the-period-of-time-grouping"><name>The "period-of-time" Grouping</name>

<t>The 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 is encoded as shown in <xref target="ex-1"/>.</t>

<figure title="Simple Start/End Schedule" anchor="ex-1"><artwork><![CDATA[
{
  "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 title="Simple Schedule with Duration" anchor="ex-2"><artwork><![CDATA[
{
  "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 title="Simple Schedule with Time Zone Indication" anchor="ex-3"><artwork><![CDATA[
{
  "period-start": "2025-11-19T02:00:00",
  "time-zone-identifier": "America/Los_Angeles",
  "duration": "P20W"
}
]]></artwork></figure>

</section>
<section anchor="the-recurrence-grouping"><name>The "recurrence" Grouping</name>

<t><xref target="ex-6"/> indicates a recurrence of every 2 days for 10 occurrences, starting
   at 3 p.m. on December 1, 2025 with an offset of -8:00 from UTC:</t>

<figure title="Simple Schedule with Recurrence" anchor="ex-4"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "2025-12-01T15:00:00-08:00:00"
  },
  "frequency": "ietf-schedule:daily",
  "interval": 2,
  "count": 10
}
]]></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 title="Simple Schedule with Recurrence in UTC" anchor="ex-5"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "2025-12-01T08:00:00Z",
    "duration": 3600;
  },
  "frequency": "ietf-schedule:daily",
  "interval": 1,
  "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 title="Simple Schedule with Recurrence with Time Zone Indication" anchor="ex-6"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "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 title="Example of Recurrence With Date Times" anchor="ex-7"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "2025-06-01T09:00:00Z",
  },
  "frequency": "ietf-schedule:daily",
  "interval": 2,
  "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 title="Example of Advanced Recurrence Schedule" anchor="ex-8"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "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 title="Simple iCalendar Recurrence" anchor="ex-9"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "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 title="Example of Advanced iCalendar Recurrence" anchor="ex-10"><artwork><![CDATA[
{
  "recurrence-first": {
  "date-time-start": "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 title="Example of Advanced iCalendar Recurrence with Exceptions" anchor="ex-11"><artwork><![CDATA[
{
  "recurrence-first": {
    "date-time-start": "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 title="Example of a Schedule Status" anchor="ex-12"><artwork><![CDATA[
{
  "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>

<figure><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-supported;
        description
          "Basic recurrence schedule specification, only applies when
           schedule:basic-recurrence-supported feaure is supported.";
        leaf schedule-id {
          type string;
          description
            "The schedule identifier for this recurrence rule.";
        }            
        uses schedule:recurrence;
       }

      container icalendar-recurrence-schedules {
        if-feature schedule:icalendar-recurrence-supported;
        description
          "Basic recurrence schedule specification, only applies when
           schedule:icalendar-recurrence-supported 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></figure>

</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="I-D.ietf-tvr-use-cases"/>.
   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>

<figure><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></figure>

<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 title="Example of Scheduled Link's Bandwidth" anchor="ex-13"><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>
      <date-time-start>2025-12-01T01:00:00Z</date-time-start>
    </recurrence-first>
    <frequency>schedule:daily</frequency>
    <until>2025-12-31T23:59:59Z</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 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, 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>

</section>


  </back>

<!-- ##markdown-source:
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
JlVBlta0okgAfJb8aDA46rX+P9oWvKAq/gAA

-->

</rfc>

