// SPDX-FileCopyrightText: 2021 Open Networking Foundation
//
// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0

submodule onf-slice {
  belongs-to onf-enterprise { prefix ent; }

  import ietf-yang-types{ prefix yg; }
  import onf-aether-types{ prefix at; }

  include onf-upf;
  include onf-device-group;
  include onf-application;
  include onf-priority-traffic-rule;

  organization "Open Networking Foundation.";
  contact "Scott Baker";
  description
    "An Aether Slice is
     used to connect devices with applications";

  revision "2022-01-14" {
    description "Refactored as submodule";
    reference "RFC 6020";
  }

  revision "2021-09-10" {
    description "An Aether Slice";
    reference "RFC 6087";
  }

  typedef slice-id {
        type yg:yang-identifier {
            length 1..32;
        }
    description "The typedef for slice-id";
  }

  grouping slice {
    description "The slice grouping";

    list slice {
      key "slice-id";
      description
        "List of Slices";

      leaf slice-id {
        type slice-id;
        description "ID for this slice.";
      }

      uses at:desc-display-name;

      list device-group {
        key "device-group";
        leaf device-group {
          type leafref {
            path "../../../device-group/device-group-id";
          }
          description
            "Link to device group";
        }
        leaf enable {
          type boolean;
          default true;
          description
            "Enable this device group";
        }
        description
          "A list of device groups. Groups will only participate in
           the Slice if the enable field is set to True";
      }

      leaf default-behavior {
        type at:behavior;
        mandatory true;
        description
          "Default behavior if no filter rules match";
      }

      list filter {
        key "application";
        leaf application {
          type leafref {
            path "../../../../application/application-id";
          }
          mandatory true;
          description
            "Link to application";
        }
        leaf priority {
          type at:priority;
          default 0;
          description
            "Priority of this application";
        }
        leaf allow {
          type boolean;
          default true;
          description
            "Allow or deny this application";
        }
        description
          "A list of applications to allow and/or deny. Rules are executed in
           priority order. The first rule to match will determine the fate
           of the packet.";
      }

      leaf upf {
        type leafref {
          path "../../upf/upf-id";
        }
        description
          "Link to user plane that implements this vcf";
      }

      // the following are populated from the template
      leaf sst {
        type at:sst;
        mandatory true;
        description "Slice/Service type. Immutable.";
      }

      leaf sd {
        type at:sd;
        mandatory true;
        description "Slice differentiator. Immutable.";
      }

      container mbr {
        description "Per slice Maximum Bit Rate";
        leaf uplink {
          type at:bitrate;
          units bps;
          description "Per-Slice MBR uplink data rate in bps";
        }

        leaf downlink {
          type at:bitrate;
          units bps;
          description "Per-Slice MBR downlink data rate in bps";
        }

        leaf uplink-burst-size {
          type at:burst;
          units bytes;
          description "Per-Slice Uplink burst size";
        }

        leaf downlink-burst-size {
          type at:burst;
          units bytes;
          description "Per-Slice Downlink burst size";
        }
      }

      // end of items populated from the template
      uses priority-traffic-rule;

    }
  }
}
