// 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-template{ prefix vt; }
  import onf-traffic-class{ prefix tc; }
  import onf-upf { prefix upf; }

  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 template {
        type leafref {
          path "/vt:template/vt:template/vt:id";
        }
        description
          "Link to user vcs template that was used to initialize
           this VCS";
      }

      list filter {
        key "application";
        leaf application {
          type leafref {
            path "/app:application/app:application/app:id";
          }
          mandatory true;
          description
            "Link to application";
        }
        leaf priority {
          type uint8;
          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";
      }

      // 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 device {
        description "Per-device QOS Settings";
        container mbr {
          description "Maximum bitrate";
          leaf uplink {
            type at:bitrate;
            units bps;
            description "Per-device mbr uplink data rate in mbps";
          }

          leaf downlink {
            type at:bitrate;
            units bps;
            description "Per-device mbr downlink data rate in mbps";
          }
        }
      }

      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 mbps";
          }

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

      leaf traffic-class {
        type leafref {
          path "/tc:traffic-class/tc:traffic-class/tc:id";
        }
        mandatory true;
        description
          "Link to traffic class";
      }
      // end of items populated from the template
    }
  }
}
