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

module onf-site {
  namespace "http://opennetworking.org/aether/site";
  prefix st;

  import ietf-inet-types { prefix inet; }
  import ietf-yang-types{ prefix yg; }
  import onf-aether-types{ prefix at; }
  import onf-enterprise{ prefix ent; }

  organization "Open Networking Foundation.";
  contact "Scott Baker";
  description
    "An Aether site is a location where resources are deployed.";

  revision "2021-09-10" {
    description "An Aether Site.";
    reference "RFC 6087";
  }

  typedef site-id {
        type yg:yang-identifier {
            length 1..32;
        }
  }

  container site {
    description "The top level container";

    list site {
      key "id";
      description
        "List of site";

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

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

      list small-cell {
        key "small-cell-id";
        leaf small-cell-id {
          type yg:yang-identifier;
          description
            "Id of small cell";
        }
        leaf address {
          type inet:host;
          description
            "Address of small cell";
        }
        leaf tac {
          type at:tac;
          mandatory true;
          description
              "Type Allocation Code";
        }
        leaf enable {
          type boolean;
          default true;
          description
            "Enable this small cell";
        }
        leaf display-name {
          type string {
              length 1..80;
          }
          description "display name to use in GUI or CLI";
        }
        description
          "List of small cell addresses";
      }

      container monitoring {
        leaf edge-cluster-prometheus-url {
          type inet:uri;
          description
            "URL of edge cluster prometheus";
        }
        leaf edge-monitoring-prometheus-url {
          type inet:uri;
          description
            "URL of monitoring prometheus";
        }
        list edge-device {
          key "edge-device-id";
          leaf edge-device-id {
            type yg:yang-identifier;
            description
              "Id of edge monitoring device";
          }
          leaf display-name {
            type string {
                length 1..80;
            }
            description "display name to use in GUI or CLI";
          }
          leaf description {
            type at:description;
            description "description of this site";
          }
          description
            "List of edge monitoring devices";
        }
      }

      leaf enterprise {
        type leafref {
          path "/ent:enterprise/ent:enterprise/ent:id";
        }
        description
          "Link to enterprise that owns this site";
        mandatory true;
      }

      container imsi-definition {
        leaf mcc {
          type at:mcc;
          description "mobile country code";
          mandatory true;
        }
        leaf mnc {
          type at:mnc;
          description "mobile network code";
          mandatory true;
        }
        leaf enterprise {
          type at:ent;
          description "enterprise-specific identifier";
          mandatory true;
        }
        leaf format {
          type string {
            length 15;
          }
          mandatory true;
          description "IMSI format specifier, describes how fields are packed into an IMSI. Must be exactly 15 characters long. For example, CCCNNNEEESSSSSS.";
          // Format specifiers:
          //   C = MCC
          //   N = MNC
          //   E = Enterprise
          //   0 = Forced Zero
          //   S = Subscriber ID
          // default is
          //   3 digit MCC
          //   3 digit MNC
          //   3 digit enterprise ID
          //   5 digit subscriber ID
        }
      }

      leaf description {
        type at:description;
        description "description of this site";
      }
    }
  }
}
