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

module onf-vcs {
  namespace "http://opennetworking.org/aether/vcs";
  prefix sl;

  import ietf-yang-types{ prefix yg; }
  import onf-aether-types{ prefix at; }
  import onf-application{ prefix app; }
  import onf-device-group{ prefix dg; }
  import onf-enterprise{ prefix ent; }
  import onf-upf { prefix upf; }
  import onf-site{ prefix st; }

  organization "Open Networking Foundation.";
  contact "Scott Baker";
  description
    "An Aether Virtual Cellular Service (VCS) is
     used to connect devices with applications";

  revision "2021-09-10" {
    description "An Aether Virtual Cellular Service";
    reference "RFC 6087";
  }

  typedef vcs-id {
        type yg:yang-identifier {
            length 1..32;
        }
  }

  container vcs {
    description "The top level container";

    list vcs {
      key "id";
      description
        "List of virtual cellular services";

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

      leaf display-name {
        type string {
            length 1..80;
        }
        description "display name to use in GUI or CLI";
      }

      list device-group {
        key "device-group";
        leaf device-group {
          type leafref {
            path "/dg:device-group/dg:device-group/dg: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 VCS 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 "/app:application/app:application/app: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/upf:upf/upf:id";
        }
        description
          "Link to user plane that implements this vcf";
      }

      leaf description {
        type at:description;
        description "description of this vcs";
      }

      leaf enterprise {
        type leafref {
          path "/ent:enterprise/ent:enterprise/ent:id";
        }
        mandatory true;
        description
          "Link to enterprise that owns this VCS";
      }

      leaf site {
        type leafref {
          path "/st:site/st:site/st:id";
        }
        description
          "Link to site where this VCS is deployed";
        mandatory true;
      }

      // 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 slice {
        description "Per-Slice QOS Settings";
        container mbr {
          description "Maximum bitrate";
          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
    }
  }
}
