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

module aether-subscriber {
  namespace "http://opennetworking.org/aether/subscriber";
  prefix sub;

  import apn-profile{ prefix apn; }
  import qos-profile{ prefix qos; }
  import up-profile{ prefix up; }
  import access-profile{ prefix ap; }
  import security-profile{ prefix sec; }
  import enterprise{ prefix ent; }
  import ietf-yang-types{ prefix ietf; }

  organization "Open Networking Foundation.";
  contact "Scott Baker";
  description "To generate JSON from this use command
    pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
    Copied from YangUIComponents project";

  revision "2020-10-22" {
    description "An Aether Subscriber";
    reference "RFC 6087";
  }

  typedef mcc {
      type uint32 {
        range 0..999;
      }
    description "The typedef for mcc";
  }

  typedef mnc {
      type uint32 {
        range 0..999;
      }
    description "The typedef for mnc";
  }

  typedef tac {
      type uint32 {
        range 0..99999999;
      }
    description "The typedef for tac";
  }

  container subscriber {
    description "The top level container";

    list ue {
      key "id";
      description
        "List of subscriber devices";

      leaf id {
	type ietf:uuid;
        description "identifier for this subscriber, typically a UUID";
      }

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

      choice imsi {
        case wildcard {
          leaf imsi-wildcard {
            type string {
              length 1..15;
            }
            description "leaf for imsi-wildcard";
          }
        }
        case range {
          leaf imsi-range-from {
            type uint64;
            description "leaf for imsi-range-from";
          }
          leaf imsi-range-to {
            type uint64;
            description "leaf for imsi-range-to";
          }
        }
        description "The choice for imsi";
      }

      container serving-plmn {
        leaf mcc {
          type mcc;
          description "mobile country code";
        }
        leaf mnc {
          type mnc;
          description "mobile network code";
        }
        leaf tac {
          type tac;
          description "type allocation code";
        }
        description "The container for serving-plmn";
      }

      leaf requested-apn {
        type string {
            length 0..31;
        }
        description "requested access point name";
      }

      leaf priority {
        type uint32 {
          range 0..1000;
        }
        default 0;
        description
          "Priority for this subscriber range";
      }

      leaf enabled {
        type boolean;
        default false;
        description
          "Enable or disable this ue";
      }

      leaf enterprise {
        type leafref {
          path "/ent:enterprise/ent:enterprise/ent:id";
        }
        description
          "Link to enterprise that owns this UE range";
      }

      container profiles {
        leaf apn-profile {
          type leafref {
            path "/apn:apn-profile/apn:apn-profile/apn:id";
          }
          description
            "Link to apn profile";
        }
        leaf up-profile {
          type leafref {
            path "/up:up-profile/up:up-profile/up:id";
          }
          description
            "Link to user plane profile";
        }
        leaf qos-profile {
          type leafref {
            path "/qos:qos-profile/qos:qos-profile/qos:id";
          }
          description
            "Link to qos profile";
        }
        list access-profile {
          key "access-profile";
          leaf access-profile {
            type leafref {
              path "/ap:access-profile/ap:access-profile/ap:id";
            }
            description
                "Link to access profile";
          }
          leaf allowed {
            type boolean;
            default true;
            description
              "Allow or disallow this ue to use this access profile";
          }
	  description "The list for access-profile";
        }
        leaf security-profile {
          type leafref {
            path "/sec:security-profile/sec:security-profile/sec:id";
          }
          description
            "Link to security profile";
        }
        description "The container for profiles";
      }
    }
  }
}
