// SPDX-FileCopyrightText: 2021 Open Networking Foundation
//
// SPDX-License-Identifier: Apache-2.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";
      }
    }
  }
}
