 module actn-ietf-schedule {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:actn-ietf-schedule";

     prefix "sch";
     import yrt-ietf-yang-types {
       prefix "yang";
     }

     organization "TBD";
     contact "TBD";
     description
       "The model allows time scheduling parameters to be specified.";

     revision "2017-03-06" {
       description "Initial revision";
       reference "TBD";
     }

     /*
      * Typedefs
      */
     typedef operation {
       type enumeration {
         enum configure {
           description
           "Create the configuration data.";
         }
         enum deconfigure {
           description
           "Remove the configuration data.";
         }
         enum set {
           description
           "Set the specified configuration data.";
         }
         enum reset {
           description
           "Revert the specified configuration data back to the
            original value.";
         }
       }
       description "Operation type.";
     }
     /*
      * Groupings
      */

     grouping schedule-config-attributes {
       description
         "A group of attributes for a schedule.";

       leaf inclusive-exclusive {
         type enumeration {
           enum inclusive {
             description
               "The schedule element is inclusive, i.e., the schedule
                specifies the time at which the element is enabled.";
           }
           enum exclusive {
             description
               "The schedule element is exclusive. i.e., the schedule
                specifies the time at which the element is disabled.";
           }
         }
         default "inclusive";
         description
           "Whether the list item is inclusive or exclusive.";
       }
       leaf start {
         type yang:date-and-time;
         description "Start time.";
       }
       leaf schedule-duration {
         type string {
           pattern
             'P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?';
         }
         description "Schedule duration in ISO 8601 format.";
       }
       leaf repeat-interval {
         type string {
           pattern
             'R\d*/P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?'
             + '(\d+S)?';
         }
         description "Repeat interval in ISO 8601 format.";
       }
     } // schedule-config-attributes

     grouping schedule-config-notification {
       description
         "A group of attributes for a schedule notification.";

/****TODO: FIXME: cannot handle notification as child under a container??
       notification execution {
         description
           "Notification event for an execution performed on a target
            object.";
         leaf operation {
           type operation;
           mandatory true;
           description "Operation type.";
         }
         leaf datetime {
           type yang:date-and-time;
           description
             "The date and time when the execution was performed.";
         }
         anydata results {
           description
             "This chunk of data contains the results of the execution
              performed on the target object. The results are the same
              or equivalent to the contents of a <rpc-reply> message,
              Because of the nature of such a target execution, a
              <rpc-reply> message is not used to return the execution
              results. Instead, this notification is used to serve
              the same purpose.";
         }
       }
***TODO: FIXME***/
     } // schedule-config-notification

     grouping schedule-state-attributes {
       description
         "State attributes for a schedule.";
       container future-executions {
         description
           "The state information of the nexte scheduled event.";
         list execution {
           key "start";
           description
             "List of scheduled future executions.";
           leaf start {
             type yang:date-and-time;
             description "Start time.";
           }
           leaf duration {
             type string {
               pattern
                 'P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?';
             }
             description "Schedule duration in ISO 8601 format.";
           }
           leaf operation {
             type operation;
             description "Operation type.";
           }
         } // event
       } // future-events
     } // schedule-state-attributes

     grouping schedules {
       description
         "A list of schedules defining when a particular
          configuration takes effect.";
       container schedules {
         description
           "Container of a schedule list defining when a particular
            configuration takes effect.";
         list schedule {
           key "schedule-id";
           description "A list of schedule elements.";
           leaf schedule-id {
             type uint32;
             description "Identifies the schedule element.";
           }
           uses schedule-config-attributes;
         }
       }
     } // schedules

     /*
      * Configuration data and operational state nodes
      */
     container configuration-schedules {
       description
         "Serves as top-level container for a list of configuration
          schedules.";
       list target {
         key "object";
         description
           "A list of targets that configuration schedules are
            applied.";
         leaf object {
           type yang:xpath1.0;
           description
             "Xpath defining the data items of interest.";
         }
         leaf operation {
           type operation;
           default "configure";
           description
             "Operation type.";
         }

         anydata data-value {
           description
             "The data value applied to the leaf data node
              specified by data-objects.
              The format of the data value depends on the value of the
              leaf operation defined above:
              configure:   data-value is the sub-tree added to the
                           target object;
              deconfigure: data-value is the child to be deleted from
                           the target object;
              set:         the target object MULST be a leaf, and
                           data-value is the new value to be set to
                           the target object;
              reset:       data-value is ignored.";
         }

         uses schedules;
         container state {
           config false;
           description
             "Operational state data.";
           uses schedule-state-attributes;
         } // state

         uses schedule-config-notification;
       } // target
     } // configuration-schedules
   }
