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

module onf-device-group {
  namespace "http://opennetworking.org/aether/device-group";
  prefix dg;

  import ietf-yang-types{ prefix yg; }
  import onf-aether-types { prefix at; }
  import onf-ip-domain{ prefix ipd; }
  import onf-site{ prefix st; }
  import onf-traffic-class{ prefix tc; }

  organization "Open Networking Foundation.";
  contact "Scott Baker";
  description
    "An aether device group represents a list of device IMSIS.
     This list is expressed as a set of ranges,
         [(from_imsi, to_imsi),
          (from_imsi, to_imsi),
          ...].
     Each device group belongs to a site and has associated
     with it an ip-profile that determines the IP address
     and DNS settings that apply to devices within the
     group";

  revision "2021-06-02" {
    description "An Aether Device Group";
    reference "RFC 6087";
  }

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

  container device-group {
    description "The top level container";

    list device-group {
      key "id";
      description
        "List of device groups";

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

      leaf description {
        type at:description;
        description "description of this device group";
      }

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

      list imsis {
        // TODO: imsi-range-from cannot be used as a list index
        key "imsi-id";
        leaf imsi-id {
          type yg:yang-identifier;
          description
              "Id of this imsi-range";
        }
        leaf imsi-range-from {
          type uint64;
          description
              "value of imsi-range-from";
        }
        leaf imsi-range-to {
          type uint64;
          description
              "value of imsi-range-to";
        }
        leaf display-name {
          type string {
              length 1..80;
          }
          description "display name to use in GUI or CLI";
        }
        description
          "List of imsi ranges that comprise this group. It's acceptable for
           a range to degenerate to being a singleton";
      }

      leaf ip-domain {
        type leafref {
          path "/ipd:ip-domain/ipd:ip-domain/ipd:id";
        }
        description
          "Link to ip-domain settings that determine the pool of IP addresses,
           as well as the domain resolver settings to use";
      }

      container device {
        description "Per-device QOS Settings";
        container mbr {
          description "Maximum bitrate";
          leaf uplink {
            type at:bitrate;
            units bps;
            mandatory true;
            description "Per-device MBR uplink data rate in bps";
          }

          leaf downlink {
            type at:bitrate;
            units bps;
            mandatory true;
            description "Per-device MBR downlink data rate in bps";
          }
        }
        leaf traffic-class {
          type leafref {
            path "/tc:traffic-class/tc:traffic-class/tc:id";
          }
          mandatory true;
          description
            "Link to traffic class";
        }
      }

      leaf site {
        type leafref {
          path "/st:site/st:site/st:id";
        }
        mandatory true;
        description
          "Link to site";
      }
    }
  }
}
