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

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

  import template{ prefix vt; }
  import upf { prefix upf; }
  import ap-list{ prefix apl; }
  import application{ prefix app; }
  import aether-types{ prefix at; }
  import device-group{ prefix dg; }
  import traffic-class{ prefix tc; }
  import ietf-yang-types{ prefix yg; }
  import enterprise{ prefix ent; }

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

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

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

  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 application {
        key "application";
        leaf application {
          type leafref {
            path "/app:application/app:application/app:id";
          }
          mandatory true;
          description
            "Link to application";
        }
        leaf allow {
          type boolean;
          default true;
          description
            "Allow or deny this application";
        }
        description
          "An ordered list of applications to allow and deny. The deny rules
           will be executed first, followed by the allow rules. The first rule
           to match is returned. An implicit DENY ALL lies at the end.";
      }

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

      leaf ap {
        type leafref {
          path "/apl:ap-list/apl:ap-list/apl:id";
        }
        description
          "Link to access-point list";
      }

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

      leaf uplink {
        type uint32;
        description "Uplink data rate in mbps";
      }

      leaf downlink {
        type uint32;
        description "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
    }
  }
}
