// SPDX-FileCopyrightText: 2021 Open Networking Foundation
//
// SPDX-License-Identifier: Apache-2.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
    }
  }
}
