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

module service-rule {
  namespace "http://opennetworking.org/aether/service-rule";
  prefix sr;

  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 "2021-03-04" {
    description "An Aether Service Rule";
    reference "RFC 6087";
  }

  typedef service-rule-id {
        type string {
            length 1..32;
        }
    description "The typedef for service-rule-id";
  }

  container service-rule {
    description "The top level container";

    list service-rule {
      key "id";
      description
        "List of service rules";

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

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

      leaf charging-rule-name {
        type string {
            length 1..80;
        }
        description "name of charging rule";
      }

      container qos {
        leaf qci {
          type uint32 {
            range 0..85;
          }
          default 9;
          description
            "QoS Class Identifier";
        }

        container arp {
          leaf priority {
            type uint32 {
              range 0..15;
            }
            default 0;
            description
              "Priority";
          }
          leaf preemption-capability {
            type boolean;
            default true;
            description
              "True if a bearer with lower priority should be dropped";
          }
          leaf preemption-vulnerability {
            type boolean;
            default true;
            description
              "This bearer may be dropped for a bearer with higher priority";
          }
          description "Evolved-ARP";
        }

        container maximum-requested-bandwidth {
          leaf uplink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Upstream maximum requested bandwidth";
          }
          leaf downlink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Downstream maximum requested bandwidth";
          }
          description "The container for maximum-requested-bandwidth";
        }

        container guaranteed-bitrate {
          leaf uplink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Upstream guaranteed bitrate";
          }
          leaf downlink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Downstream guaranteed bitrate";
          }
          description "The container for guaranteed-bitrate";
        }

        container aggregate-maximum-bitrate {
          leaf uplink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Upstream aggregate maximum bitrate";
          }
          leaf downlink {
            type uint32 {
              range 0..4294967295;
            }
            units bps;
            default 0;
            description
              "Downstream aggregate maximum bitrate";
          }
          description "The container for aggregate-maximum-bitrate";
        }
        description "The container for qos";
      }

      container flow {
        leaf specification {
          type string {
            length 1..1024;
          }
          description "specification of this flow";
        }
        description "The container for flow";
      }

      leaf description {
        type string {
          length 1..100;
        }
        description "description of this rule";
      }
    }
  }
}
