// 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;
        }
    description "The typedef for site-id";
  }

  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";
        }
        description
            "container for monitoring";
      }

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

      container imsi-definition {
        leaf mcc {
          type at:mcc;
          mandatory true;
          description "mobile country code";
        }
        leaf mnc {
          type at:mnc;
          mandatory true;
          description "mobile network code";
        }
        leaf enterprise {
          type at:ent;
          mandatory true;
          description "enterprise-specific identifier";
        }
        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
        }
        description "container for imsi-defination";
      }

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