// 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";
      }
    }
  }
}
