junos-nfx-conf-policy-options

Junos policy-options configuration module

  • Version: 2019-01-01

    junos-nfx-conf-policy-options@2019-01-01


    
      module junos-nfx-conf-policy-options {
    
        yang-version 1;
    
        namespace
          "http://yang.juniper.net/junos-nfx/conf/policy-options";
    
        prefix jc-policy-options;
    
        import junos-common-ddl-extensions {
          prefix junos;
          revision-date "2019-01-01";
        }
        import junos-common-types {
          prefix jt;
          revision-date "2019-01-01";
        }
        import junos-nfx-conf-root {
          prefix jc;
          revision-date "2019-01-01";
        }
    
        organization "Juniper Networks, Inc.";
    
        contact "yang-support@juniper.net";
    
        description
          "Junos policy-options configuration module";
    
        revision "2019-01-01" {
          description "Junos: 21.3R1.9";
        }
    
    
        augment /jc:configuration {
          uses policy-options-group;
        }
    
        augment /jc:configuration/jc:groups {
          uses policy-options-group;
        }
    
        grouping policy-options-group {
          container policy-options {
            description
              "Policy option configuration";
            uses juniper-policy-options;
          }  // container policy-options
        }  // grouping policy-options-group
    
        grouping juniper-policy-options {
          description
            "Define a redundancy policy";
          uses apply-advanced;
    
          container satellite-policies {
            description
              "Satellite Policy configuration";
            uses satellite-policy-options;
          }  // container satellite-policies
    
          list prefix-list {
            key "name";
            ordered-by user;
            description
              "Define a named set of address prefixes";
            leaf name {
              type string;
              description "Prefix list name";
            }
    
            uses apply-advanced;
    
            list prefix-list-item {
              key "name";
              uses prefix_list_items;
            }  // list prefix-list-item
    
            leaf apply-path {
              type string;
              description
                "Apply IP prefixes from a configuration statement";
            }
          }  // list prefix-list
    
          list mac-list {
            key "name";
            ordered-by user;
            description
              "Define a named set of mac addresses";
            leaf name {
              type string;
              description
                "MAc Address list name";
            }
    
            uses apply-advanced;
    
            list mac-addr-list-item {
              key "name";
              uses mac_addr_list_items;
            }  // list mac-addr-list-item
          }  // list mac-list
    
          list vsi-policy {
            key "name";
            ordered-by user;
            description
              "Define a named set of VSI policies";
            leaf name {
              type string;
              description "VSI policy name";
            }
    
            uses apply-advanced;
    
            container from {
              description
                "Conditions to match the VSI policy";
              uses apply-advanced;
    
              list vsi-manager {
                key "vsi-manager-id vsi-type vsi-version vsi-instance";
                ordered-by user;
                description "VSI manager";
                leaf vsi-manager-id {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description "VSI manager ID";
                }
    
                leaf vsi-type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777216";
                    }
                  }
                  description "VSI type";
                }
    
                leaf vsi-version {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description "VSI version";
                }
    
                leaf vsi-instance {
                  type string;
                  description "VSI instance";
                }
    
                uses apply-advanced;
              }  // list vsi-manager
            }  // container from
    
            container then {
              description
                "Actions to take if 'from' conditions match";
              uses apply-advanced;
    
              leaf filter {
                junos:must "("firewall family ethernet-switching filter $$")";
                junos:must-message "filter should be defined under 'firewall family ethernet-switching filter'";
                type string;
                description "Filter name";
              }
            }  // container then
          }  // list vsi-policy
    
          leaf skip-then-actions {
            type empty;
            description
              "Skip 'then' actions and allow route actions in 'from'";
          }
    
          list route-filter-list {
            key "name";
            ordered-by user;
            description
              "Define a named set of route-filter address prefixes";
            leaf name {
              type string;
              description
                "Route filter list name";
            }
    
            uses apply-advanced;
    
            list rf_list {
              key "address choice-ident choice-value";
              ordered-by user;
              uses route_filter_list_items;
            }  // list rf_list
          }  // list route-filter-list
    
          list source-address-filter-list {
            key "name";
            ordered-by user;
            description
              "Define a named set of source address filter address prefixes";
            leaf name {
              type string;
              description
                "Source address filter list name";
            }
    
            uses apply-advanced;
    
            list saf_list {
              key "address choice-ident choice-value";
              ordered-by user;
              uses source_address_filter_list_items;
            }  // list saf_list
          }  // list source-address-filter-list
    
          list policy-statement {
            key "name";
            description "Routing policy";
            leaf name {
              type string;
              description
                "Name to identify a policy filter";
            }
    
            uses apply-advanced;
    
            container defaults {
              description
                "Policy default behaviour";
              uses apply-advanced;
    
              container route-filter {
                description
                  "Set route filter behaviour";
                choice scope-choice {
                  leaf no-walkup {
                    type empty;
                    description
                      "Route filter walk up disable";
                  }
                  leaf walkup {
                    type empty;
                    description
                      "Route filter walk up enable";
                  }
                }  // choice scope-choice
              }  // container route-filter
            }  // container defaults
    
            list term {
              key "name";
              ordered-by user;
              description "Policy term";
              leaf name {
                type string;
              }
    
              uses apply-advanced;
    
              container from {
                description
                  "Conditions to match the source of a route";
                uses apply-advanced;
    
                leaf instance {
                  type string;
                  description
                    "Routing protocol instance";
                }
    
                leaf instance-any {
                  type empty;
                  description
                    "Any routing protocol instance";
                }
    
                leaf-list instance-list {
                  type string;
                  description
                    "A list of routing protocol instances";
                }
    
                leaf-list igp-instance {
                  type string;
                  description "IGP instance";
                }
    
                leaf family {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-vpn" {
                      value 1;
                      description
                        "IPv4-VPN family";
                    }
                    enum "inet6" {
                      value 2;
                      description "IPv6 family";
                    }
                    enum "inet6-vpn" {
                      value 3;
                      description
                        "IPv6-VPN family";
                    }
                    enum "iso-vpn" {
                      value 4;
                      description
                        "ISO-VPN family";
                    }
                    enum "iso" {
                      value 5;
                      description "ISO family";
                    }
                    enum "evpn" {
                      value 6;
                      description "EVPN family";
                    }
                    enum "inet-mvpn" {
                      value 7;
                      description
                        "IPv4 Multicast VPN family";
                    }
                    enum "inet6-mvpn" {
                      value 8;
                      description
                        "IPv6 Multicast VPN family";
                    }
                    enum "inet-mdt" {
                      value 9;
                      description
                        "IPv4 MDT Signaling family";
                    }
                    enum "route-target" {
                      value 10;
                      description
                        "Local route target VPN family";
                    }
                    enum "traffic-engineering" {
                      value 11;
                      description
                        "Traffic Engineering family";
                    }
                    enum "inet-srte" {
                      value 12;
                      description
                        "IPv4 srtte family";
                    }
                    enum "inet6-srte" {
                      value 13;
                      description
                        "IPv6 srte family";
                    }
                  }
                }
    
                leaf-list protocol {
                  type enumeration {
                    enum "aggregate" {
                      value 0;
                      description
                        "Aggregate routes";
                    }
                    enum "bgp" {
                      value 1;
                      description "BGP";
                    }
                    enum "direct" {
                      value 2;
                      description
                        "Directly connected routes";
                    }
                    enum "dvmrp" {
                      value 3;
                      description
                        "Distance Vector Multicast Routing Protocol";
                    }
                    enum "isis" {
                      value 4;
                      description
                        "Intermediate System-to-Intermediate System";
                    }
                    enum "esis" {
                      value 5;
                      description
                        "End System-to-Intermediate System";
                    }
                    enum "l-isis" {
                      value 6;
                      description
                        "Labelled ISIS";
                    }
                    enum "l2circuit" {
                      value 7;
                      description
                        "Layer 2 circuits";
                    }
                    enum "l2vpn" {
                      value 8;
                      description
                        "Layer 2 MPLS virtual private networks";
                    }
                    enum "local" {
                      value 9;
                      description
                        "Local system addresses";
                    }
                    enum "ospf" {
                      value 10;
                      description
                        "Open Shortest Path First";
                    }
                    enum "ospf2" {
                      value 11;
                      description
                        "Open Shortest Path First Version 2";
                    }
                    enum "ospf3" {
                      value 12;
                      description
                        "Open Shortest Path First Version 3";
                    }
                    enum "l-ospf" {
                      value 13;
                      description
                        "Labelled OSPF";
                    }
                    enum "pim" {
                      value 14;
                      description
                        "Protocol Independent Multicast";
                    }
                    enum "rip" {
                      value 15;
                      description
                        "Routing Information Protocol";
                    }
                    enum "ripng" {
                      value 16;
                      description
                        "Routing Information Protocol next generation";
                    }
                    enum "static" {
                      value 17;
                      description
                        "Statically defined addresses";
                    }
                    enum "arp" {
                      value 18;
                      description
                        "Addresses learned from ARP";
                    }
                    enum "frr" {
                      value 19;
                      description
                        "Addresses created by Host Fast Re-route";
                    }
                    enum "mpls" {
                      value 20;
                      description
                        "Multiprotocol Label Switching";
                    }
                    enum "ldp" {
                      value 21;
                      description
                        "Label Distribution Protocol";
                    }
                    enum "rsvp" {
                      value 22;
                      description
                        "Resource Reservation Protocol";
                    }
                    enum "msdp" {
                      value 23;
                      description
                        "Multicast Source Discovery Protocol";
                    }
                    enum "route-target" {
                      value 24;
                      description
                        "Local route target VPN membership";
                    }
                    enum "access" {
                      value 25;
                      description
                        "Access server routes";
                    }
                    enum "access-internal" {
                      value 26;
                      description
                        "Internal routes to directly connected clients";
                    }
                    enum "anchor" {
                      value 27;
                      description
                        "Anchor routes connected to UEs";
                    }
                    enum "bgp-static" {
                      value 28;
                      description
                        "BGP static routes";
                    }
                    enum "vpls" {
                      value 29;
                      description
                        "Virtual Private LAN Service";
                    }
                    enum "evpn" {
                      value 30;
                      description
                        "Ethernet VPN Service";
                    }
                    enum "spring-te" {
                      value 31;
                      description
                        "SPRING Traffic-Engineered";
                    }
                    enum "bgp-ls-epe" {
                      value 32;
                      description
                        "Addresses created by BGP-LS egress TE";
                    }
                    enum "express-segments" {
                      value 33;
                      description
                        "Express-segment routes";
                    }
                    enum "rift" {
                      value 34;
                      description "RIFT routes";
                    }
                    enum
                      "l2-learned-host-routing" {
                      value 35;
                      description
                        "Layer2-learned host routes";
                    }
                    enum "srv6-isis" {
                      value 36;
                      description "SRV6 ISIS";
                    }
                  }
                  ordered-by user;
                  description
                    "Protocol from which route was learned";
                }
    
                leaf rib {
                  type string;
                  description "Routing table";
                }
    
                leaf-list neighbor {
                  type jt:ipaddr;
                  ordered-by user;
                  description
                    "Neighboring router";
                }
    
                leaf-list next-hop {
                  type jt:ipaddr;
                  ordered-by user;
                  description "Next-hop router";
                }
    
                leaf-list interface {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Interface name or address";
                }
    
                leaf area {
                  type jt:areaid;
                  description
                    "OSPF area identifier";
                }
    
                leaf-list as-path {
                  type string;
                  ordered-by user;
                  description
                    "Name of AS path regular expression (BGP only)";
                }
    
                leaf-list as-path-group {
                  type string;
                  ordered-by user;
                  description
                    "Name of AS path group (BGP only)";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                  description
                    "BGP origin attribute";
                }
    
                leaf-list community {
                  type string;
                  ordered-by user;
                  description "BGP community";
                }
    
                leaf level {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "IS-IS level";
                }
    
                container external {
                  presence "enable external";
                  description "External route";
                  uses apply-advanced;
    
                  leaf type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type int32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "OSPF external metric type";
                  }
                }  // container external
    
                leaf bgp-srte-discriminator {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Srte discriminator";
                }
    
                leaf srte-color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Srte color";
                }
    
                leaf programmed {
                  type empty;
                  description
                    "API-programmed route";
                }
    
                leaf validation-database {
                  type enumeration {
                    enum "valid" {
                      value 0;
                      description
                        "Match for valid database validation-state";
                    }
                    enum "invalid" {
                      value 1;
                      description
                        "Match for invalid database validation-state";
                    }
                    enum "unknown" {
                      value 2;
                      description
                        "Match for unknown database validation-state";
                    }
                  }
                  description
                    "Name to identify a validation-state";
                }
    
                list nexthop-weight {
                  key "choice-ident choice-value weight";
                  ordered-by user;
                  description
                    "Weight of the gateway";
                  leaf choice-ident {
                    type enumeration {
                      enum "equal" {
                        value 0;
                      }
                      enum "greater-than" {
                        value 1;
                      }
                      enum "less-than" {
                        value 2;
                      }
                      enum "greater-than-equal" {
                        value 3;
                      }
                      enum "less-than-equal" {
                        value 4;
                      }
                      enum "weight" {
                        value 5;
                      }
                      enum "apply-advanced" {
                        value 6;
                      }
                      enum "weight_type" {
                        value 7;
                      }
                      enum "all-nexthop" {
                        value 8;
                      }
                    }
                  }
    
                  leaf choice-value {
                    type string;
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Weight of the gateway";
                  }
    
                  uses apply-advanced;
    
                  choice weight_type {
                    leaf all-nexthop {
                      type empty;
                      description
                        "All the gateway weight should be matched";
                    }
                  }  // choice weight_type
                }  // list nexthop-weight
    
                leaf metric {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value";
                }
    
                leaf metric2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 2";
                }
    
                leaf metric3 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 3";
                }
    
                leaf metric4 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 4";
                }
    
                leaf-list tag {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description "Tag string";
                }
    
                leaf tag2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag string 2";
                }
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf preference2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Preference value 2";
                }
    
                leaf color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Color (preference) value";
                }
    
                leaf color2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Color (preference) value 2";
                }
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Local preference associated with a route";
                }
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Name of policy to evaluate";
                }
    
                choice lsp-name-type {
                  leaf lsp {
                    junos:must "(".. .. then source-routing-path-template")";
                    junos:must-message "source-routing-path-template is required to configure lsp";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Label switched path name";
                  }
                  leaf lsp-regex {
                    junos:must "(".. .. then source-routing-path-template")";
                    junos:must-message "source-routing-path-template is required to configure lsp-regex";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Label switched path name regular expression";
                  }
                }  // choice lsp-name-type
    
                container source-routing-path {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure source-routing-path in policy";
                  presence
                    "enable source-routing-path";
                  description
                    "Spring-te lsp policy attributes";
                  leaf name-regex {
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Spring-te lsp name regex";
                  }
    
                  leaf dest {
                    type jt:ipaddr;
                    description
                      "Spring-te lsp IPV4/IPV6 destination without color";
                  }
    
                  leaf origin {
                    type jt:ipaddr;
                    description
                      "Spring-te lsp origin address";
                  }
    
                  leaf tunnel-source {
                    type enumeration {
                      enum "pcep" {
                        value 0;
                        description
                          "Spring-te lsp src pcep";
                      }
                      enum "bgp" {
                        value 1;
                        description
                          "Spring-te lsp src bgp";
                      }
                    }
                    description
                      "Spring-te lsp source protocol";
                  }
    
                  leaf route-distinguisher {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Spring-te lsp route distinguisher";
                  }
    
                  leaf color {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Spring-te lsp color";
                  }
                }  // container source-routing-path
    
                list route-filter {
                  key "address choice-ident choice-value";
                  ordered-by user;
                  description
                    "List of routes to match";
                  uses control_route_filter_type;
                }  // list route-filter
    
                list source-address-filter {
                  key "address choice-ident choice-value";
                  ordered-by user;
                  description
                    "List of source addresses to match";
                  uses control_source_address_filter_type;
                }  // list source-address-filter
    
                list prefix-list {
                  key "name";
                  ordered-by user;
                  description
                    "List of prefix-lists of routes to match";
                  uses control_prefix_list_type;
                }  // list prefix-list
    
                list as-path-neighbors {
                  key "list-type list-name";
                  ordered-by user;
                  description
                    "List of peer AS to match";
                  uses control_as_list_type;
                }  // list as-path-neighbors
    
                list as-path-origins {
                  key "list-type list-name";
                  ordered-by user;
                  description
                    "List of originating AS to match";
                  uses control_as_list_type;
                }  // list as-path-origins
    
                list as-path-transits {
                  key "list-type list-name";
                  ordered-by user;
                  description
                    "List of originating AS to match";
                  uses control_as_list_type;
                }  // list as-path-transits
    
                list prefix-list-filter {
                  key "list_name choice-ident choice-value";
                  ordered-by user;
                  description
                    "List of prefix-list-filters to match";
                  uses control_prefix_list_filter_type;
                }  // list prefix-list-filter
    
                list rtf-prefix-list {
                  key "name";
                  ordered-by user;
                  description
                    "List of rtf-prefix-lists of routes to match";
                  uses control_rtf_prefix_list_type;
                }  // list rtf-prefix-list
    
                list route-filter-list {
                  key "name";
                  ordered-by user;
                  description
                    "List of route-filter-lists of routes to match";
                  uses control_route_filter_list_type;
                }  // list route-filter-list
    
                list source-address-filter-list {
                  key "name";
                  ordered-by user;
                  description
                    "List of source-address-filter-lists of routes to match";
                  uses control_source_address_filter_list_type;
                }  // list source-address-filter-list
    
                container multicast-scope {
                  description
                    "Multicast scope to match";
                  choice scope-choice {
                    leaf node-local {
                      type empty;
                      description
                        "Node-local scope";
                    }
                    leaf link-local {
                      type empty;
                      description
                        "Link-local scope";
                    }
                    leaf site-local {
                      type empty;
                      description
                        "Site-local scope";
                    }
                    leaf organization-local {
                      type empty;
                      description
                        "Organization-local scope";
                    }
                    leaf global {
                      type empty;
                      description "Global scope";
                    }
                    leaf scope_value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 15";
                        }
                      }
                      description "Scope value";
                    }
                  }  // choice scope-choice
    
                  choice scope-operator {
                    leaf orhigher {
                      type empty;
                      description
                        "Match higher values";
                    }
                    leaf orlower {
                      type empty;
                      description
                        "Match lower values";
                    }
                  }  // choice scope-operator
                }  // container multicast-scope
    
                leaf aggregate-contributor {
                  type empty;
                  description
                    "Match more specifics of an aggregate";
                }
    
                leaf state {
                  type enumeration {
                    enum "active" {
                      value 0;
                      description "Active route";
                    }
                    enum "inactive" {
                      value 1;
                      description
                        "Inactive route";
                    }
                  }
                  description "Route state";
                }
    
                leaf-list tunnel-type {
                  type enumeration {
                    enum "gre" {
                      value 0;
                      description "GRE tunnel";
                    }
                    enum "udp" {
                      value 1;
                      description "UDP tunnel";
                    }
                    enum "ipip" {
                      value 2;
                      description "IPIP tunnel";
                    }
                  }
                  ordered-by user;
                  description "Tunnel type";
                }
    
                leaf route-type {
                  type enumeration {
                    enum "internal" {
                      value 0;
                      description
                        "Internal route";
                    }
                    enum "external" {
                      value 1;
                      description
                        "External route";
                    }
                  }
                  description "Route type";
                }
    
                leaf-list nlri-route-type {
                  junos:must "((".. family evpn" || (".. family inet-mvpn" || ".. family inet6-mvpn")))";
                  junos:must-message "nlri-route-type is only valid with a family qualifier such as evpn, inet-mvpn, inet6-mvpn, or other                      family that supports a route type";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10";
                    }
                  }
                  ordered-by user;
                  description
                    "Route type from NLRI";
                }
    
                leaf-list evpn-tag {
                  junos:must "(".. family evpn")";
                  junos:must-message "evpn-tag is only valid with a family qualifier evpn";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  ordered-by user;
                  description
                    "Tag in EVPN Route";
                }
    
                leaf-list evpn-esi {
                  junos:must "(".. family evpn")";
                  junos:must-message "evpn-esi is only valid with a family qualifier evpn";
                  type string;
                  ordered-by user;
                  description
                    "ESI in EVPN Route";
                }
    
                list mac-filter-list {
                  junos:must "(".. family evpn")";
                  junos:must-message "mac-filter is only valid with a family qualifier evpn";
                  key "name";
                  ordered-by user;
                  description
                    "List of mac-filter-list macs to match";
                  uses control_mac_address_filter_list_type;
                }  // list mac-filter-list
    
                leaf evpn-mac-route {
                  junos:must "(".. family evpn")";
                  junos:must-message "evpn-mac-route is only valid with a family qualifier evpn";
                  type enumeration {
                    enum "mac-only" {
                      value 0;
                      description "MAC route";
                    }
                    enum "mac-ipv4" {
                      value 1;
                      description
                        "MAC IPV4 route";
                    }
                    enum "mac-ipv6" {
                      value 2;
                      description
                        "MAC IPV6 route";
                    }
                  }
                  description
                    "EVPN Mac Route type";
                }
    
                leaf next-hop-type {
                  type enumeration {
                    enum "merged" {
                      value 0;
                      description
                        "Merged next hop";
                    }
                  }
                  description "Next-hop type";
                }
    
                leaf-list condition {
                  type string;
                  ordered-by user;
                  description
                    "Condition to match on";
                }
    
                list community-count {
                  key "name";
                  ordered-by user;
                  description
                    "Number of BGP communities";
                  uses community_count_type;
                }  // list community-count
    
                list as-path-unique-count {
                  key "name";
                  ordered-by user;
                  description
                    "Number of unique BGP ASes excluding confederations";
                  uses as-path-unique-count-type;
                }  // list as-path-unique-count
    
                list as-path-calc-length {
                  key "name";
                  ordered-by user;
                  description
                    "Number of BGP ASes excluding confederations";
                  uses as-path-calc-length-type;
                }  // list as-path-calc-length
    
                container traffic-engineering {
                  junos:must "(!(".. family"))";
                  junos:must-message "traffic-engineering family implied";
                  presence
                    "enable traffic-engineering";
                  description
                    "Traffic-Engineering related parameters";
                  uses apply-advanced;
    
                  leaf-list protocol {
                    type enumeration {
                      enum "direct" {
                        value 0;
                        description
                          "Directly originated";
                      }
                      enum "ospf" {
                        value 1;
                        description
                          "OSPF originated";
                      }
                      enum "isis-level-1" {
                        value 2;
                        description
                          "ISIS level-1 originated";
                      }
                      enum "isis-level-2" {
                        value 3;
                        description
                          "ISIS level-2 originated";
                      }
                      enum "static" {
                        value 4;
                        description
                          "Statically originated";
                      }
                      enum "unknown" {
                        value 5;
                        description
                          "Originated by unknown sources";
                      }
                    }
                    ordered-by user;
                    description
                      "Protocol that originated the entry";
                  }
    
                  container node {
                    junos:must "(!((".. link" || (".. ipv4-prefix" || ".. ipv6-prefix"))))";
                    junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                    presence "enable node";
                    description
                      "Node-related parameters";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf node-type {
                      type enumeration {
                        enum "router" {
                          value 0;
                          description
                            "Real node";
                        }
                        enum "pseudo-node" {
                          value 1;
                          description
                            "Pseudo-node";
                        }
                      }
                      description
                        "Real or pseudo-node";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the router-id against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "ISO address of the node";
                    }
                  }  // container node
    
                  container ipv4-prefix {
                    junos:must "(!((".. link" || ".. node")))";
                    junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                    presence
                      "enable ipv4-prefix";
                    description
                      "IPV4 prefix-related parameters";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the router-id against";
                    }
    
                    leaf prefix {
                      type jt:ipprefix;
                      description
                        "IP prefix to match against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "ISO address of the node";
                    }
                  }  // container ipv4-prefix
    
                  container ipv6-prefix {
                    junos:must "(!((".. link" || (".. node" || (".. ipv4-prefix" || ".. srv6-sid")))))";
                    junos:must-message "Link/prefix/node/srv6-sid parameters cannot be configured at the same time";
                    presence
                      "enable ipv6-prefix";
                    description
                      "IPV6 prefix related parameters";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "IPv6 prefix to match the router-id against";
                    }
    
                    leaf prefix {
                      type jt:ipv6prefix;
                      description
                        "IPv6 prefix to match against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "ISO address of the node";
                    }
                  }  // container ipv6-prefix
    
                  container srv6-sid {
                    junos:must "(!((".. link" || (".. node" || (".. ipv4-prefix" || ".. ipv6-prefix")))))";
                    junos:must-message "Link/prefix/node/srv6-sid parameters cannot be configured at the same time";
                    presence "enable srv6-sid";
                    description
                      "SRV6 SID related parameters";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "SRv6 SID to match the router-id against";
                    }
    
                    leaf sid {
                      type jt:ipv6addr;
                      description
                        "SRv6 SID to match against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "ISO address of the node";
                    }
                  }  // container srv6-sid
    
                  container link {
                    junos:must "(!((".. node" || (".. ipv4-prefix" || ".. ipv6-prefix"))))";
                    junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                    presence "enable link";
                    description
                      "Link-related parameters";
                    uses apply-advanced;
    
                    container from {
                      description
                        "Specify parameter of the 'from' side";
                      uses apply-advanced;
    
                      leaf as {
                        type string {
                          junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                          junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                        }
                        description "AS number";
                      }
    
                      leaf router-id {
                        type jt:ipprefix;
                        description
                          "IP prefix to match the router-id against";
                      }
    
                      leaf sys-id {
                        type jt:sysid;
                        description
                          "System-ID of the node";
                      }
    
                      leaf node-type {
                        type enumeration {
                          enum "router" {
                            value 0;
                            description
                              "Real node";
                          }
                          enum "pseudo-node" {
                            value 1;
                            description
                              "Pseudo-node";
                          }
                        }
                        description
                          "Type of the node";
                      }
    
                      leaf link-address {
                        type jt:ipprefix;
                        description
                          "IP prefix to match the link address against";
                      }
                    }  // container from
    
                    container to {
                      description
                        "Specify parameters of the 'to' side";
                      uses apply-advanced;
    
                      leaf as {
                        type string {
                          junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                          junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                        }
                        description "AS number";
                      }
    
                      leaf router-id {
                        type jt:ipprefix;
                        description
                          "IP prefix to match the router-id against";
                      }
    
                      leaf sys-id {
                        type jt:sysid;
                        description
                          "System-ID of the node";
                      }
    
                      leaf node-type {
                        type enumeration {
                          enum "router" {
                            value 0;
                            description
                              "Real node";
                          }
                          enum "pseudo-node" {
                            value 1;
                            description
                              "Pseudo-node";
                          }
                        }
                        description
                          "Type of the node";
                      }
    
                      leaf link-address {
                        type jt:ipprefix;
                        description
                          "IP prefix to match the link address against";
                      }
                    }  // container to
                  }  // container link
                }  // container traffic-engineering
    
                leaf-list route-distinguisher {
                  type string;
                  ordered-by user;
                  description
                    "Name of the route-distinguisher";
                }
              }  // container from
    
              container to {
                description
                  "Conditions to match the destination of a route";
                uses apply-advanced;
    
                leaf instance {
                  type string;
                  description
                    "Routing protocol instance";
                }
    
                leaf instance-any {
                  type empty;
                  description
                    "Any routing protocol instance";
                }
    
                leaf-list instance-list {
                  type string;
                  description
                    "A list of routing protocol instances";
                }
    
                leaf-list igp-instance {
                  type string;
                  description "IGP instance";
                }
    
                leaf family {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-vpn" {
                      value 1;
                      description
                        "IPv4-VPN family";
                    }
                    enum "inet6" {
                      value 2;
                      description "IPv6 family";
                    }
                    enum "inet6-vpn" {
                      value 3;
                      description
                        "IPv6-VPN family";
                    }
                    enum "iso-vpn" {
                      value 4;
                      description
                        "ISO-VPN family";
                    }
                    enum "iso" {
                      value 5;
                      description "ISO family";
                    }
                    enum "evpn" {
                      value 6;
                      description "EVPN family";
                    }
                    enum "inet-mvpn" {
                      value 7;
                      description
                        "IPv4 Multicast VPN family";
                    }
                    enum "inet6-mvpn" {
                      value 8;
                      description
                        "IPv6 Multicast VPN family";
                    }
                    enum "inet-mdt" {
                      value 9;
                      description
                        "IPv4 MDT Signaling family";
                    }
                    enum "route-target" {
                      value 10;
                      description
                        "Local route target VPN family";
                    }
                    enum "traffic-engineering" {
                      value 11;
                      description
                        "Traffic Engineering family";
                    }
                    enum "inet-srte" {
                      value 12;
                      description
                        "IPv4 srtte family";
                    }
                    enum "inet6-srte" {
                      value 13;
                      description
                        "IPv6 srte family";
                    }
                  }
                }
    
                leaf-list protocol {
                  type enumeration {
                    enum "aggregate" {
                      value 0;
                      description
                        "Aggregate routes";
                    }
                    enum "bgp" {
                      value 1;
                      description "BGP";
                    }
                    enum "direct" {
                      value 2;
                      description
                        "Directly connected routes";
                    }
                    enum "dvmrp" {
                      value 3;
                      description
                        "Distance Vector Multicast Routing Protocol";
                    }
                    enum "isis" {
                      value 4;
                      description
                        "Intermediate System-to-Intermediate System";
                    }
                    enum "esis" {
                      value 5;
                      description
                        "End System-to-Intermediate System";
                    }
                    enum "l-isis" {
                      value 6;
                      description
                        "Labelled ISIS";
                    }
                    enum "l2circuit" {
                      value 7;
                      description
                        "Layer 2 circuits";
                    }
                    enum "l2vpn" {
                      value 8;
                      description
                        "Layer 2 MPLS virtual private networks";
                    }
                    enum "local" {
                      value 9;
                      description
                        "Local system addresses";
                    }
                    enum "ospf" {
                      value 10;
                      description
                        "Open Shortest Path First";
                    }
                    enum "ospf2" {
                      value 11;
                      description
                        "Open Shortest Path First Version 2";
                    }
                    enum "ospf3" {
                      value 12;
                      description
                        "Open Shortest Path First Version 3";
                    }
                    enum "l-ospf" {
                      value 13;
                      description
                        "Labelled OSPF";
                    }
                    enum "pim" {
                      value 14;
                      description
                        "Protocol Independent Multicast";
                    }
                    enum "rip" {
                      value 15;
                      description
                        "Routing Information Protocol";
                    }
                    enum "ripng" {
                      value 16;
                      description
                        "Routing Information Protocol next generation";
                    }
                    enum "static" {
                      value 17;
                      description
                        "Statically defined addresses";
                    }
                    enum "arp" {
                      value 18;
                      description
                        "Addresses learned from ARP";
                    }
                    enum "frr" {
                      value 19;
                      description
                        "Addresses created by Host Fast Re-route";
                    }
                    enum "mpls" {
                      value 20;
                      description
                        "Multiprotocol Label Switching";
                    }
                    enum "ldp" {
                      value 21;
                      description
                        "Label Distribution Protocol";
                    }
                    enum "rsvp" {
                      value 22;
                      description
                        "Resource Reservation Protocol";
                    }
                    enum "msdp" {
                      value 23;
                      description
                        "Multicast Source Discovery Protocol";
                    }
                    enum "route-target" {
                      value 24;
                      description
                        "Local route target VPN membership";
                    }
                    enum "access" {
                      value 25;
                      description
                        "Access server routes";
                    }
                    enum "access-internal" {
                      value 26;
                      description
                        "Internal routes to directly connected clients";
                    }
                    enum "anchor" {
                      value 27;
                      description
                        "Anchor routes connected to UEs";
                    }
                    enum "bgp-static" {
                      value 28;
                      description
                        "BGP static routes";
                    }
                    enum "vpls" {
                      value 29;
                      description
                        "Virtual Private LAN Service";
                    }
                    enum "evpn" {
                      value 30;
                      description
                        "Ethernet VPN Service";
                    }
                    enum "spring-te" {
                      value 31;
                      description
                        "SPRING Traffic-Engineered";
                    }
                    enum "bgp-ls-epe" {
                      value 32;
                      description
                        "Addresses created by BGP-LS egress TE";
                    }
                    enum "express-segments" {
                      value 33;
                      description
                        "Express-segment routes";
                    }
                    enum "rift" {
                      value 34;
                      description "RIFT routes";
                    }
                    enum
                      "l2-learned-host-routing" {
                      value 35;
                      description
                        "Layer2-learned host routes";
                    }
                    enum "srv6-isis" {
                      value 36;
                      description "SRV6 ISIS";
                    }
                  }
                  ordered-by user;
                  description
                    "Protocol from which route was learned";
                }
    
                leaf rib {
                  type string;
                  description "Routing table";
                }
    
                leaf-list neighbor {
                  type jt:ipaddr;
                  ordered-by user;
                  description
                    "Neighboring router";
                }
    
                leaf-list next-hop {
                  type jt:ipaddr;
                  ordered-by user;
                  description "Next-hop router";
                }
    
                leaf-list interface {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Interface name or address";
                }
    
                leaf area {
                  type jt:areaid;
                  description
                    "OSPF area identifier";
                }
    
                leaf-list as-path {
                  type string;
                  ordered-by user;
                  description
                    "Name of AS path regular expression (BGP only)";
                }
    
                leaf-list as-path-group {
                  type string;
                  ordered-by user;
                  description
                    "Name of AS path group (BGP only)";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                  description
                    "BGP origin attribute";
                }
    
                leaf-list community {
                  type string;
                  ordered-by user;
                  description "BGP community";
                }
    
                leaf level {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "IS-IS level";
                }
    
                container external {
                  presence "enable external";
                  description "External route";
                  uses apply-advanced;
    
                  leaf type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type int32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "OSPF external metric type";
                  }
                }  // container external
    
                leaf bgp-srte-discriminator {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Srte discriminator";
                }
    
                leaf srte-color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Srte color";
                }
    
                leaf programmed {
                  type empty;
                  description
                    "API-programmed route";
                }
    
                leaf validation-database {
                  type enumeration {
                    enum "valid" {
                      value 0;
                      description
                        "Match for valid database validation-state";
                    }
                    enum "invalid" {
                      value 1;
                      description
                        "Match for invalid database validation-state";
                    }
                    enum "unknown" {
                      value 2;
                      description
                        "Match for unknown database validation-state";
                    }
                  }
                  description
                    "Name to identify a validation-state";
                }
    
                list nexthop-weight {
                  key "choice-ident choice-value weight";
                  ordered-by user;
                  description
                    "Weight of the gateway";
                  leaf choice-ident {
                    type enumeration {
                      enum "equal" {
                        value 0;
                      }
                      enum "greater-than" {
                        value 1;
                      }
                      enum "less-than" {
                        value 2;
                      }
                      enum "greater-than-equal" {
                        value 3;
                      }
                      enum "less-than-equal" {
                        value 4;
                      }
                      enum "weight" {
                        value 5;
                      }
                      enum "apply-advanced" {
                        value 6;
                      }
                      enum "weight_type" {
                        value 7;
                      }
                      enum "all-nexthop" {
                        value 8;
                      }
                    }
                  }
    
                  leaf choice-value {
                    type string;
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Weight of the gateway";
                  }
    
                  uses apply-advanced;
    
                  choice weight_type {
                    leaf all-nexthop {
                      type empty;
                      description
                        "All the gateway weight should be matched";
                    }
                  }  // choice weight_type
                }  // list nexthop-weight
    
                leaf metric {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value";
                }
    
                leaf metric2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 2";
                }
    
                leaf metric3 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 3";
                }
    
                leaf metric4 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Metric value 4";
                }
    
                leaf-list tag {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description "Tag string";
                }
    
                leaf tag2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag string 2";
                }
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf preference2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Preference value 2";
                }
    
                leaf color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Color (preference) value";
                }
    
                leaf color2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Color (preference) value 2";
                }
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Local preference associated with a route";
                }
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Name of policy to evaluate";
                }
    
                choice lsp-name-type {
                  leaf lsp {
                    junos:must "(".. .. then source-routing-path-template")";
                    junos:must-message "source-routing-path-template is required to configure lsp";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Label switched path name";
                  }
                  leaf lsp-regex {
                    junos:must "(".. .. then source-routing-path-template")";
                    junos:must-message "source-routing-path-template is required to configure lsp-regex";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Label switched path name regular expression";
                  }
                }  // choice lsp-name-type
    
                container source-routing-path {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure source-routing-path in policy";
                  presence
                    "enable source-routing-path";
                  description
                    "Spring-te lsp policy attributes";
                  leaf name-regex {
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be less than 64 characters";
                    }
                    description
                      "Spring-te lsp name regex";
                  }
    
                  leaf dest {
                    type jt:ipaddr;
                    description
                      "Spring-te lsp IPV4/IPV6 destination without color";
                  }
    
                  leaf origin {
                    type jt:ipaddr;
                    description
                      "Spring-te lsp origin address";
                  }
    
                  leaf tunnel-source {
                    type enumeration {
                      enum "pcep" {
                        value 0;
                        description
                          "Spring-te lsp src pcep";
                      }
                      enum "bgp" {
                        value 1;
                        description
                          "Spring-te lsp src bgp";
                      }
                    }
                    description
                      "Spring-te lsp source protocol";
                  }
    
                  leaf route-distinguisher {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Spring-te lsp route distinguisher";
                  }
    
                  leaf color {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Spring-te lsp color";
                  }
                }  // container source-routing-path
              }  // container to
    
              container then {
                description
                  "Actions to take if 'from' and 'to' conditions match";
                uses apply-advanced;
    
                container metric {
                  description "Metric value";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf metric {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                    container igp {
                      presence "enable igp";
                      description
                        "Track the IGP metric (BGP only)";
                      leaf metric_offset {
                        type union {
                          type int32;
                          type string {
                            pattern "<.*>|$.*";
                          }
                        }
                        description
                          "Metric offset for MED";
                      }
                    }  // container igp
                    container minimum-igp {
                      presence
                        "enable minimum-igp";
                      description
                        "Track the minimum IGP metric (BGP only)";
                      leaf metric_offset {
                        type union {
                          type int32;
                          type string {
                            pattern "<.*>|$.*";
                          }
                        }
                        description
                          "Metric offset for MED";
                      }
                    }  // container minimum-igp
                    container expression {
                      description
                        "Calculate value based on route metric and metric2";
                      uses metric_expression_type;
                    }  // container expression
                    leaf aigp {
                      type empty;
                      description
                        "Use aigp, if it exists, to set the IGP metric";
                    }
                    container effective-aigp {
                      presence
                        "enable effective-aigp";
                      description
                        "Track the effective AIGP metric (BGP only)";
                      leaf metric_offset {
                        type union {
                          type int32;
                          type string {
                            pattern "<.*>|$.*";
                          }
                        }
                        description
                          "Metric offset for MED";
                      }
                    }  // container effective-aigp
                    container minimum-effective-aigp {
                      presence
                        "enable minimum-effective-aigp";
                      description
                        "Track the minimum effective AIGP metric (BGP only)";
                      leaf metric_offset {
                        type union {
                          type int32;
                          type string {
                            pattern "<.*>|$.*";
                          }
                        }
                        description
                          "Metric offset for MED";
                      }
                    }  // container minimum-effective-aigp
                  }  // choice metric_action
                }  // container metric
    
                container metric2 {
                  description "Metric value 2";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf metric2 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container metric2
    
                container metric3 {
                  description "Metric value 3";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf metric3 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container metric3
    
                container metric4 {
                  description "Metric value 4";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf metric4 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container metric4
    
                container tag {
                  description "Tag string";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf tag {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container tag
    
                container tag2 {
                  description "Tag string 2";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf tag2 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container tag2
    
                container preference {
                  description "Preference value";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf preference {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container preference
    
                container preference2 {
                  description
                    "Preference value 2";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf preference2 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container preference2
    
                container color {
                  description
                    "Color (preference) value";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf color {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container color
    
                container color2 {
                  description
                    "Color (preference) value 2";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf color2 {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container color2
    
                container local-preference {
                  description
                    "Local preference associated with a route";
                  uses apply-advanced;
    
                  choice metric_action {
                    leaf local-preference {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                    }
                    leaf add {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Add constant to attribute";
                    }
                    leaf subtract {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Subtract constant from attribute";
                    }
                  }  // choice metric_action
                }  // container local-preference
    
                leaf priority {
                  type enumeration {
                    enum "high" {
                      value 0;
                      description
                        "Set priority to high";
                    }
                    enum "medium" {
                      value 1;
                      description
                        "Set priority to medium";
                    }
                    enum "low" {
                      value 2;
                      description
                        "Set priority to low";
                    }
                  }
                  description
                    "Set priority for route installation";
                }
    
                container prefix-segment {
                  junos:must "(".. .. then")";
                  junos:must-message "prefix-segment is only a then action";
                  junos:must "((". index" || ". algorithm"))";
                  junos:must-message "atleast one prefix-segment index is mandatory";
                  description
                    "Set prefix segment attributes";
                  uses apply-advanced;
    
                  list algorithm {
                    key "name";
                    max-elements 15;
                    description
                      "Set prefix segment attributes for strict/flex algorithm ";
                    leaf name {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255";
                        }
                      }
                      description
                        "Set prefix segment for strict/flex algorithm";
                    }
    
                    leaf index {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 199999";
                        }
                      }
                      description
                        "Set prefix segment index id";
                    }
    
                    leaf node-segment {
                      type empty;
                      description
                        "Set node segment flag for this prefix segment";
                    }
                  }  // list algorithm
    
                  leaf index {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 199999";
                      }
                    }
                    description
                      "Set prefix segment index id";
                  }
    
                  leaf node-segment {
                    junos:must "(".. index")";
                    junos:must-message "default prefix-segment index is mandatory";
                    type empty;
                    description
                      "Set node segment flag for default prefix segment";
                  }
                }  // container prefix-segment
    
                leaf label-allocation {
                  type enumeration {
                    enum "per-table" {
                      value 0;
                      description
                        "Set per-table label allocation mode";
                    }
                    enum "per-nexthop" {
                      value 1;
                      description
                        "Set per-nexthop label allocation mode";
                    }
                    enum "per-table-localize" {
                      value 2;
                      description
                        "Set per-table-localize label allocation mode";
                    }
                  }
                  description
                    "Set label allocation mode";
                }
    
                container add-path {
                  junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
                  junos:must-message "add-path requires unique next-hops";
                  junos:must "(".. .. then")";
                  junos:must-message "add-path is only a then action";
                  description
                    "Set BGP add-path attributes";
                  leaf send-count {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 64";
                      }
                    }
                    description
                      "Number of add-paths sent";
                  }
                }  // container add-path
    
                leaf validation-state {
                  type enumeration {
                    enum "valid" {
                      value 0;
                      description
                        "Set validaton-state to valid";
                    }
                    enum "invalid" {
                      value 1;
                      description
                        "Set validation-state to invalid";
                    }
                    enum "unknown" {
                      value 2;
                      description
                        "Set validation-state to unknown";
                    }
                  }
                  description
                    "Set validation-state of a route";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                  description "BGP path origin";
                }
    
                container aigp-originate {
                  junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
                  junos:must-message "aigp-originate requires 'next-hop'";
                  presence
                    "enable aigp-originate";
                  description
                    "Originate a BGP AIGP attribute";
                  leaf distance {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description "AIGP distance";
                  }
                }  // container aigp-originate
    
                container aigp-adjust {
                  description
                    "Adjust a BGP AIGP attribute";
                  choice math-op {
                    leaf add {
                      type empty;
                    }
                    leaf subtract {
                      type empty;
                    }
                    leaf multiply {
                      type empty;
                    }
                    leaf divide {
                      type empty;
                    }
                  }  // choice math-op
    
                  choice adjust-value {
                    leaf user-value {
                      type union {
                        type uint64;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Adjustment value";
                    }
                    leaf distance-to-protocol-nexthop {
                      type empty;
                      description "Metric2";
                    }
                  }  // choice adjust-value
                }  // container aigp-adjust
    
                list community {
                  key "choice-ident choice-value community-name";
                  ordered-by user;
                  description
                    "BGP community properties associated with a route";
                  leaf choice-ident {
                    type enumeration {
                      enum "equal-literal" {
                        value 0;
                      }
                      enum "set" {
                        value 1;
                      }
                      enum "plus-literal" {
                        value 2;
                      }
                      enum "add" {
                        value 3;
                      }
                      enum "minus-literal" {
                        value 4;
                      }
                      enum "delete" {
                        value 5;
                      }
                      enum "community-name" {
                        value 6;
                      }
                    }
                  }
    
                  leaf choice-value {
                    type string;
                  }
    
                  leaf community-name {
                    type string;
                    description
                      "Name to identify a BGP community";
                  }
                }  // list community
    
                list tunnel-attribute {
                  key "choice-ident choice-value tunnel-attribute-name";
                  ordered-by user;
                  description
                    "BGP tunnel attribute associated with a route";
                  leaf choice-ident {
                    type enumeration {
                      enum "set" {
                        value 0;
                      }
                      enum "remove" {
                        value 1;
                      }
                      enum
                        "tunnel-attribute-name" {
                        value 2;
                      }
                    }
                  }
    
                  leaf choice-value {
                    type string;
                  }
    
                  leaf tunnel-attribute-name {
                    type string;
                    description
                      "Name of a tunnel attribute , or 'all'";
                  }
                }  // list tunnel-attribute
    
                leaf damping {
                  type string;
                  description
                    "Define BGP route flap damping parameters";
                }
    
                leaf aggregate-bandwidth {
                  type empty;
                  description
                    "Advertise aggregate outbound link bandwidth";
                }
    
                leaf limit-bandwidth {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  description
                    "Limit advertised aggregate outbound link bandwidth";
                }
    
                leaf no-entropy-label-capability {
                  type empty;
                  description
                    "Don't advertise entropy label capability";
                }
    
                leaf as-path-prepend {
                  type string;
                  description
                    "Prepend AS numbers to an AS path (BGP only)";
                }
    
                container as-path-expand {
                  description
                    "Prepend AS numbers prior to adding local-as (BGP only)";
                  choice aspath_exp_value {
                    container last-as {
                      presence "enable last-as";
                      description
                        "Prepend last AS";
                      leaf count {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "1 .. 32";
                          }
                        }
                        description
                          "Repeat count";
                      }
                    }  // container last-as
                    leaf aspath {
                      type string;
                      description
                        "AS path string";
                    }
                  }  // choice aspath_exp_value
                }  // container as-path-expand
    
                container next-hop {
                  description
                    "Set the address of the next-hop router";
                  choice nexthop_value {
                    leaf self {
                      type empty;
                      description
                        "Use a local address as the next-hop address";
                    }
                    leaf peer-address {
                      type empty;
                      description
                        "Use the remote peer address as the next-hop address";
                    }
                    leaf address {
                      type jt:ipaddr;
                      description
                        "Next-hop address";
                    }
                    leaf reject {
                      type empty;
                      description
                        "Use a reject next hop";
                    }
                    leaf discard {
                      type empty;
                      description
                        "Use a discard next hop";
                    }
                    leaf next-table {
                      type string;
                      description
                        "Perform a forwarding lookup in the specified table";
                    }
                  }  // choice nexthop_value
                }  // container next-hop
    
                container install-nexthop {
                  description
                    "Choose the next hop to be used for forwarding";
                  choice strict_type {
                    leaf strict {
                      type empty;
                      description
                        "Do not use any other available next hops";
                    }
                    leaf strict-named-lsp {
                      junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                      junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                      type empty;
                      description
                        "Do not use any other non-lsp next hops";
                    }
                  }  // choice strict_type
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
    
                  container except {
                    description
                      "Do not choose to install matching next hops";
                    uses apply-advanced;
    
                    choice nexthop-value {
                      leaf-list lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name";
                      }
                      leaf-list lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name regular expression";
                      }
                      leaf-list static-lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name";
                      }
                      leaf-list static-lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name regular expression";
                      }
                      leaf non-lsp-nexthop {
                        type empty;
                        description
                          "Next-hop with non-lsp";
                      }
                      leaf non-labelled-nexthop {
                        type empty;
                        description
                          "Next-hop without tag";
                      }
                    }  // choice nexthop-value
    
                    container fallback {
                      junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                      junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                      description
                        "Backup option";
                      uses apply-advanced;
    
                      choice nexthop-value {
                        leaf-list lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name";
                        }
                        leaf-list lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name regular expression";
                        }
                        leaf-list static-lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name";
                        }
                        leaf-list static-lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name regular expression";
                        }
                        leaf non-lsp-nexthop {
                          type empty;
                          description
                            "Next-hop with non-lsp";
                        }
                        leaf non-labelled-nexthop {
                          type empty;
                          description
                            "Next-hop without tag";
                        }
                      }  // choice nexthop-value
    
                      container except {
                        description
                          "Do not choose to install matching next hops";
                        uses apply-advanced;
    
                        choice nexthop-value {
                          leaf-list lsp {
                            type string;
                            ordered-by user;
                            description
                              "Next-hop LSP name";
                          }
                          leaf-list lsp-regex {
                            type string;
                            ordered-by user;
                            description
                              "Next-hop LSP name regular expression";
                          }
                          leaf-list static-lsp {
                            type string;
                            ordered-by user;
                            description
                              "Next-hop static LSP name";
                          }
                          leaf-list static-lsp-regex {
                            type string;
                            ordered-by user;
                            description
                              "Next-hop static LSP name regular expression";
                          }
                          leaf non-lsp-nexthop {
                            type empty;
                            description
                              "Next-hop with non-lsp";
                          }
                          leaf non-labelled-nexthop {
                            type empty;
                            description
                              "Next-hop without tag";
                          }
                        }  // choice nexthop-value
                      }  // container except
                    }  // container fallback
                  }  // container except
    
                  container fallback {
                    junos:must "((".. strict-named-lsp" || ".. strict"))";
                    junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                    description "Backup option ";
                    uses apply-advanced;
    
                    choice nexthop-value {
                      leaf-list lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name";
                      }
                      leaf-list lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name regular expression";
                      }
                      leaf-list static-lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name";
                      }
                      leaf-list static-lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name regular expression";
                      }
                      leaf non-lsp-nexthop {
                        type empty;
                        description
                          "Next-hop with non-lsp";
                      }
                      leaf non-labelled-nexthop {
                        type empty;
                        description
                          "Next-hop without tag";
                      }
                    }  // choice nexthop-value
    
                    container except {
                      description
                        "Do not choose to install matching next hops";
                      uses apply-advanced;
    
                      choice nexthop-value {
                        leaf-list lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name";
                        }
                        leaf-list lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name regular expression";
                        }
                        leaf-list static-lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name";
                        }
                        leaf-list static-lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name regular expression";
                        }
                        leaf non-lsp-nexthop {
                          type empty;
                          description
                            "Next-hop with non-lsp";
                        }
                        leaf non-labelled-nexthop {
                          type empty;
                          description
                            "Next-hop without tag";
                        }
                      }  // choice nexthop-value
                    }  // container except
                  }  // container fallback
                }  // container install-nexthop
    
                leaf trace {
                  type empty;
                  description
                    "Log matches to a trace file";
                }
    
                container external {
                  junos:must "((". type" || ". nssa-only"))";
                  junos:must-message "type OR nssa-only configuration is mandatory";
                  presence "enable external";
                  description "External route";
                  uses apply-advanced;
    
                  leaf type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type int32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "OSPF external metric type";
                  }
    
                  leaf nssa-only {
                    type empty;
                    description
                      "Clear P-bit on lsa type 7";
                  }
                }  // container external
    
                container load-balance {
                  description
                    "Type of load balancing in forwarding table";
                  choice load_balance_type {
                    leaf per-packet {
                      type empty;
                      description
                        "Load balance on a per-packet basis";
                    }
                    leaf random {
                      junos:must "("chassis network-services enhanced-ip")";
                      junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                      junos:must "(!(".. ..  cos-next-hop-map"))";
                      junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                      type empty;
                      description
                        "Load balance using packet random spray";
                    }
                    leaf per-prefix {
                      type empty;
                      description
                        "Load balance on a per-prefix basis";
                    }
                    leaf consistent-hash {
                      type empty;
                      description
                        "Give a prefix consistent load-balancing";
                    }
                    leaf source-ip-only {
                      junos:must "(!(".. ..  cos-next-hop-map"))";
                      junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                      type empty;
                      description
                        "Give a source based ip load-balancing";
                    }
                    leaf destination-ip-only {
                      junos:must "(!(".. ..  cos-next-hop-map"))";
                      junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                      type empty;
                      description
                        "Give a destination based ip load-balancing";
                    }
                  }  // choice load_balance_type
                }  // container load-balance
    
                leaf no-route-localize {
                  type empty;
                  description
                    "Force route install on all fib-remote PFEs";
                }
    
                choice install-to-fib-choice {
                  leaf install-to-fib {
                    type empty;
                    description
                      "Install route to fib";
                  }
                  leaf no-install-to-fib {
                    type empty;
                    description
                      "Don't install route to fib";
                  }
                }  // choice install-to-fib-choice
    
                leaf analyze {
                  type empty;
                  description
                    "Send to registered controllers for analysis";
                }
    
                leaf class {
                  type string;
                  description
                    "Set class-of-service parameters";
                }
    
                leaf destination-class {
                  type string;
                  description
                    "Set destination class in forwarding table";
                }
    
                leaf source-class {
                  type string;
                  description
                    "Set source class in forwarding table";
                }
    
                leaf forwarding-class {
                  type string;
                  description
                    "Set source or destination class in forwarding table";
                }
    
                container map-to-interface {
                  description
                    "Set output logical interface";
                  choice map_to_interface_value {
                    leaf self {
                      type empty;
                      description
                        "Map the interface to itself";
                    }
                    leaf interface {
                      type union {
                        type jt:interface-name;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Output logical interface";
                    }
                  }  // choice map_to_interface_value
                }  // container map-to-interface
    
                leaf-list ssm-source {
                  type jt:ipaddr;
                  ordered-by user;
                  description
                    "List of Sources for SSM mapping";
                }
    
                container p2mp-lsp-root {
                  description
                    "P2mp lsp root address";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Ipv4 root address";
                  }
                }  // container p2mp-lsp-root
    
                leaf cos-next-hop-map {
                  type string;
                  description
                    "Set CoS-based next-hop map in forwarding table";
                }
    
                leaf dynamic-tunnel-attributes {
                  type string;
                  description
                    "Choose the dynamic tunnel attributes used for forwarding";
                }
    
                leaf tunnel-end-point-address {
                  type jt:ipaddr;
                  description
                    "Set tunnel end-point address of tunnel";
                }
    
                leaf selected-mldp-egress {
                  type empty;
                  description
                    "This node should act as egress node for MLDP inband signalling";
                }
    
                leaf mhop-bfd-port {
                  type empty;
                  description
                    "Use port number 4784 for MPLS-BFD as per RFC5884";
                }
    
                leaf no-backup {
                  type empty;
                  description
                    "This prefix should not have backup";
                }
    
                leaf default-action {
                  type enumeration {
                    enum "accept" {
                      value 0;
                      description
                        "Accept a route";
                    }
                    enum "reject" {
                      value 1;
                      description
                        "Reject a route";
                    }
                  }
                  description
                    "Set default policy action";
                }
    
                leaf next {
                  type enumeration {
                    enum "policy" {
                      value 0;
                      description
                        "Skip to next policy filter";
                    }
                    enum "term" {
                      value 1;
                      description
                        "Skip to next term in a policy filter";
                    }
                  }
                  description
                    "Skip to next policy or term";
                }
    
                choice accept_reject {
                  leaf accept {
                    type empty;
                    description "Accept a route";
                  }
                  leaf reject {
                    type empty;
                    description "Reject a route";
                  }
                }  // choice accept_reject
    
                container bgp-output-queue-priority {
                  description
                    "Set the BGP Update output queue priority.";
                  choice class {
                    leaf priority {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16";
                        }
                      }
                      description
                        "Output queue priority; higher is better";
                    }
                    leaf expedited {
                      type empty;
                      description
                        "Expedited queue; highest priority";
                    }
                  }  // choice class
                }  // container bgp-output-queue-priority
    
                leaf multipath-resolve {
                  type empty;
                  description
                    "Use all paths for resolution over this prefix";
                }
    
                leaf source-routing-path-template {
                  junos:must "("protocols source-packet-routing source-routing-path-template $$")";
                  junos:must-message "Referenced Spring-te template does not exist";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Spring-te template to apply";
                }
    
                leaf label-allocation-fallback-reject {
                  junos:must "((".. label" || ".. .. then"))";
                  junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
                  type empty;
                  description
                    "Suppress prefix export when label allocation fails";
                }
    
                leaf resolution-map {
                  type string;
                  description
                    "Set resolution map modes";
                }
    
                leaf ignore-service-label {
                  type empty;
                  description
                    "Ignore service labels";
                }
    
                leaf request-long-lived-ack {
                  type empty;
                  description
                    "Advertise route after forwarding is programmed";
                }
    
                leaf send-withdrawal-on-route-change {
                  type empty;
                  description
                    "Withdraw route if change is not acked from forwarding";
                }
              }  // container then
            }  // list term
    
            container from {
              description
                "Conditions to match the source of a route";
              uses apply-advanced;
    
              leaf instance {
                type string;
                description
                  "Routing protocol instance";
              }
    
              leaf instance-any {
                type empty;
                description
                  "Any routing protocol instance";
              }
    
              leaf-list instance-list {
                type string;
                description
                  "A list of routing protocol instances";
              }
    
              leaf-list igp-instance {
                type string;
                description "IGP instance";
              }
    
              leaf family {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet-vpn" {
                    value 1;
                    description
                      "IPv4-VPN family";
                  }
                  enum "inet6" {
                    value 2;
                    description "IPv6 family";
                  }
                  enum "inet6-vpn" {
                    value 3;
                    description
                      "IPv6-VPN family";
                  }
                  enum "iso-vpn" {
                    value 4;
                    description "ISO-VPN family";
                  }
                  enum "iso" {
                    value 5;
                    description "ISO family";
                  }
                  enum "evpn" {
                    value 6;
                    description "EVPN family";
                  }
                  enum "inet-mvpn" {
                    value 7;
                    description
                      "IPv4 Multicast VPN family";
                  }
                  enum "inet6-mvpn" {
                    value 8;
                    description
                      "IPv6 Multicast VPN family";
                  }
                  enum "inet-mdt" {
                    value 9;
                    description
                      "IPv4 MDT Signaling family";
                  }
                  enum "route-target" {
                    value 10;
                    description
                      "Local route target VPN family";
                  }
                  enum "traffic-engineering" {
                    value 11;
                    description
                      "Traffic Engineering family";
                  }
                  enum "inet-srte" {
                    value 12;
                    description
                      "IPv4 srtte family";
                  }
                  enum "inet6-srte" {
                    value 13;
                    description
                      "IPv6 srte family";
                  }
                }
              }
    
              leaf-list protocol {
                type enumeration {
                  enum "aggregate" {
                    value 0;
                    description
                      "Aggregate routes";
                  }
                  enum "bgp" {
                    value 1;
                    description "BGP";
                  }
                  enum "direct" {
                    value 2;
                    description
                      "Directly connected routes";
                  }
                  enum "dvmrp" {
                    value 3;
                    description
                      "Distance Vector Multicast Routing Protocol";
                  }
                  enum "isis" {
                    value 4;
                    description
                      "Intermediate System-to-Intermediate System";
                  }
                  enum "esis" {
                    value 5;
                    description
                      "End System-to-Intermediate System";
                  }
                  enum "l-isis" {
                    value 6;
                    description "Labelled ISIS";
                  }
                  enum "l2circuit" {
                    value 7;
                    description
                      "Layer 2 circuits";
                  }
                  enum "l2vpn" {
                    value 8;
                    description
                      "Layer 2 MPLS virtual private networks";
                  }
                  enum "local" {
                    value 9;
                    description
                      "Local system addresses";
                  }
                  enum "ospf" {
                    value 10;
                    description
                      "Open Shortest Path First";
                  }
                  enum "ospf2" {
                    value 11;
                    description
                      "Open Shortest Path First Version 2";
                  }
                  enum "ospf3" {
                    value 12;
                    description
                      "Open Shortest Path First Version 3";
                  }
                  enum "l-ospf" {
                    value 13;
                    description "Labelled OSPF";
                  }
                  enum "pim" {
                    value 14;
                    description
                      "Protocol Independent Multicast";
                  }
                  enum "rip" {
                    value 15;
                    description
                      "Routing Information Protocol";
                  }
                  enum "ripng" {
                    value 16;
                    description
                      "Routing Information Protocol next generation";
                  }
                  enum "static" {
                    value 17;
                    description
                      "Statically defined addresses";
                  }
                  enum "arp" {
                    value 18;
                    description
                      "Addresses learned from ARP";
                  }
                  enum "frr" {
                    value 19;
                    description
                      "Addresses created by Host Fast Re-route";
                  }
                  enum "mpls" {
                    value 20;
                    description
                      "Multiprotocol Label Switching";
                  }
                  enum "ldp" {
                    value 21;
                    description
                      "Label Distribution Protocol";
                  }
                  enum "rsvp" {
                    value 22;
                    description
                      "Resource Reservation Protocol";
                  }
                  enum "msdp" {
                    value 23;
                    description
                      "Multicast Source Discovery Protocol";
                  }
                  enum "route-target" {
                    value 24;
                    description
                      "Local route target VPN membership";
                  }
                  enum "access" {
                    value 25;
                    description
                      "Access server routes";
                  }
                  enum "access-internal" {
                    value 26;
                    description
                      "Internal routes to directly connected clients";
                  }
                  enum "anchor" {
                    value 27;
                    description
                      "Anchor routes connected to UEs";
                  }
                  enum "bgp-static" {
                    value 28;
                    description
                      "BGP static routes";
                  }
                  enum "vpls" {
                    value 29;
                    description
                      "Virtual Private LAN Service";
                  }
                  enum "evpn" {
                    value 30;
                    description
                      "Ethernet VPN Service";
                  }
                  enum "spring-te" {
                    value 31;
                    description
                      "SPRING Traffic-Engineered";
                  }
                  enum "bgp-ls-epe" {
                    value 32;
                    description
                      "Addresses created by BGP-LS egress TE";
                  }
                  enum "express-segments" {
                    value 33;
                    description
                      "Express-segment routes";
                  }
                  enum "rift" {
                    value 34;
                    description "RIFT routes";
                  }
                  enum "l2-learned-host-routing" {
                    value 35;
                    description
                      "Layer2-learned host routes";
                  }
                  enum "srv6-isis" {
                    value 36;
                    description "SRV6 ISIS";
                  }
                }
                ordered-by user;
                description
                  "Protocol from which route was learned";
              }
    
              leaf rib {
                type string;
                description "Routing table";
              }
    
              leaf-list neighbor {
                type jt:ipaddr;
                ordered-by user;
                description "Neighboring router";
              }
    
              leaf-list next-hop {
                type jt:ipaddr;
                ordered-by user;
                description "Next-hop router";
              }
    
              leaf-list interface {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Interface name or address";
              }
    
              leaf area {
                type jt:areaid;
                description
                  "OSPF area identifier";
              }
    
              leaf-list as-path {
                type string;
                ordered-by user;
                description
                  "Name of AS path regular expression (BGP only)";
              }
    
              leaf-list as-path-group {
                type string;
                ordered-by user;
                description
                  "Name of AS path group (BGP only)";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
                description
                  "BGP origin attribute";
              }
    
              leaf-list community {
                type string;
                ordered-by user;
                description "BGP community";
              }
    
              leaf level {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "IS-IS level";
              }
    
              container external {
                presence "enable external";
                description "External route";
                uses apply-advanced;
    
                leaf type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 2";
                    }
                  }
                  description
                    "OSPF external metric type";
                }
              }  // container external
    
              leaf bgp-srte-discriminator {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Srte discriminator";
              }
    
              leaf srte-color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Srte color";
              }
    
              leaf programmed {
                type empty;
                description
                  "API-programmed route";
              }
    
              leaf validation-database {
                type enumeration {
                  enum "valid" {
                    value 0;
                    description
                      "Match for valid database validation-state";
                  }
                  enum "invalid" {
                    value 1;
                    description
                      "Match for invalid database validation-state";
                  }
                  enum "unknown" {
                    value 2;
                    description
                      "Match for unknown database validation-state";
                  }
                }
                description
                  "Name to identify a validation-state";
              }
    
              list nexthop-weight {
                key "choice-ident choice-value weight";
                ordered-by user;
                description
                  "Weight of the gateway";
                leaf choice-ident {
                  type enumeration {
                    enum "equal" {
                      value 0;
                    }
                    enum "greater-than" {
                      value 1;
                    }
                    enum "less-than" {
                      value 2;
                    }
                    enum "greater-than-equal" {
                      value 3;
                    }
                    enum "less-than-equal" {
                      value 4;
                    }
                    enum "weight" {
                      value 5;
                    }
                    enum "apply-advanced" {
                      value 6;
                    }
                    enum "weight_type" {
                      value 7;
                    }
                    enum "all-nexthop" {
                      value 8;
                    }
                  }
                }
    
                leaf choice-value {
                  type string;
                }
    
                leaf weight {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Weight of the gateway";
                }
    
                uses apply-advanced;
    
                choice weight_type {
                  leaf all-nexthop {
                    type empty;
                    description
                      "All the gateway weight should be matched";
                  }
                }  // choice weight_type
              }  // list nexthop-weight
    
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value";
              }
    
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 2";
              }
    
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 3";
              }
    
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 4";
              }
    
              leaf-list tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description "Tag string";
              }
    
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag string 2";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value 2";
              }
    
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color (preference) value";
              }
    
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color (preference) value 2";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Local preference associated with a route";
              }
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Name of policy to evaluate";
              }
    
              choice lsp-name-type {
                leaf lsp {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure lsp";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Label switched path name";
                }
                leaf lsp-regex {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure lsp-regex";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Label switched path name regular expression";
                }
              }  // choice lsp-name-type
    
              container source-routing-path {
                junos:must "(".. .. then source-routing-path-template")";
                junos:must-message "source-routing-path-template is required to configure source-routing-path in policy";
                presence
                  "enable source-routing-path";
                description
                  "Spring-te lsp policy attributes";
                leaf name-regex {
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Spring-te lsp name regex";
                }
    
                leaf dest {
                  type jt:ipaddr;
                  description
                    "Spring-te lsp IPV4/IPV6 destination without color";
                }
    
                leaf origin {
                  type jt:ipaddr;
                  description
                    "Spring-te lsp origin address";
                }
    
                leaf tunnel-source {
                  type enumeration {
                    enum "pcep" {
                      value 0;
                      description
                        "Spring-te lsp src pcep";
                    }
                    enum "bgp" {
                      value 1;
                      description
                        "Spring-te lsp src bgp";
                    }
                  }
                  description
                    "Spring-te lsp source protocol";
                }
    
                leaf route-distinguisher {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Spring-te lsp route distinguisher";
                }
    
                leaf color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Spring-te lsp color";
                }
              }  // container source-routing-path
    
              list route-filter {
                key "address choice-ident choice-value";
                ordered-by user;
                description
                  "List of routes to match";
                uses control_route_filter_type;
              }  // list route-filter
    
              list source-address-filter {
                key "address choice-ident choice-value";
                ordered-by user;
                description
                  "List of source addresses to match";
                uses control_source_address_filter_type;
              }  // list source-address-filter
    
              list prefix-list {
                key "name";
                ordered-by user;
                description
                  "List of prefix-lists of routes to match";
                uses control_prefix_list_type;
              }  // list prefix-list
    
              list as-path-neighbors {
                key "list-type list-name";
                ordered-by user;
                description
                  "List of peer AS to match";
                uses control_as_list_type;
              }  // list as-path-neighbors
    
              list as-path-origins {
                key "list-type list-name";
                ordered-by user;
                description
                  "List of originating AS to match";
                uses control_as_list_type;
              }  // list as-path-origins
    
              list as-path-transits {
                key "list-type list-name";
                ordered-by user;
                description
                  "List of originating AS to match";
                uses control_as_list_type;
              }  // list as-path-transits
    
              list prefix-list-filter {
                key "list_name choice-ident choice-value";
                ordered-by user;
                description
                  "List of prefix-list-filters to match";
                uses control_prefix_list_filter_type;
              }  // list prefix-list-filter
    
              list rtf-prefix-list {
                key "name";
                ordered-by user;
                description
                  "List of rtf-prefix-lists of routes to match";
                uses control_rtf_prefix_list_type;
              }  // list rtf-prefix-list
    
              list route-filter-list {
                key "name";
                ordered-by user;
                description
                  "List of route-filter-lists of routes to match";
                uses control_route_filter_list_type;
              }  // list route-filter-list
    
              list source-address-filter-list {
                key "name";
                ordered-by user;
                description
                  "List of source-address-filter-lists of routes to match";
                uses control_source_address_filter_list_type;
              }  // list source-address-filter-list
    
              container multicast-scope {
                description
                  "Multicast scope to match";
                choice scope-choice {
                  leaf node-local {
                    type empty;
                    description
                      "Node-local scope";
                  }
                  leaf link-local {
                    type empty;
                    description
                      "Link-local scope";
                  }
                  leaf site-local {
                    type empty;
                    description
                      "Site-local scope";
                  }
                  leaf organization-local {
                    type empty;
                    description
                      "Organization-local scope";
                  }
                  leaf global {
                    type empty;
                    description "Global scope";
                  }
                  leaf scope_value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 15";
                      }
                    }
                    description "Scope value";
                  }
                }  // choice scope-choice
    
                choice scope-operator {
                  leaf orhigher {
                    type empty;
                    description
                      "Match higher values";
                  }
                  leaf orlower {
                    type empty;
                    description
                      "Match lower values";
                  }
                }  // choice scope-operator
              }  // container multicast-scope
    
              leaf aggregate-contributor {
                type empty;
                description
                  "Match more specifics of an aggregate";
              }
    
              leaf state {
                type enumeration {
                  enum "active" {
                    value 0;
                    description "Active route";
                  }
                  enum "inactive" {
                    value 1;
                    description "Inactive route";
                  }
                }
                description "Route state";
              }
    
              leaf-list tunnel-type {
                type enumeration {
                  enum "gre" {
                    value 0;
                    description "GRE tunnel";
                  }
                  enum "udp" {
                    value 1;
                    description "UDP tunnel";
                  }
                  enum "ipip" {
                    value 2;
                    description "IPIP tunnel";
                  }
                }
                ordered-by user;
                description "Tunnel type";
              }
    
              leaf route-type {
                type enumeration {
                  enum "internal" {
                    value 0;
                    description "Internal route";
                  }
                  enum "external" {
                    value 1;
                    description "External route";
                  }
                }
                description "Route type";
              }
    
              leaf-list nlri-route-type {
                junos:must "((".. family evpn" || (".. family inet-mvpn" || ".. family inet6-mvpn")))";
                junos:must-message "nlri-route-type is only valid with a family qualifier such as evpn, inet-mvpn, inet6-mvpn, or other                      family that supports a route type";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                ordered-by user;
                description
                  "Route type from NLRI";
              }
    
              leaf-list evpn-tag {
                junos:must "(".. family evpn")";
                junos:must-message "evpn-tag is only valid with a family qualifier evpn";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                ordered-by user;
                description "Tag in EVPN Route";
              }
    
              leaf-list evpn-esi {
                junos:must "(".. family evpn")";
                junos:must-message "evpn-esi is only valid with a family qualifier evpn";
                type string;
                ordered-by user;
                description "ESI in EVPN Route";
              }
    
              list mac-filter-list {
                junos:must "(".. family evpn")";
                junos:must-message "mac-filter is only valid with a family qualifier evpn";
                key "name";
                ordered-by user;
                description
                  "List of mac-filter-list macs to match";
                uses control_mac_address_filter_list_type;
              }  // list mac-filter-list
    
              leaf evpn-mac-route {
                junos:must "(".. family evpn")";
                junos:must-message "evpn-mac-route is only valid with a family qualifier evpn";
                type enumeration {
                  enum "mac-only" {
                    value 0;
                    description "MAC route";
                  }
                  enum "mac-ipv4" {
                    value 1;
                    description "MAC IPV4 route";
                  }
                  enum "mac-ipv6" {
                    value 2;
                    description "MAC IPV6 route";
                  }
                }
                description
                  "EVPN Mac Route type";
              }
    
              leaf next-hop-type {
                type enumeration {
                  enum "merged" {
                    value 0;
                    description
                      "Merged next hop";
                  }
                }
                description "Next-hop type";
              }
    
              leaf-list condition {
                type string;
                ordered-by user;
                description
                  "Condition to match on";
              }
    
              list community-count {
                key "name";
                ordered-by user;
                description
                  "Number of BGP communities";
                uses community_count_type;
              }  // list community-count
    
              list as-path-unique-count {
                key "name";
                ordered-by user;
                description
                  "Number of unique BGP ASes excluding confederations";
                uses as-path-unique-count-type;
              }  // list as-path-unique-count
    
              list as-path-calc-length {
                key "name";
                ordered-by user;
                description
                  "Number of BGP ASes excluding confederations";
                uses as-path-calc-length-type;
              }  // list as-path-calc-length
    
              container traffic-engineering {
                junos:must "(!(".. family"))";
                junos:must-message "traffic-engineering family implied";
                presence
                  "enable traffic-engineering";
                description
                  "Traffic-Engineering related parameters";
                uses apply-advanced;
    
                leaf-list protocol {
                  type enumeration {
                    enum "direct" {
                      value 0;
                      description
                        "Directly originated";
                    }
                    enum "ospf" {
                      value 1;
                      description
                        "OSPF originated";
                    }
                    enum "isis-level-1" {
                      value 2;
                      description
                        "ISIS level-1 originated";
                    }
                    enum "isis-level-2" {
                      value 3;
                      description
                        "ISIS level-2 originated";
                    }
                    enum "static" {
                      value 4;
                      description
                        "Statically originated";
                    }
                    enum "unknown" {
                      value 5;
                      description
                        "Originated by unknown sources";
                    }
                  }
                  ordered-by user;
                  description
                    "Protocol that originated the entry";
                }
    
                container node {
                  junos:must "(!((".. link" || (".. ipv4-prefix" || ".. ipv6-prefix"))))";
                  junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                  presence "enable node";
                  description
                    "Node-related parameters";
                  uses apply-advanced;
    
                  leaf as {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description "AS number";
                  }
    
                  leaf node-type {
                    type enumeration {
                      enum "router" {
                        value 0;
                        description "Real node";
                      }
                      enum "pseudo-node" {
                        value 1;
                        description
                          "Pseudo-node";
                      }
                    }
                    description
                      "Real or pseudo-node";
                  }
    
                  leaf router-id {
                    type jt:ipprefix;
                    description
                      "IP prefix to match the router-id against";
                  }
    
                  leaf sys-id {
                    type jt:sysid;
                    description
                      "ISO address of the node";
                  }
                }  // container node
    
                container ipv4-prefix {
                  junos:must "(!((".. link" || ".. node")))";
                  junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                  presence "enable ipv4-prefix";
                  description
                    "IPV4 prefix-related parameters";
                  uses apply-advanced;
    
                  leaf as {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description "AS number";
                  }
    
                  leaf router-id {
                    type jt:ipprefix;
                    description
                      "IP prefix to match the router-id against";
                  }
    
                  leaf prefix {
                    type jt:ipprefix;
                    description
                      "IP prefix to match against";
                  }
    
                  leaf sys-id {
                    type jt:sysid;
                    description
                      "ISO address of the node";
                  }
                }  // container ipv4-prefix
    
                container ipv6-prefix {
                  junos:must "(!((".. link" || (".. node" || (".. ipv4-prefix" || ".. srv6-sid")))))";
                  junos:must-message "Link/prefix/node/srv6-sid parameters cannot be configured at the same time";
                  presence "enable ipv6-prefix";
                  description
                    "IPV6 prefix related parameters";
                  uses apply-advanced;
    
                  leaf as {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description "AS number";
                  }
    
                  leaf router-id {
                    type jt:ipprefix;
                    description
                      "IPv6 prefix to match the router-id against";
                  }
    
                  leaf prefix {
                    type jt:ipv6prefix;
                    description
                      "IPv6 prefix to match against";
                  }
    
                  leaf sys-id {
                    type jt:sysid;
                    description
                      "ISO address of the node";
                  }
                }  // container ipv6-prefix
    
                container srv6-sid {
                  junos:must "(!((".. link" || (".. node" || (".. ipv4-prefix" || ".. ipv6-prefix")))))";
                  junos:must-message "Link/prefix/node/srv6-sid parameters cannot be configured at the same time";
                  presence "enable srv6-sid";
                  description
                    "SRV6 SID related parameters";
                  uses apply-advanced;
    
                  leaf as {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description "AS number";
                  }
    
                  leaf router-id {
                    type jt:ipprefix;
                    description
                      "SRv6 SID to match the router-id against";
                  }
    
                  leaf sid {
                    type jt:ipv6addr;
                    description
                      "SRv6 SID to match against";
                  }
    
                  leaf sys-id {
                    type jt:sysid;
                    description
                      "ISO address of the node";
                  }
                }  // container srv6-sid
    
                container link {
                  junos:must "(!((".. node" || (".. ipv4-prefix" || ".. ipv6-prefix"))))";
                  junos:must-message "Link, prefix and node parameters cannot be configured at the same time";
                  presence "enable link";
                  description
                    "Link-related parameters";
                  uses apply-advanced;
    
                  container from {
                    description
                      "Specify parameter of the 'from' side";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the router-id against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "System-ID of the node";
                    }
    
                    leaf node-type {
                      type enumeration {
                        enum "router" {
                          value 0;
                          description
                            "Real node";
                        }
                        enum "pseudo-node" {
                          value 1;
                          description
                            "Pseudo-node";
                        }
                      }
                      description
                        "Type of the node";
                    }
    
                    leaf link-address {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the link address against";
                    }
                  }  // container from
    
                  container to {
                    description
                      "Specify parameters of the 'to' side";
                    uses apply-advanced;
    
                    leaf as {
                      type string {
                        junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                        junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                      }
                      description "AS number";
                    }
    
                    leaf router-id {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the router-id against";
                    }
    
                    leaf sys-id {
                      type jt:sysid;
                      description
                        "System-ID of the node";
                    }
    
                    leaf node-type {
                      type enumeration {
                        enum "router" {
                          value 0;
                          description
                            "Real node";
                        }
                        enum "pseudo-node" {
                          value 1;
                          description
                            "Pseudo-node";
                        }
                      }
                      description
                        "Type of the node";
                    }
    
                    leaf link-address {
                      type jt:ipprefix;
                      description
                        "IP prefix to match the link address against";
                    }
                  }  // container to
                }  // container link
              }  // container traffic-engineering
    
              leaf-list route-distinguisher {
                type string;
                ordered-by user;
                description
                  "Name of the route-distinguisher";
              }
            }  // container from
    
            container to {
              description
                "Conditions to match the destination of a route";
              uses apply-advanced;
    
              leaf instance {
                type string;
                description
                  "Routing protocol instance";
              }
    
              leaf instance-any {
                type empty;
                description
                  "Any routing protocol instance";
              }
    
              leaf-list instance-list {
                type string;
                description
                  "A list of routing protocol instances";
              }
    
              leaf-list igp-instance {
                type string;
                description "IGP instance";
              }
    
              leaf family {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet-vpn" {
                    value 1;
                    description
                      "IPv4-VPN family";
                  }
                  enum "inet6" {
                    value 2;
                    description "IPv6 family";
                  }
                  enum "inet6-vpn" {
                    value 3;
                    description
                      "IPv6-VPN family";
                  }
                  enum "iso-vpn" {
                    value 4;
                    description "ISO-VPN family";
                  }
                  enum "iso" {
                    value 5;
                    description "ISO family";
                  }
                  enum "evpn" {
                    value 6;
                    description "EVPN family";
                  }
                  enum "inet-mvpn" {
                    value 7;
                    description
                      "IPv4 Multicast VPN family";
                  }
                  enum "inet6-mvpn" {
                    value 8;
                    description
                      "IPv6 Multicast VPN family";
                  }
                  enum "inet-mdt" {
                    value 9;
                    description
                      "IPv4 MDT Signaling family";
                  }
                  enum "route-target" {
                    value 10;
                    description
                      "Local route target VPN family";
                  }
                  enum "traffic-engineering" {
                    value 11;
                    description
                      "Traffic Engineering family";
                  }
                  enum "inet-srte" {
                    value 12;
                    description
                      "IPv4 srtte family";
                  }
                  enum "inet6-srte" {
                    value 13;
                    description
                      "IPv6 srte family";
                  }
                }
              }
    
              leaf-list protocol {
                type enumeration {
                  enum "aggregate" {
                    value 0;
                    description
                      "Aggregate routes";
                  }
                  enum "bgp" {
                    value 1;
                    description "BGP";
                  }
                  enum "direct" {
                    value 2;
                    description
                      "Directly connected routes";
                  }
                  enum "dvmrp" {
                    value 3;
                    description
                      "Distance Vector Multicast Routing Protocol";
                  }
                  enum "isis" {
                    value 4;
                    description
                      "Intermediate System-to-Intermediate System";
                  }
                  enum "esis" {
                    value 5;
                    description
                      "End System-to-Intermediate System";
                  }
                  enum "l-isis" {
                    value 6;
                    description "Labelled ISIS";
                  }
                  enum "l2circuit" {
                    value 7;
                    description
                      "Layer 2 circuits";
                  }
                  enum "l2vpn" {
                    value 8;
                    description
                      "Layer 2 MPLS virtual private networks";
                  }
                  enum "local" {
                    value 9;
                    description
                      "Local system addresses";
                  }
                  enum "ospf" {
                    value 10;
                    description
                      "Open Shortest Path First";
                  }
                  enum "ospf2" {
                    value 11;
                    description
                      "Open Shortest Path First Version 2";
                  }
                  enum "ospf3" {
                    value 12;
                    description
                      "Open Shortest Path First Version 3";
                  }
                  enum "l-ospf" {
                    value 13;
                    description "Labelled OSPF";
                  }
                  enum "pim" {
                    value 14;
                    description
                      "Protocol Independent Multicast";
                  }
                  enum "rip" {
                    value 15;
                    description
                      "Routing Information Protocol";
                  }
                  enum "ripng" {
                    value 16;
                    description
                      "Routing Information Protocol next generation";
                  }
                  enum "static" {
                    value 17;
                    description
                      "Statically defined addresses";
                  }
                  enum "arp" {
                    value 18;
                    description
                      "Addresses learned from ARP";
                  }
                  enum "frr" {
                    value 19;
                    description
                      "Addresses created by Host Fast Re-route";
                  }
                  enum "mpls" {
                    value 20;
                    description
                      "Multiprotocol Label Switching";
                  }
                  enum "ldp" {
                    value 21;
                    description
                      "Label Distribution Protocol";
                  }
                  enum "rsvp" {
                    value 22;
                    description
                      "Resource Reservation Protocol";
                  }
                  enum "msdp" {
                    value 23;
                    description
                      "Multicast Source Discovery Protocol";
                  }
                  enum "route-target" {
                    value 24;
                    description
                      "Local route target VPN membership";
                  }
                  enum "access" {
                    value 25;
                    description
                      "Access server routes";
                  }
                  enum "access-internal" {
                    value 26;
                    description
                      "Internal routes to directly connected clients";
                  }
                  enum "anchor" {
                    value 27;
                    description
                      "Anchor routes connected to UEs";
                  }
                  enum "bgp-static" {
                    value 28;
                    description
                      "BGP static routes";
                  }
                  enum "vpls" {
                    value 29;
                    description
                      "Virtual Private LAN Service";
                  }
                  enum "evpn" {
                    value 30;
                    description
                      "Ethernet VPN Service";
                  }
                  enum "spring-te" {
                    value 31;
                    description
                      "SPRING Traffic-Engineered";
                  }
                  enum "bgp-ls-epe" {
                    value 32;
                    description
                      "Addresses created by BGP-LS egress TE";
                  }
                  enum "express-segments" {
                    value 33;
                    description
                      "Express-segment routes";
                  }
                  enum "rift" {
                    value 34;
                    description "RIFT routes";
                  }
                  enum "l2-learned-host-routing" {
                    value 35;
                    description
                      "Layer2-learned host routes";
                  }
                  enum "srv6-isis" {
                    value 36;
                    description "SRV6 ISIS";
                  }
                }
                ordered-by user;
                description
                  "Protocol from which route was learned";
              }
    
              leaf rib {
                type string;
                description "Routing table";
              }
    
              leaf-list neighbor {
                type jt:ipaddr;
                ordered-by user;
                description "Neighboring router";
              }
    
              leaf-list next-hop {
                type jt:ipaddr;
                ordered-by user;
                description "Next-hop router";
              }
    
              leaf-list interface {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Interface name or address";
              }
    
              leaf area {
                type jt:areaid;
                description
                  "OSPF area identifier";
              }
    
              leaf-list as-path {
                type string;
                ordered-by user;
                description
                  "Name of AS path regular expression (BGP only)";
              }
    
              leaf-list as-path-group {
                type string;
                ordered-by user;
                description
                  "Name of AS path group (BGP only)";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
                description
                  "BGP origin attribute";
              }
    
              leaf-list community {
                type string;
                ordered-by user;
                description "BGP community";
              }
    
              leaf level {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "IS-IS level";
              }
    
              container external {
                presence "enable external";
                description "External route";
                uses apply-advanced;
    
                leaf type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 2";
                    }
                  }
                  description
                    "OSPF external metric type";
                }
              }  // container external
    
              leaf bgp-srte-discriminator {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Srte discriminator";
              }
    
              leaf srte-color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Srte color";
              }
    
              leaf programmed {
                type empty;
                description
                  "API-programmed route";
              }
    
              leaf validation-database {
                type enumeration {
                  enum "valid" {
                    value 0;
                    description
                      "Match for valid database validation-state";
                  }
                  enum "invalid" {
                    value 1;
                    description
                      "Match for invalid database validation-state";
                  }
                  enum "unknown" {
                    value 2;
                    description
                      "Match for unknown database validation-state";
                  }
                }
                description
                  "Name to identify a validation-state";
              }
    
              list nexthop-weight {
                key "choice-ident choice-value weight";
                ordered-by user;
                description
                  "Weight of the gateway";
                leaf choice-ident {
                  type enumeration {
                    enum "equal" {
                      value 0;
                    }
                    enum "greater-than" {
                      value 1;
                    }
                    enum "less-than" {
                      value 2;
                    }
                    enum "greater-than-equal" {
                      value 3;
                    }
                    enum "less-than-equal" {
                      value 4;
                    }
                    enum "weight" {
                      value 5;
                    }
                    enum "apply-advanced" {
                      value 6;
                    }
                    enum "weight_type" {
                      value 7;
                    }
                    enum "all-nexthop" {
                      value 8;
                    }
                  }
                }
    
                leaf choice-value {
                  type string;
                }
    
                leaf weight {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Weight of the gateway";
                }
    
                uses apply-advanced;
    
                choice weight_type {
                  leaf all-nexthop {
                    type empty;
                    description
                      "All the gateway weight should be matched";
                  }
                }  // choice weight_type
              }  // list nexthop-weight
    
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value";
              }
    
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 2";
              }
    
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 3";
              }
    
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Metric value 4";
              }
    
              leaf-list tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description "Tag string";
              }
    
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag string 2";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value 2";
              }
    
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color (preference) value";
              }
    
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color (preference) value 2";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Local preference associated with a route";
              }
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Name of policy to evaluate";
              }
    
              choice lsp-name-type {
                leaf lsp {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure lsp";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Label switched path name";
                }
                leaf lsp-regex {
                  junos:must "(".. .. then source-routing-path-template")";
                  junos:must-message "source-routing-path-template is required to configure lsp-regex";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Label switched path name regular expression";
                }
              }  // choice lsp-name-type
    
              container source-routing-path {
                junos:must "(".. .. then source-routing-path-template")";
                junos:must-message "source-routing-path-template is required to configure source-routing-path in policy";
                presence
                  "enable source-routing-path";
                description
                  "Spring-te lsp policy attributes";
                leaf name-regex {
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be less than 64 characters";
                  }
                  description
                    "Spring-te lsp name regex";
                }
    
                leaf dest {
                  type jt:ipaddr;
                  description
                    "Spring-te lsp IPV4/IPV6 destination without color";
                }
    
                leaf origin {
                  type jt:ipaddr;
                  description
                    "Spring-te lsp origin address";
                }
    
                leaf tunnel-source {
                  type enumeration {
                    enum "pcep" {
                      value 0;
                      description
                        "Spring-te lsp src pcep";
                    }
                    enum "bgp" {
                      value 1;
                      description
                        "Spring-te lsp src bgp";
                    }
                  }
                  description
                    "Spring-te lsp source protocol";
                }
    
                leaf route-distinguisher {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Spring-te lsp route distinguisher";
                }
    
                leaf color {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Spring-te lsp color";
                }
              }  // container source-routing-path
            }  // container to
    
            container then {
              description
                "Actions to take if 'from' and 'to' conditions match";
              uses apply-advanced;
    
              container metric {
                description "Metric value";
                uses apply-advanced;
    
                choice metric_action {
                  leaf metric {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                  container igp {
                    presence "enable igp";
                    description
                      "Track the IGP metric (BGP only)";
                    leaf metric_offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container igp
                  container minimum-igp {
                    presence
                      "enable minimum-igp";
                    description
                      "Track the minimum IGP metric (BGP only)";
                    leaf metric_offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-igp
                  container expression {
                    description
                      "Calculate value based on route metric and metric2";
                    uses metric_expression_type;
                  }  // container expression
                  leaf aigp {
                    type empty;
                    description
                      "Use aigp, if it exists, to set the IGP metric";
                  }
                  container effective-aigp {
                    presence
                      "enable effective-aigp";
                    description
                      "Track the effective AIGP metric (BGP only)";
                    leaf metric_offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container effective-aigp
                  container minimum-effective-aigp {
                    presence
                      "enable minimum-effective-aigp";
                    description
                      "Track the minimum effective AIGP metric (BGP only)";
                    leaf metric_offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-effective-aigp
                }  // choice metric_action
              }  // container metric
    
              container metric2 {
                description "Metric value 2";
                uses apply-advanced;
    
                choice metric_action {
                  leaf metric2 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container metric2
    
              container metric3 {
                description "Metric value 3";
                uses apply-advanced;
    
                choice metric_action {
                  leaf metric3 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container metric3
    
              container metric4 {
                description "Metric value 4";
                uses apply-advanced;
    
                choice metric_action {
                  leaf metric4 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container metric4
    
              container tag {
                description "Tag string";
                uses apply-advanced;
    
                choice metric_action {
                  leaf tag {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container tag
    
              container tag2 {
                description "Tag string 2";
                uses apply-advanced;
    
                choice metric_action {
                  leaf tag2 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container tag2
    
              container preference {
                description "Preference value";
                uses apply-advanced;
    
                choice metric_action {
                  leaf preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container preference
    
              container preference2 {
                description "Preference value 2";
                uses apply-advanced;
    
                choice metric_action {
                  leaf preference2 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container preference2
    
              container color {
                description
                  "Color (preference) value";
                uses apply-advanced;
    
                choice metric_action {
                  leaf color {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container color
    
              container color2 {
                description
                  "Color (preference) value 2";
                uses apply-advanced;
    
                choice metric_action {
                  leaf color2 {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container color2
    
              container local-preference {
                description
                  "Local preference associated with a route";
                uses apply-advanced;
    
                choice metric_action {
                  leaf local-preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                  }
                  leaf add {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Add constant to attribute";
                  }
                  leaf subtract {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Subtract constant from attribute";
                  }
                }  // choice metric_action
              }  // container local-preference
    
              leaf priority {
                type enumeration {
                  enum "high" {
                    value 0;
                    description
                      "Set priority to high";
                  }
                  enum "medium" {
                    value 1;
                    description
                      "Set priority to medium";
                  }
                  enum "low" {
                    value 2;
                    description
                      "Set priority to low";
                  }
                }
                description
                  "Set priority for route installation";
              }
    
              container prefix-segment {
                junos:must "(".. .. then")";
                junos:must-message "prefix-segment is only a then action";
                junos:must "((". index" || ". algorithm"))";
                junos:must-message "atleast one prefix-segment index is mandatory";
                description
                  "Set prefix segment attributes";
                uses apply-advanced;
    
                list algorithm {
                  key "name";
                  max-elements 15;
                  description
                    "Set prefix segment attributes for strict/flex algorithm ";
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Set prefix segment for strict/flex algorithm";
                  }
    
                  leaf index {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 199999";
                      }
                    }
                    description
                      "Set prefix segment index id";
                  }
    
                  leaf node-segment {
                    type empty;
                    description
                      "Set node segment flag for this prefix segment";
                  }
                }  // list algorithm
    
                leaf index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description
                    "Set prefix segment index id";
                }
    
                leaf node-segment {
                  junos:must "(".. index")";
                  junos:must-message "default prefix-segment index is mandatory";
                  type empty;
                  description
                    "Set node segment flag for default prefix segment";
                }
              }  // container prefix-segment
    
              leaf label-allocation {
                type enumeration {
                  enum "per-table" {
                    value 0;
                    description
                      "Set per-table label allocation mode";
                  }
                  enum "per-nexthop" {
                    value 1;
                    description
                      "Set per-nexthop label allocation mode";
                  }
                  enum "per-table-localize" {
                    value 2;
                    description
                      "Set per-table-localize label allocation mode";
                  }
                }
                description
                  "Set label allocation mode";
              }
    
              container add-path {
                junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
                junos:must-message "add-path requires unique next-hops";
                junos:must "(".. .. then")";
                junos:must-message "add-path is only a then action";
                description
                  "Set BGP add-path attributes";
                leaf send-count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 64";
                    }
                  }
                  description
                    "Number of add-paths sent";
                }
              }  // container add-path
    
              leaf validation-state {
                type enumeration {
                  enum "valid" {
                    value 0;
                    description
                      "Set validaton-state to valid";
                  }
                  enum "invalid" {
                    value 1;
                    description
                      "Set validation-state to invalid";
                  }
                  enum "unknown" {
                    value 2;
                    description
                      "Set validation-state to unknown";
                  }
                }
                description
                  "Set validation-state of a route";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
                description "BGP path origin";
              }
    
              container aigp-originate {
                junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
                junos:must-message "aigp-originate requires 'next-hop'";
                presence "enable aigp-originate";
                description
                  "Originate a BGP AIGP attribute";
                leaf distance {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "AIGP distance";
                }
              }  // container aigp-originate
    
              container aigp-adjust {
                description
                  "Adjust a BGP AIGP attribute";
                choice math-op {
                  leaf add {
                    type empty;
                  }
                  leaf subtract {
                    type empty;
                  }
                  leaf multiply {
                    type empty;
                  }
                  leaf divide {
                    type empty;
                  }
                }  // choice math-op
    
                choice adjust-value {
                  leaf user-value {
                    type union {
                      type uint64;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Adjustment value";
                  }
                  leaf distance-to-protocol-nexthop {
                    type empty;
                    description "Metric2";
                  }
                }  // choice adjust-value
              }  // container aigp-adjust
    
              list community {
                key "choice-ident choice-value community-name";
                ordered-by user;
                description
                  "BGP community properties associated with a route";
                leaf choice-ident {
                  type enumeration {
                    enum "equal-literal" {
                      value 0;
                    }
                    enum "set" {
                      value 1;
                    }
                    enum "plus-literal" {
                      value 2;
                    }
                    enum "add" {
                      value 3;
                    }
                    enum "minus-literal" {
                      value 4;
                    }
                    enum "delete" {
                      value 5;
                    }
                    enum "community-name" {
                      value 6;
                    }
                  }
                }
    
                leaf choice-value {
                  type string;
                }
    
                leaf community-name {
                  type string;
                  description
                    "Name to identify a BGP community";
                }
              }  // list community
    
              list tunnel-attribute {
                key "choice-ident choice-value tunnel-attribute-name";
                ordered-by user;
                description
                  "BGP tunnel attribute associated with a route";
                leaf choice-ident {
                  type enumeration {
                    enum "set" {
                      value 0;
                    }
                    enum "remove" {
                      value 1;
                    }
                    enum "tunnel-attribute-name" {
                      value 2;
                    }
                  }
                }
    
                leaf choice-value {
                  type string;
                }
    
                leaf tunnel-attribute-name {
                  type string;
                  description
                    "Name of a tunnel attribute , or 'all'";
                }
              }  // list tunnel-attribute
    
              leaf damping {
                type string;
                description
                  "Define BGP route flap damping parameters";
              }
    
              leaf aggregate-bandwidth {
                type empty;
                description
                  "Advertise aggregate outbound link bandwidth";
              }
    
              leaf limit-bandwidth {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Limit advertised aggregate outbound link bandwidth";
              }
    
              leaf no-entropy-label-capability {
                type empty;
                description
                  "Don't advertise entropy label capability";
              }
    
              leaf as-path-prepend {
                type string;
                description
                  "Prepend AS numbers to an AS path (BGP only)";
              }
    
              container as-path-expand {
                description
                  "Prepend AS numbers prior to adding local-as (BGP only)";
                choice aspath_exp_value {
                  container last-as {
                    presence "enable last-as";
                    description
                      "Prepend last AS";
                    leaf count {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 32";
                        }
                      }
                      description "Repeat count";
                    }
                  }  // container last-as
                  leaf aspath {
                    type string;
                    description "AS path string";
                  }
                }  // choice aspath_exp_value
              }  // container as-path-expand
    
              container next-hop {
                description
                  "Set the address of the next-hop router";
                choice nexthop_value {
                  leaf self {
                    type empty;
                    description
                      "Use a local address as the next-hop address";
                  }
                  leaf peer-address {
                    type empty;
                    description
                      "Use the remote peer address as the next-hop address";
                  }
                  leaf address {
                    type jt:ipaddr;
                    description
                      "Next-hop address";
                  }
                  leaf reject {
                    type empty;
                    description
                      "Use a reject next hop";
                  }
                  leaf discard {
                    type empty;
                    description
                      "Use a discard next hop";
                  }
                  leaf next-table {
                    type string;
                    description
                      "Perform a forwarding lookup in the specified table";
                  }
                }  // choice nexthop_value
              }  // container next-hop
    
              container install-nexthop {
                description
                  "Choose the next hop to be used for forwarding";
                choice strict_type {
                  leaf strict {
                    type empty;
                    description
                      "Do not use any other available next hops";
                  }
                  leaf strict-named-lsp {
                    junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                    junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                    type empty;
                    description
                      "Do not use any other non-lsp next hops";
                  }
                }  // choice strict_type
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
    
                  container fallback {
                    junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                    junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                    description "Backup option";
                    uses apply-advanced;
    
                    choice nexthop-value {
                      leaf-list lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name";
                      }
                      leaf-list lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name regular expression";
                      }
                      leaf-list static-lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name";
                      }
                      leaf-list static-lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name regular expression";
                      }
                      leaf non-lsp-nexthop {
                        type empty;
                        description
                          "Next-hop with non-lsp";
                      }
                      leaf non-labelled-nexthop {
                        type empty;
                        description
                          "Next-hop without tag";
                      }
                    }  // choice nexthop-value
    
                    container except {
                      description
                        "Do not choose to install matching next hops";
                      uses apply-advanced;
    
                      choice nexthop-value {
                        leaf-list lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name";
                        }
                        leaf-list lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop LSP name regular expression";
                        }
                        leaf-list static-lsp {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name";
                        }
                        leaf-list static-lsp-regex {
                          type string;
                          ordered-by user;
                          description
                            "Next-hop static LSP name regular expression";
                        }
                        leaf non-lsp-nexthop {
                          type empty;
                          description
                            "Next-hop with non-lsp";
                        }
                        leaf non-labelled-nexthop {
                          type empty;
                          description
                            "Next-hop without tag";
                        }
                      }  // choice nexthop-value
                    }  // container except
                  }  // container fallback
                }  // container except
    
                container fallback {
                  junos:must "((".. strict-named-lsp" || ".. strict"))";
                  junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                  description "Backup option ";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
    
                  container except {
                    description
                      "Do not choose to install matching next hops";
                    uses apply-advanced;
    
                    choice nexthop-value {
                      leaf-list lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name";
                      }
                      leaf-list lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop LSP name regular expression";
                      }
                      leaf-list static-lsp {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name";
                      }
                      leaf-list static-lsp-regex {
                        type string;
                        ordered-by user;
                        description
                          "Next-hop static LSP name regular expression";
                      }
                      leaf non-lsp-nexthop {
                        type empty;
                        description
                          "Next-hop with non-lsp";
                      }
                      leaf non-labelled-nexthop {
                        type empty;
                        description
                          "Next-hop without tag";
                      }
                    }  // choice nexthop-value
                  }  // container except
                }  // container fallback
              }  // container install-nexthop
    
              leaf trace {
                type empty;
                description
                  "Log matches to a trace file";
              }
    
              container external {
                junos:must "((". type" || ". nssa-only"))";
                junos:must-message "type OR nssa-only configuration is mandatory";
                presence "enable external";
                description "External route";
                uses apply-advanced;
    
                leaf type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 2";
                    }
                  }
                  description
                    "OSPF external metric type";
                }
    
                leaf nssa-only {
                  type empty;
                  description
                    "Clear P-bit on lsa type 7";
                }
              }  // container external
    
              container load-balance {
                description
                  "Type of load balancing in forwarding table";
                choice load_balance_type {
                  leaf per-packet {
                    type empty;
                    description
                      "Load balance on a per-packet basis";
                  }
                  leaf random {
                    junos:must "("chassis network-services enhanced-ip")";
                    junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                    junos:must "(!(".. ..  cos-next-hop-map"))";
                    junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                    type empty;
                    description
                      "Load balance using packet random spray";
                  }
                  leaf per-prefix {
                    type empty;
                    description
                      "Load balance on a per-prefix basis";
                  }
                  leaf consistent-hash {
                    type empty;
                    description
                      "Give a prefix consistent load-balancing";
                  }
                  leaf source-ip-only {
                    junos:must "(!(".. ..  cos-next-hop-map"))";
                    junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                    type empty;
                    description
                      "Give a source based ip load-balancing";
                  }
                  leaf destination-ip-only {
                    junos:must "(!(".. ..  cos-next-hop-map"))";
                    junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                    type empty;
                    description
                      "Give a destination based ip load-balancing";
                  }
                }  // choice load_balance_type
              }  // container load-balance
    
              leaf no-route-localize {
                type empty;
                description
                  "Force route install on all fib-remote PFEs";
              }
    
              choice install-to-fib-choice {
                leaf install-to-fib {
                  type empty;
                  description
                    "Install route to fib";
                }
                leaf no-install-to-fib {
                  type empty;
                  description
                    "Don't install route to fib";
                }
              }  // choice install-to-fib-choice
    
              leaf analyze {
                type empty;
                description
                  "Send to registered controllers for analysis";
              }
    
              leaf class {
                type string;
                description
                  "Set class-of-service parameters";
              }
    
              leaf destination-class {
                type string;
                description
                  "Set destination class in forwarding table";
              }
    
              leaf source-class {
                type string;
                description
                  "Set source class in forwarding table";
              }
    
              leaf forwarding-class {
                type string;
                description
                  "Set source or destination class in forwarding table";
              }
    
              container map-to-interface {
                description
                  "Set output logical interface";
                choice map_to_interface_value {
                  leaf self {
                    type empty;
                    description
                      "Map the interface to itself";
                  }
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Output logical interface";
                  }
                }  // choice map_to_interface_value
              }  // container map-to-interface
    
              leaf-list ssm-source {
                type jt:ipaddr;
                ordered-by user;
                description
                  "List of Sources for SSM mapping";
              }
    
              container p2mp-lsp-root {
                description
                  "P2mp lsp root address";
                uses apply-advanced;
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Ipv4 root address";
                }
              }  // container p2mp-lsp-root
    
              leaf cos-next-hop-map {
                type string;
                description
                  "Set CoS-based next-hop map in forwarding table";
              }
    
              leaf dynamic-tunnel-attributes {
                type string;
                description
                  "Choose the dynamic tunnel attributes used for forwarding";
              }
    
              leaf tunnel-end-point-address {
                type jt:ipaddr;
                description
                  "Set tunnel end-point address of tunnel";
              }
    
              leaf selected-mldp-egress {
                type empty;
                description
                  "This node should act as egress node for MLDP inband signalling";
              }
    
              leaf mhop-bfd-port {
                type empty;
                description
                  "Use port number 4784 for MPLS-BFD as per RFC5884";
              }
    
              leaf no-backup {
                type empty;
                description
                  "This prefix should not have backup";
              }
    
              leaf default-action {
                type enumeration {
                  enum "accept" {
                    value 0;
                    description "Accept a route";
                  }
                  enum "reject" {
                    value 1;
                    description "Reject a route";
                  }
                }
                description
                  "Set default policy action";
              }
    
              leaf next {
                type enumeration {
                  enum "policy" {
                    value 0;
                    description
                      "Skip to next policy filter";
                  }
                  enum "term" {
                    value 1;
                    description
                      "Skip to next term in a policy filter";
                  }
                }
                description
                  "Skip to next policy or term";
              }
    
              choice accept_reject {
                leaf accept {
                  type empty;
                  description "Accept a route";
                }
                leaf reject {
                  type empty;
                  description "Reject a route";
                }
              }  // choice accept_reject
    
              container bgp-output-queue-priority {
                description
                  "Set the BGP Update output queue priority.";
                choice class {
                  leaf priority {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16";
                      }
                    }
                    description
                      "Output queue priority; higher is better";
                  }
                  leaf expedited {
                    type empty;
                    description
                      "Expedited queue; highest priority";
                  }
                }  // choice class
              }  // container bgp-output-queue-priority
    
              leaf multipath-resolve {
                type empty;
                description
                  "Use all paths for resolution over this prefix";
              }
    
              leaf source-routing-path-template {
                junos:must "("protocols source-packet-routing source-routing-path-template $$")";
                junos:must-message "Referenced Spring-te template does not exist";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be less than 64 characters";
                }
                description
                  "Spring-te template to apply";
              }
    
              leaf label-allocation-fallback-reject {
                junos:must "((".. label" || ".. .. then"))";
                junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
                type empty;
                description
                  "Suppress prefix export when label allocation fails";
              }
    
              leaf resolution-map {
                type string;
                description
                  "Set resolution map modes";
              }
    
              leaf ignore-service-label {
                type empty;
                description
                  "Ignore service labels";
              }
    
              leaf request-long-lived-ack {
                type empty;
                description
                  "Advertise route after forwarding is programmed";
              }
    
              leaf send-withdrawal-on-route-change {
                type empty;
                description
                  "Withdraw route if change is not acked from forwarding";
              }
            }  // container then
          }  // list policy-statement
    
          container defaults {
            description
              "Policy default behaviour";
            uses apply-advanced;
    
            container route-filter {
              description
                "Set route filter behaviour";
              leaf walkup {
                type empty;
                description
                  "Route filter walk up enable";
              }
            }  // container route-filter
          }  // container defaults
    
          list tunnel-attribute {
            key "name";
            ordered-by user;
            description
              "BGP tunnel attributes definition";
            leaf name {
              type string {
                junos:posix-pattern "![^a-zA-Z0-9_-]|(^(all|.{64,})$)";
                junos:pattern-message "Tunnel attribute name is a string consisting of up to 63 letters, numbers, dashes, and underscores";
              }
              description
                "Tunnel attribute name";
            }
    
            uses apply-advanced;
    
            leaf tunnel-type {
              type enumeration {
                enum "ipip" {
                  value 0;
                  description
                    "Tunnel type IP-IN-IP";
                }
              }
              description "Tunnel type";
            }
    
            leaf tunnel-color {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Tunnel color";
            }
    
            leaf remote-end-point {
              type jt:ipaddr;
              description
                "Tunnel remote end point";
            }
          }  // list tunnel-attribute
    
          list community {
            key "name";
            description
              "BGP community information";
            leaf name {
              type string;
              description
                "Name to identify BGP community";
            }
    
            uses apply-advanced;
    
            leaf invert-match {
              type empty;
              description
                "Invert the result of the community expression matching";
            }
    
            leaf-list members {
              type string;
              ordered-by user;
              description "Community members";
            }
          }  // list community
    
          list as-list {
            key "name";
            description
              "BGP as range list information";
            leaf name {
              type string;
              description
                "Name to identify BGP as-list";
            }
    
            uses apply-advanced;
    
            leaf-list members {
              type string;
              ordered-by user;
              description
                "Single autonomous system number or range of autonomous system numbers in plain number";
            }
          }  // list as-list
    
          list as-list-group {
            key "name";
            description "Group a set of as-list";
            leaf name {
              type string;
              description
                "Name to identify AS list group";
            }
    
            uses apply-advanced;
    
            list as-list {
              key "name";
              description
                "BGP as range list information";
              leaf name {
                type string;
                description
                  "Name to identify BGP as-list";
              }
    
              uses apply-advanced;
    
              leaf-list members {
                type string;
                ordered-by user;
                description
                  "Single autonomous system number or range of autonomous system numbers";
              }
            }  // list as-list
          }  // list as-list-group
    
          list route-distinguisher {
            key "name";
            description
              "Route-distinguisher information";
            leaf name {
              type string;
              description
                "Name to identify route-distinguisher";
            }
    
            uses apply-advanced;
    
            leaf-list members {
              type string;
              ordered-by user;
              description
                "Route distinguisher string in ( *:X ) or ( Y:* ) or (X:Y) format";
            }
          }  // list route-distinguisher
    
          list as-path {
            key "name";
            ordered-by user;
            description
              "BGP autonomous system path regular expression";
            leaf name {
              type string;
              description
                "Name to identify AS path regular expression";
            }
    
            uses apply-advanced;
    
            leaf path {
              type string {
                junos:posix-pattern "![;#~&<>/a-zA-Z]";
                junos:pattern-message "^$-,|*!+?{}.[]()0123456789: Only these characters are allowed";
              }
              description
                "AS path regular expression";
            }
          }  // list as-path
    
          list as-path-group {
            key "name";
            ordered-by user;
            description
              "Group a set of AS paths";
            leaf name {
              type string;
              description
                "Name to identify AS path group";
            }
    
            uses apply-advanced;
    
            list as-path {
              key "name";
              ordered-by user;
              description
                "BGP autonomous system path regular expression";
              leaf name {
                type string;
                description
                  "Name to identify AS path regular expression";
              }
    
              leaf path {
                type string {
                  junos:posix-pattern "![;#~&<>/a-zA-Z]";
                  junos:pattern-message "^$-,|*!+?{}.[]()0123456789: Only these characters are allowed";
                }
                description
                  "AS path regular expression";
              }
            }  // list as-path
          }  // list as-path-group
    
          list damping {
            key "name";
            ordered-by user;
            description
              "BGP route flap damping properties";
            leaf name {
              type string;
              description
                "Name to identify route flap damping parameters";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable damping";
              }
            }  // choice enable-disable
    
            leaf half-life {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 45";
                }
              }
              units "minutes";
              description "Decay half-life";
            }
    
            leaf reuse {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 20000";
                }
              }
              description
                "Reuse threshold (figure-of-merit value)";
            }
    
            leaf suppress {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 20000";
                }
              }
              description
                "Cutoff threshold (figure-of-merit value)";
            }
    
            leaf max-suppress {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 720";
                }
              }
              units "minutes";
              description
                "Maximum hold-down time";
            }
          }  // list damping
    
          list condition {
            key "name";
            description
              "Define a route advertisement condition";
            leaf name {
              type string;
              description
                "Name to identify Condition";
            }
    
            uses apply-advanced;
    
            choice condition_type {
              leaf route-active-on {
                type enumeration {
                  enum "node0" {
                    value 0;
                    description
                      "Route active on node 0";
                  }
                  enum "node1" {
                    value 1;
                    description
                      "Route active on node 1";
                  }
                }
                description
                  "Route is active on a specific node";
              }
              container if-route-exists {
                presence
                  "enable if-route-exists";
                description
                  "Route exists in a specific routing table";
                uses apply-advanced;
    
                container address-family {
                  presence
                    "enable address-family";
                  description
                    "Indicates the address family of the route to match on";
                  uses apply-advanced;
    
                  choice address-family {
                    container inet {
                      presence "enable inet";
                      description
                        "Route to match corresponds to an inet/inet6 prefix";
                      uses apply-advanced;
    
                      leaf address {
                        junos:must "(!(".. .. .. address"))";
                        junos:must-message "A unique address field is allowed per condition";
                        junos:must "(!((".. .. ccc" || ".. .. mpls")))";
                        junos:must-message "Only one address-family type can be configured per condition";
                        type jt:ipprefix;
                        description
                          "Exact address of the route";
                      }
    
                      leaf table {
                        type string;
                        description
                          "Routing table in which route should exist";
                      }
                    }  // container inet
                    container ccc {
                      presence "enable ccc";
                      description
                        "Route to match corresponds to a ccc prefix";
                      uses apply-advanced;
    
                      leaf address {
                        junos:must "(!(".. .. .. address"))";
                        junos:must-message "A unique address field is allowed per condition";
                        junos:must "(!((".. .. inet" || ".. .. mpls")))";
                        junos:must-message "Only one address-family type can be configured per condition";
                        type union {
                          type jt:interface-name;
                          type string {
                            pattern "<.*>|$.*";
                          }
                        }
                        description
                          "Logical interface used to establish ccc route";
                      }
    
                      leaf table {
                        type string;
                        description
                          "Routing table in which route should exist";
                      }
    
                      leaf standby {
                        type empty;
                        description
                          "Indicates if route must be in standby state to be considered a match";
                      }
    
                      leaf peer-unit {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 8192";
                          }
                        }
                        description
                          "Associated LT ifl's peer-unit. Required for LT-based routes";
                      }
                    }  // container ccc
                  }  // choice address-family
                }  // container address-family
    
                leaf address {
                  junos:must "(!(".. address-family"))";
                  junos:must-message "Explicit address-family previously configured. Only one address-family type can be configured per condition";
                  type jt:ipprefix;
                  description
                    "Exact address of the route";
                }
    
                leaf table {
                  junos:must "(!(".. address-family"))";
                  junos:must-message "Explicit address-family previously configured. No route-table is allowed at this level";
                  type string;
                  description
                    "Routing table in which route should exist";
                }
              }  // container if-route-exists
            }  // choice condition_type
          }  // list condition
    
          list rtf-prefix-list {
            key "name";
            ordered-by user;
            description
              "Define a named set of family route target prefixes";
            leaf name {
              type string;
              description "RTF prefix list name";
            }
    
            uses apply-advanced;
    
            list prefix-list {
              key "name";
              uses rtf_prefix_list_items;
            }  // list prefix-list
          }  // list rtf-prefix-list
    
          list resolution-map {
            key "name";
            ordered-by user;
            description
              "Define a set of PNH resolution modes";
            leaf name {
              type string;
              description "Resolution Map name";
            }
    
            uses apply-advanced;
    
            leaf-list mode {
              type enumeration {
                enum "ip-color" {
                  value 0;
                  description
                    "Colored-IP PNH Resolution Mode";
                }
                enum "color-only" {
                  value 1;
                  description
                    "Color-only PNH Resolution Mode";
                }
              }
              ordered-by user;
              description
                "List of resolution modes in order that defines fallback mechanism";
            }
          }  // list resolution-map
    
          list application-maps {
            key "name";
            ordered-by user;
            description
              "Define application maps";
            uses application_map_object;
          }  // list application-maps
    
          list redundancy-policy {
            key "name";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Redundancy policy name";
            }
    
            uses apply-advanced;
    
            leaf-list redundancy-events {
              type string;
              description
                "Events related services redundancy under event-options";
            }
    
            container then {
              junos:must "(".. redundancy-events")";
              junos:must-message "Redundancy policy needs to have a redundancy-events-then condition";
              presence "enable then";
              description
                "Action to take when of the event occurs";
              uses srd-ev-action-object;
            }  // container then
          }  // list redundancy-policy
        }  // grouping juniper-policy-options
    
        grouping application_map_object {
          leaf name {
            type string {
              junos:posix-pattern "^[[:alnum:]][[:alnum:]_-]*$";
              junos:pattern-message "Must be a string beginning with a number or letter and consisting of letters, numbers, dashes and underscores.";
              length "1 .. 63";
            }
            description
              "Name of application map";
          }
    
          uses apply-advanced;
    
          list application {
            key "name";
            ordered-by user;
            description
              "Name of the application";
            leaf name {
              junos:must "("applications application $$")";
              junos:must-message "The referenced application is not defined";
              type string {
                length "1 .. 63";
              }
              description
                "Name of the application";
            }
    
            leaf-list code-points {
              type string;
              ordered-by user;
              description
                "List of code point bit strings";
            }
          }  // list application
        }  // grouping application_map_object
    
        grouping apply-advanced {
          description
            "Apply advanced configuration logic";
          leaf-list apply-groups {
            type string;
            ordered-by user;
            description
              "Groups from which to inherit configuration data";
          }
    
          leaf-list apply-groups-except {
            type string;
            ordered-by user;
            description
              "Don't inherit configuration data from these groups";
          }
    
          list apply-macro {
            key "name";
            ordered-by user;
            description
              "Macro and parameters for commit script expansion";
            uses apply-macro-type;
          }  // list apply-macro
        }  // grouping apply-advanced
    
        grouping apply-macro-type {
          description
            "Macro data for commit-script expansion";
          leaf name {
            type string;
            description
              "Name of the macro to be expanded";
          }
    
          list data {
            key "name";
            uses macro-data-type;
          }  // list data
        }  // grouping apply-macro-type
    
        grouping as-path-calc-length-type {
          description
            "Calculated BGP AS_PATH length per BGP rules";
          leaf name {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 1024";
              }
            }
            description "Number of ASes";
          }
    
          choice count-operator {
            leaf equal {
              type empty;
              description "Match equal values";
            }
            leaf orhigher {
              type empty;
              description
                "Match higher or equal values";
            }
            leaf orlower {
              type empty;
              description
                "Match lower or equal values";
            }
          }  // choice count-operator
        }  // grouping as-path-calc-length-type
    
        grouping as-path-unique-count-type {
          description
            "Number of unique BGP ASes excluding confederation ASes";
          leaf name {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 1024";
              }
            }
            description "Number of ASes";
          }
    
          choice count-operator {
            leaf equal {
              type empty;
              description "Match equal values";
            }
            leaf orhigher {
              type empty;
              description
                "Match higher or equal values";
            }
            leaf orlower {
              type empty;
              description
                "Match lower or equal values";
            }
          }  // choice count-operator
        }  // grouping as-path-unique-count-type
    
        grouping community_count_type {
          description
            "Number of BGP communities";
          leaf name {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 1024";
              }
            }
            description "Number of communities";
          }
    
          choice count-operator {
            leaf equal {
              type empty;
              description "Match equal values";
            }
            leaf orhigher {
              type empty;
              description
                "Match higher or equal	values";
            }
            leaf orlower {
              type empty;
              description
                "Match lower or equal values";
            }
          }  // choice count-operator
        }  // grouping community_count_type
    
        grouping control_as_list_type {
          leaf list-type {
            type enumeration {
              enum "as-list" {
                value 0;
                description " Type as-list";
              }
              enum "as-list-group" {
                value 1;
                description "Type as-list-group";
              }
            }
            description
              "Type as-list or as-list-group";
          }
    
          leaf list-name {
            type string;
            description
              "Name of as-list or as-list-group";
          }
    
          uses apply-advanced;
        }  // grouping control_as_list_type
    
        grouping control_mac_address_filter_list_type {
          leaf name {
            type string;
            description
              "Name of mac-filter-list of macs to match";
          }
    
          uses apply-advanced;
        }  // grouping control_mac_address_filter_list_type
    
        grouping control_prefix_list_filter_type {
          leaf list_name {
            type string;
            description
              "Name of prefix-list of routes to match";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "apply-advanced" {
                value 3;
              }
              enum "metric" {
                value 4;
              }
              enum "metric2" {
                value 5;
              }
              enum "metric3" {
                value 6;
              }
              enum "metric4" {
                value 7;
              }
              enum "tag" {
                value 8;
              }
              enum "tag2" {
                value 9;
              }
              enum "preference" {
                value 10;
              }
              enum "preference2" {
                value 11;
              }
              enum "color" {
                value 12;
              }
              enum "color2" {
                value 13;
              }
              enum "local-preference" {
                value 14;
              }
              enum "priority" {
                value 15;
              }
              enum "prefix-segment" {
                value 16;
              }
              enum "label-allocation" {
                value 17;
              }
              enum "add-path" {
                value 18;
              }
              enum "validation-state" {
                value 19;
              }
              enum "origin" {
                value 20;
              }
              enum "aigp-originate" {
                value 21;
              }
              enum "aigp-adjust" {
                value 22;
              }
              enum "community" {
                value 23;
              }
              enum "tunnel-attribute" {
                value 24;
              }
              enum "damping" {
                value 25;
              }
              enum "aggregate-bandwidth" {
                value 26;
              }
              enum "limit-bandwidth" {
                value 27;
              }
              enum "no-entropy-label-capability" {
                value 28;
              }
              enum "as-path-prepend" {
                value 29;
              }
              enum "as-path-expand" {
                value 30;
              }
              enum "next-hop" {
                value 31;
              }
              enum "install-nexthop" {
                value 32;
              }
              enum "trace" {
                value 33;
              }
              enum "external" {
                value 34;
              }
              enum "load-balance" {
                value 35;
              }
              enum "no-route-localize" {
                value 36;
              }
              enum "install-to-fib" {
                value 37;
              }
              enum "analyze" {
                value 38;
              }
              enum "class" {
                value 39;
              }
              enum "destination-class" {
                value 40;
              }
              enum "source-class" {
                value 41;
              }
              enum "forwarding-class" {
                value 42;
              }
              enum "map-to-interface" {
                value 43;
              }
              enum "ssm-source" {
                value 44;
              }
              enum "p2mp-lsp-root" {
                value 45;
              }
              enum "cos-next-hop-map" {
                value 46;
              }
              enum "dynamic-tunnel-attributes" {
                value 47;
              }
              enum "tunnel-end-point-address" {
                value 48;
              }
              enum "selected-mldp-egress" {
                value 49;
              }
              enum "mhop-bfd-port" {
                value 50;
              }
              enum "no-backup" {
                value 51;
              }
              enum "default-action" {
                value 52;
              }
              enum "next" {
                value 53;
              }
              enum "accept_reject" {
                value 54;
              }
              enum "bgp-output-queue-priority" {
                value 55;
              }
              enum "multipath-resolve" {
                value 56;
              }
              enum
                "source-routing-path-template" {
                value 57;
              }
              enum
                "label-allocation-fallback-reject" {
                value 58;
              }
              enum "resolution-map" {
                value 59;
              }
              enum "ignore-service-label" {
                value 60;
              }
              enum "request-long-lived-ack" {
                value 61;
              }
              enum
                "send-withdrawal-on-route-change" {
                value 62;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          uses apply-advanced;
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping control_prefix_list_filter_type
    
        grouping control_prefix_list_type {
          leaf name {
            type string;
            description
              "Name of prefix-list of routes to match";
          }
    
          uses apply-advanced;
        }  // grouping control_prefix_list_type
    
        grouping control_route_filter_list_type {
          leaf name {
            type string;
            description
              "Name of route-filter-list of routes to match";
          }
    
          uses apply-advanced;
    
          choice modifier {
            leaf exact {
              type empty;
              description
                "Exactly match the prefix length";
            }
            leaf longer {
              type empty;
              description
                "Mask is greater than the prefix length";
            }
            leaf orlonger {
              type empty;
              description
                "Mask is greater than or equal to the prefix length";
            }
            leaf upto {
              type string {
                junos:posix-pattern "^/[[:digit:]]+$";
                junos:pattern-message "Should be number with prefix '/'";
              }
              description
                "Mask falls between two prefix lengths";
            }
            leaf prefix-length-range {
              type string {
                junos:posix-pattern "^/[[:digit:]]+-/[[:digit:]]+$";
                junos:pattern-message "Must be in the form '/<minimum-length>-/<maximum-length>'";
              }
              description
                "Mask falls between two prefix lengths";
            }
          }  // choice modifier
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping control_route_filter_list_type
    
        grouping control_route_filter_type {
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "address-mask" {
                value 6;
              }
              enum "apply-advanced" {
                value 7;
              }
              enum "label" {
                value 8;
              }
              enum "get-route-range" {
                value 9;
              }
              enum "metric" {
                value 10;
              }
              enum "metric2" {
                value 11;
              }
              enum "metric3" {
                value 12;
              }
              enum "metric4" {
                value 13;
              }
              enum "tag" {
                value 14;
              }
              enum "tag2" {
                value 15;
              }
              enum "preference" {
                value 16;
              }
              enum "preference2" {
                value 17;
              }
              enum "color" {
                value 18;
              }
              enum "color2" {
                value 19;
              }
              enum "local-preference" {
                value 20;
              }
              enum "priority" {
                value 21;
              }
              enum "prefix-segment" {
                value 22;
              }
              enum "label-allocation" {
                value 23;
              }
              enum "add-path" {
                value 24;
              }
              enum "validation-state" {
                value 25;
              }
              enum "origin" {
                value 26;
              }
              enum "aigp-originate" {
                value 27;
              }
              enum "aigp-adjust" {
                value 28;
              }
              enum "community" {
                value 29;
              }
              enum "tunnel-attribute" {
                value 30;
              }
              enum "damping" {
                value 31;
              }
              enum "aggregate-bandwidth" {
                value 32;
              }
              enum "limit-bandwidth" {
                value 33;
              }
              enum "no-entropy-label-capability" {
                value 34;
              }
              enum "as-path-prepend" {
                value 35;
              }
              enum "as-path-expand" {
                value 36;
              }
              enum "next-hop" {
                value 37;
              }
              enum "install-nexthop" {
                value 38;
              }
              enum "trace" {
                value 39;
              }
              enum "external" {
                value 40;
              }
              enum "load-balance" {
                value 41;
              }
              enum "no-route-localize" {
                value 42;
              }
              enum "install-to-fib" {
                value 43;
              }
              enum "analyze" {
                value 44;
              }
              enum "class" {
                value 45;
              }
              enum "destination-class" {
                value 46;
              }
              enum "source-class" {
                value 47;
              }
              enum "forwarding-class" {
                value 48;
              }
              enum "map-to-interface" {
                value 49;
              }
              enum "ssm-source" {
                value 50;
              }
              enum "p2mp-lsp-root" {
                value 51;
              }
              enum "cos-next-hop-map" {
                value 52;
              }
              enum "dynamic-tunnel-attributes" {
                value 53;
              }
              enum "tunnel-end-point-address" {
                value 54;
              }
              enum "selected-mldp-egress" {
                value 55;
              }
              enum "mhop-bfd-port" {
                value 56;
              }
              enum "no-backup" {
                value 57;
              }
              enum "default-action" {
                value 58;
              }
              enum "next" {
                value 59;
              }
              enum "accept_reject" {
                value 60;
              }
              enum "bgp-output-queue-priority" {
                value 61;
              }
              enum "multipath-resolve" {
                value 62;
              }
              enum
                "source-routing-path-template" {
                value 63;
              }
              enum
                "label-allocation-fallback-reject" {
                value 64;
              }
              enum "resolution-map" {
                value 65;
              }
              enum "ignore-service-label" {
                value 66;
              }
              enum "request-long-lived-ack" {
                value 67;
              }
              enum
                "send-withdrawal-on-route-change" {
                value 68;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          uses apply-advanced;
    
          container label {
            description
              "Set label for BGP LU label allocation";
            choice label_value {
              container range {
                description "Label range";
                choice range_value {
                  leaf range {
                    type string {
                      junos:posix-pattern "^[0-9]+:[0-9]+$";
                      junos:pattern-message "Use format 'x:y' where 'x' is start of label range and 'y' is end of label range. e.g. 1000000:1000500";
                    }
                    description
                      "Label range in <start>:<end> format";
                  }
                }  // choice range_value
              }  // container range
              leaf label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1048575";
                  }
                }
                description "Label value";
              }
            }  // choice label_value
          }  // container label
    
          leaf get-route-range {
            type empty;
            description "Get the range";
          }
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping control_route_filter_type
    
        grouping control_rtf_prefix_list_type {
          description "RTF prefix list";
          leaf name {
            type string;
            description
              "Name of rtf-prefix-list of routes to match";
          }
    
          uses apply-advanced;
        }  // grouping control_rtf_prefix_list_type
    
        grouping control_source_address_filter_list_type {
          leaf name {
            type string;
            description
              "Name of source-address-filter-list of routes to match";
          }
    
          uses apply-advanced;
        }  // grouping control_source_address_filter_list_type
    
        grouping control_source_address_filter_type {
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "apply-advanced" {
                value 6;
              }
              enum "metric" {
                value 7;
              }
              enum "metric2" {
                value 8;
              }
              enum "metric3" {
                value 9;
              }
              enum "metric4" {
                value 10;
              }
              enum "tag" {
                value 11;
              }
              enum "tag2" {
                value 12;
              }
              enum "preference" {
                value 13;
              }
              enum "preference2" {
                value 14;
              }
              enum "color" {
                value 15;
              }
              enum "color2" {
                value 16;
              }
              enum "local-preference" {
                value 17;
              }
              enum "priority" {
                value 18;
              }
              enum "prefix-segment" {
                value 19;
              }
              enum "label-allocation" {
                value 20;
              }
              enum "add-path" {
                value 21;
              }
              enum "validation-state" {
                value 22;
              }
              enum "origin" {
                value 23;
              }
              enum "aigp-originate" {
                value 24;
              }
              enum "aigp-adjust" {
                value 25;
              }
              enum "community" {
                value 26;
              }
              enum "tunnel-attribute" {
                value 27;
              }
              enum "damping" {
                value 28;
              }
              enum "aggregate-bandwidth" {
                value 29;
              }
              enum "limit-bandwidth" {
                value 30;
              }
              enum "no-entropy-label-capability" {
                value 31;
              }
              enum "as-path-prepend" {
                value 32;
              }
              enum "as-path-expand" {
                value 33;
              }
              enum "next-hop" {
                value 34;
              }
              enum "install-nexthop" {
                value 35;
              }
              enum "trace" {
                value 36;
              }
              enum "external" {
                value 37;
              }
              enum "load-balance" {
                value 38;
              }
              enum "no-route-localize" {
                value 39;
              }
              enum "install-to-fib" {
                value 40;
              }
              enum "analyze" {
                value 41;
              }
              enum "class" {
                value 42;
              }
              enum "destination-class" {
                value 43;
              }
              enum "source-class" {
                value 44;
              }
              enum "forwarding-class" {
                value 45;
              }
              enum "map-to-interface" {
                value 46;
              }
              enum "ssm-source" {
                value 47;
              }
              enum "p2mp-lsp-root" {
                value 48;
              }
              enum "cos-next-hop-map" {
                value 49;
              }
              enum "dynamic-tunnel-attributes" {
                value 50;
              }
              enum "tunnel-end-point-address" {
                value 51;
              }
              enum "selected-mldp-egress" {
                value 52;
              }
              enum "mhop-bfd-port" {
                value 53;
              }
              enum "no-backup" {
                value 54;
              }
              enum "default-action" {
                value 55;
              }
              enum "next" {
                value 56;
              }
              enum "accept_reject" {
                value 57;
              }
              enum "bgp-output-queue-priority" {
                value 58;
              }
              enum "multipath-resolve" {
                value 59;
              }
              enum
                "source-routing-path-template" {
                value 60;
              }
              enum
                "label-allocation-fallback-reject" {
                value 61;
              }
              enum "resolution-map" {
                value 62;
              }
              enum "ignore-service-label" {
                value 63;
              }
              enum "request-long-lived-ack" {
                value 64;
              }
              enum
                "send-withdrawal-on-route-change" {
                value 65;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          uses apply-advanced;
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping control_source_address_filter_type
    
        grouping mac_addr_list_items {
          leaf name {
            type jt:mac-addr;
            description "Mac Address";
          }
    
          uses apply-advanced;
        }  // grouping mac_addr_list_items
    
        grouping macro-data-type {
          leaf name {
            type string;
            description
              "Keyword part of the keyword-value pair";
          }
    
          leaf value {
            type string;
            description
              "Value part of the keyword-value pair";
          }
        }  // grouping macro-data-type
    
        grouping metric_expression_type {
          uses apply-advanced;
    
          container metric {
            description
              "Parameters for metric attribute";
            leaf multiplier {
              type decimal64 {
                fraction-digits 9;
              }
              description
                "Coefficient for metric attribute";
            }
    
            leaf offset {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Offset for metric attribute";
            }
          }  // container metric
    
          container metric2 {
            description
              "Parameters for metric2 attribute";
            leaf multiplier {
              type decimal64 {
                fraction-digits 9;
              }
              default "1.0";
              description
                "Coefficient for metric2 attribute";
            }
    
            leaf offset {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Offset for metric2 attribute";
            }
          }  // container metric2
        }  // grouping metric_expression_type
    
        grouping prefix_list_items {
          leaf name {
            type jt:ipprefix-only;
            description "Address prefix";
          }
    
          uses apply-advanced;
        }  // grouping prefix_list_items
    
        grouping route_filter_list_items {
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "address-mask" {
                value 6;
              }
              enum "apply-advanced" {
                value 7;
              }
              enum "label" {
                value 8;
              }
              enum "get-route-range" {
                value 9;
              }
              enum "metric" {
                value 10;
              }
              enum "metric2" {
                value 11;
              }
              enum "metric3" {
                value 12;
              }
              enum "metric4" {
                value 13;
              }
              enum "tag" {
                value 14;
              }
              enum "tag2" {
                value 15;
              }
              enum "preference" {
                value 16;
              }
              enum "preference2" {
                value 17;
              }
              enum "color" {
                value 18;
              }
              enum "color2" {
                value 19;
              }
              enum "local-preference" {
                value 20;
              }
              enum "priority" {
                value 21;
              }
              enum "prefix-segment" {
                value 22;
              }
              enum "label-allocation" {
                value 23;
              }
              enum "add-path" {
                value 24;
              }
              enum "validation-state" {
                value 25;
              }
              enum "origin" {
                value 26;
              }
              enum "aigp-originate" {
                value 27;
              }
              enum "aigp-adjust" {
                value 28;
              }
              enum "community" {
                value 29;
              }
              enum "tunnel-attribute" {
                value 30;
              }
              enum "damping" {
                value 31;
              }
              enum "aggregate-bandwidth" {
                value 32;
              }
              enum "limit-bandwidth" {
                value 33;
              }
              enum "no-entropy-label-capability" {
                value 34;
              }
              enum "as-path-prepend" {
                value 35;
              }
              enum "as-path-expand" {
                value 36;
              }
              enum "next-hop" {
                value 37;
              }
              enum "install-nexthop" {
                value 38;
              }
              enum "trace" {
                value 39;
              }
              enum "external" {
                value 40;
              }
              enum "load-balance" {
                value 41;
              }
              enum "no-route-localize" {
                value 42;
              }
              enum "install-to-fib" {
                value 43;
              }
              enum "analyze" {
                value 44;
              }
              enum "class" {
                value 45;
              }
              enum "destination-class" {
                value 46;
              }
              enum "source-class" {
                value 47;
              }
              enum "forwarding-class" {
                value 48;
              }
              enum "map-to-interface" {
                value 49;
              }
              enum "ssm-source" {
                value 50;
              }
              enum "p2mp-lsp-root" {
                value 51;
              }
              enum "cos-next-hop-map" {
                value 52;
              }
              enum "dynamic-tunnel-attributes" {
                value 53;
              }
              enum "tunnel-end-point-address" {
                value 54;
              }
              enum "selected-mldp-egress" {
                value 55;
              }
              enum "mhop-bfd-port" {
                value 56;
              }
              enum "no-backup" {
                value 57;
              }
              enum "default-action" {
                value 58;
              }
              enum "next" {
                value 59;
              }
              enum "accept_reject" {
                value 60;
              }
              enum "bgp-output-queue-priority" {
                value 61;
              }
              enum "multipath-resolve" {
                value 62;
              }
              enum
                "source-routing-path-template" {
                value 63;
              }
              enum
                "label-allocation-fallback-reject" {
                value 64;
              }
              enum "resolution-map" {
                value 65;
              }
              enum "ignore-service-label" {
                value 66;
              }
              enum "request-long-lived-ack" {
                value 67;
              }
              enum
                "send-withdrawal-on-route-change" {
                value 68;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          uses apply-advanced;
    
          container label {
            description
              "Set label for BGP LU label allocation";
            choice label_value {
              container range {
                description "Label range";
                choice range_value {
                  leaf range {
                    type string {
                      junos:posix-pattern "^[0-9]+:[0-9]+$";
                      junos:pattern-message "Use format 'x:y' where 'x' is start of label range and 'y' is end of label range. e.g. 1000000:1000500";
                    }
                    description
                      "Label range in <start>:<end> format";
                  }
                }  // choice range_value
              }  // container range
              leaf label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1048575";
                  }
                }
                description "Label value";
              }
            }  // choice label_value
          }  // container label
    
          leaf get-route-range {
            type empty;
            description "Get the range";
          }
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping route_filter_list_items
    
        grouping rtf_prefix_list_items {
          leaf name {
            type string {
              junos:posix-pattern "^[0-9]{1,15}:[0-9.]{1,15}L?:[0-9]{1,10}/(0|3[2-9]|[4-8][0-9]|9[0-6])$";
              junos:pattern-message "Use format 'as:x:y/len' where 'as' is an AS number and 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100 and len is a prefix length from 32 to 96 or 0";
              length "1 .. 63";
            }
            description
              "Family route-target prefix";
          }
    
          uses apply-advanced;
        }  // grouping rtf_prefix_list_items
    
        grouping satellite-policy-options {
          uses apply-advanced;
    
          list extended-ports-template {
            key "name";
            ordered-by user;
            description
              "Extended ports template";
            leaf name {
              type string {
                length "1 .. 32";
              }
            }
    
            uses apply-advanced;
    
            list pic {
              key "name";
              description "PIC attributes";
              uses satellite-pic-type;
            }  // list pic
          }  // list extended-ports-template
    
          list port-group-alias {
            key "name";
            ordered-by user;
            description "Port group alias";
            leaf name {
              type string {
                length "1 .. 32";
              }
            }
    
            uses apply-advanced;
    
            list pic {
              key "name";
              ordered-by user;
              description
                "Satellite PIC information";
              leaf name {
                type union {
                  type int32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "PIC identifier";
              }
    
              uses apply-advanced;
    
              leaf-list port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1024";
                  }
                }
                ordered-by user;
                description
                  "Port id or range or all";
              }
            }  // list pic
          }  // list port-group-alias
    
          list chassis-group-alias {
            key "name";
            ordered-by user;
            description "Chassis group alias";
            leaf name {
              type string {
                length "1 .. 32";
              }
              description
                "Chassis group alias name";
            }
    
            uses apply-advanced;
    
            leaf prefer-primary {
              type empty;
              description
                "Primary mode chassis will be preferred";
            }
    
            list chassis-id {
              key "name";
              ordered-by user;
              description "List of chassis-ids";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description "Chassis ID";
              }
    
              uses apply-advanced;
    
              container mode {
                description
                  "Mode Primary or Backup";
                uses apply-advanced;
    
                choice mode-choice {
                  leaf primary {
                    type empty;
                    description "Primary Mode";
                  }
                  leaf backup {
                    type empty;
                    description "Backup Mode";
                  }
                }  // choice mode-choice
              }  // container mode
    
              list core-interface {
                key "name";
                ordered-by user;
                description "Core interface";
                leaf name {
                  type union {
                    type jt:interface-device;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Core interface name";
                }
    
                uses apply-advanced;
              }  // list core-interface
            }  // list chassis-id
          }  // list chassis-group-alias
    
          list extended-ports-policy {
            key "name";
            ordered-by user;
            description
              "Define a extended-ports-policy";
            leaf name {
              type string {
                length "1 .. 32";
              }
              description "Policy name";
            }
    
            uses apply-advanced;
    
            list term {
              key "name";
              ordered-by user;
              description "Policy term";
              leaf name {
                type string {
                  length "1 .. 32";
                }
              }
    
              uses apply-advanced;
    
              container from {
                description
                  "Condition to match the satellite";
                uses apply-advanced;
    
                leaf-list product-model {
                  type string {
                    length "1 .. 64";
                  }
                  ordered-by user;
                  description
                    "Product Model Name";
                }
    
                leaf extended-ports-template {
                  junos:must "("policy-options satellite-policies extended-ports-template $$")";
                  junos:must-message "Extended ports template not defined";
                  type string;
                  description
                    "Apply extended ports template to satellite matching conditions defined in this term";
                }
              }  // container from
            }  // list term
          }  // list extended-ports-policy
    
          list candidate-uplink-port-policy {
            key "name";
            ordered-by user;
            description
              "Define a candidate uplink-port policy";
            leaf name {
              type string {
                length "1 .. 32";
              }
              description "Policy name";
            }
    
            uses apply-advanced;
    
            leaf uplink-port-group {
              junos:must "("policy-options satellite-policies port-group-alias $$")";
              junos:must-message "port-group-alias not defined";
              type string;
              description
                "Uplink port group alias name";
            }
    
            leaf minimum-links {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 32";
                }
              }
              description
                "Minimum child links to keep extended-ports UP";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              units "seconds";
              description
                "Time to hold down after uplink failure";
            }
    
            list term {
              key "name";
              ordered-by user;
              description "Policy term";
              leaf name {
                type string {
                  length "1 .. 32";
                }
              }
    
              uses apply-advanced;
    
              container from {
                description
                  "Condition to match the satellite";
                uses apply-advanced;
    
                leaf-list product-model {
                  type string {
                    length "1 .. 64";
                  }
                  ordered-by user;
                  description
                    "Product Model Name";
                }
    
                leaf uplink-port-group {
                  junos:must "("policy-options satellite-policies port-group-alias $$")";
                  junos:must-message "port-group-alias not defined";
                  type string;
                  description
                    "Uplink port group alias name";
                }
    
                leaf minimum-links {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 32";
                    }
                  }
                  description
                    "Minimum child links to keep extended-ports UP";
                }
    
                leaf holddown {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to hold down after uplink failure";
                }
              }  // container from
            }  // list term
          }  // list candidate-uplink-port-policy
    
          list environment-monitoring-policy {
            key "name";
            ordered-by user;
            description
              "Define a environment monitoring policy";
            leaf name {
              type string {
                length "1 .. 32";
              }
              description "Policy name";
            }
    
            uses apply-advanced;
    
            container alarm {
              presence "enable alarm";
              description
                "Policy default alarm policy";
              uses apply-advanced;
    
              leaf linkdown {
                type enumeration {
                  enum "ignore" {
                    value 0;
                    description
                      "Ignore ethernet linkdown";
                  }
                  enum "red" {
                    value 1;
                    description
                      "Raise major alarm for ethernet linkdown";
                  }
                  enum "yellow" {
                    value 2;
                    description
                      "Raise minor alarm for ethernet linkdown";
                  }
                }
                description
                  "Policy default linkdown alarm";
              }
            }  // container alarm
    
            list term {
              key "name";
              ordered-by user;
              description "Policy term";
              leaf name {
                type string {
                  length "1 .. 32";
                }
              }
    
              uses apply-advanced;
    
              container from {
                description
                  "Condition to match the satellite";
                uses apply-advanced;
    
                leaf-list product-model {
                  type string {
                    length "1 .. 64";
                  }
                  ordered-by user;
                  description
                    "Product Model Name";
                }
    
                container alarm {
                  presence "enable alarm";
                  description
                    "Term alarm policy";
                  uses apply-advanced;
    
                  leaf linkdown {
                    type enumeration {
                      enum "ignore" {
                        value 0;
                        description
                          "Ignore ethernet linkdown";
                      }
                      enum "red" {
                        value 1;
                        description
                          "Raise major alarm for ethernet linkdown";
                      }
                      enum "yellow" {
                        value 2;
                        description
                          "Raise minor alarm for ethernet linkdown";
                      }
                    }
                    description
                      "Set linkdown alarm";
                  }
                }  // container alarm
              }  // container from
            }  // list term
          }  // list environment-monitoring-policy
    
          list forwarding-policy {
            key "name";
            ordered-by user;
            description
              "Define forwarding policy for extended ports";
            leaf name {
              type string {
                length "1 .. 32";
              }
              description "Policy name";
            }
    
            uses apply-advanced;
    
            list port-group-extended {
              key "name";
              ordered-by user;
              description
                "Define a extend port group mapping";
              uses port-extend-type;
            }  // list port-group-extended
    
            list term {
              key "name";
              ordered-by user;
              description "Policy term";
              leaf name {
                type string {
                  length "1 .. 32";
                }
              }
    
              uses apply-advanced;
    
              container from {
                description
                  "Condition to match the satellite";
                uses apply-advanced;
    
                leaf-list product-model {
                  type string {
                    length "1 .. 64";
                  }
                  ordered-by user;
                  description
                    "Product Model Name";
                }
    
                list port-group-extended {
                  key "name";
                  ordered-by user;
                  description
                    "Define a extend port group mapping";
                  uses port-extend-type;
                }  // list port-group-extended
              }  // container from
            }  // list term
          }  // list forwarding-policy
        }  // grouping satellite-policy-options
    
        grouping port-extend-type {
          leaf name {
            type string;
            description
              "Extended port group alias name policy applied on";
          }
    
          uses apply-advanced;
    
          leaf filter {
            junos:must "(("chassis satellite-management firewall family bridge filter $$" || "chassis satellite-management firewall family ethernet-switching filter $$"))";
            junos:must-message "Filter should be defined under 'chassis satellite-management firewall family bridge filter'";
            type string;
            description
              "Assign a filter for uplink selection";
          }
    
          container port-group-uplink {
            description
              "Define a uplink port group mapping";
            uses apply-advanced;
    
            leaf port-group-uplink-alias {
              junos:must "("policy-options satellite-policies port-group-alias $$")";
              junos:must-message "port-group-alias not defined";
              type string;
              description
                "Uplink port group alias name used for uplink pinning mode";
            }
    
            leaf minimum-links {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 32";
                }
              }
              description
                "Minimum child links to keep extended-ports UP";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              units "seconds";
              description
                "Time to hold down after uplink failure";
            }
          }  // container port-group-uplink
    
          container mirror-ingress {
            description
              "Define a ingress port mirror";
            uses apply-advanced;
    
            leaf port-group-mirror {
              junos:must "("policy-options satellite-policies port-group-alias $$")";
              junos:must-message "port-group-alias not defined";
              type string;
              description
                "Mirror port group alias name for local port mirroring";
            }
          }  // container mirror-ingress
    
          container mirror-egress {
            description
              "Define a egress port mirror";
            uses apply-advanced;
    
            leaf port-group-mirror {
              junos:must "("policy-options satellite-policies port-group-alias $$")";
              junos:must-message "port-group-alias not defined";
              type string;
              description
                "Mirror port group alias name for local port mirroring";
            }
          }  // container mirror-egress
        }  // grouping port-extend-type
    
        grouping satellite-pic-type {
          leaf name {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4";
              }
            }
            description "PIC slot number";
          }
    
          uses apply-advanced;
    
          list port {
            key "name";
            description "Port number";
            uses satellite-pic-port-attr;
          }  // list port
    
          list port-range {
            key "port-range-low port-range-high";
            ordered-by user;
            description
              "Physical ports to channelize";
            leaf port-range-low {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 127";
                }
              }
              description
                "Port range low number";
            }
    
            leaf port-range-high {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 127";
                }
              }
              description
                "Port range high number";
            }
    
            uses apply-advanced;
    
            leaf channel-speed {
              type enumeration {
                enum "10g" {
                  value 0;
                  description
                    "Set the port speed to 10G";
                }
                enum
                  "disable-auto-speed-detection" {
                  value 1;
                  description
                    "Disables automatic speed detection";
                }
              }
              description "Port channel speed";
            }
          }  // list port-range
        }  // grouping satellite-pic-type
    
        grouping satellite-pic-port-attr {
          leaf name {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 127";
              }
            }
            description "Port number";
          }
    
          uses apply-advanced;
    
          leaf channel-speed {
            type enumeration {
              enum "10g" {
                value 0;
                description
                  "Set the port speed to 10G";
              }
              enum "25g" {
                value 1;
                description
                  "Set the port speed to 25G";
              }
              enum "50g" {
                value 2;
                description
                  "Set the port speed to 50G";
              }
              enum
                "disable-auto-speed-detection" {
                value 3;
                description
                  "Disables automatic speed detection";
              }
            }
            description "Port channel speed";
          }
        }  // grouping satellite-pic-port-attr
    
        grouping source_address_filter_list_items {
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "apply-advanced" {
                value 6;
              }
              enum "metric" {
                value 7;
              }
              enum "metric2" {
                value 8;
              }
              enum "metric3" {
                value 9;
              }
              enum "metric4" {
                value 10;
              }
              enum "tag" {
                value 11;
              }
              enum "tag2" {
                value 12;
              }
              enum "preference" {
                value 13;
              }
              enum "preference2" {
                value 14;
              }
              enum "color" {
                value 15;
              }
              enum "color2" {
                value 16;
              }
              enum "local-preference" {
                value 17;
              }
              enum "priority" {
                value 18;
              }
              enum "prefix-segment" {
                value 19;
              }
              enum "label-allocation" {
                value 20;
              }
              enum "add-path" {
                value 21;
              }
              enum "validation-state" {
                value 22;
              }
              enum "origin" {
                value 23;
              }
              enum "aigp-originate" {
                value 24;
              }
              enum "aigp-adjust" {
                value 25;
              }
              enum "community" {
                value 26;
              }
              enum "tunnel-attribute" {
                value 27;
              }
              enum "damping" {
                value 28;
              }
              enum "aggregate-bandwidth" {
                value 29;
              }
              enum "limit-bandwidth" {
                value 30;
              }
              enum "no-entropy-label-capability" {
                value 31;
              }
              enum "as-path-prepend" {
                value 32;
              }
              enum "as-path-expand" {
                value 33;
              }
              enum "next-hop" {
                value 34;
              }
              enum "install-nexthop" {
                value 35;
              }
              enum "trace" {
                value 36;
              }
              enum "external" {
                value 37;
              }
              enum "load-balance" {
                value 38;
              }
              enum "no-route-localize" {
                value 39;
              }
              enum "install-to-fib" {
                value 40;
              }
              enum "analyze" {
                value 41;
              }
              enum "class" {
                value 42;
              }
              enum "destination-class" {
                value 43;
              }
              enum "source-class" {
                value 44;
              }
              enum "forwarding-class" {
                value 45;
              }
              enum "map-to-interface" {
                value 46;
              }
              enum "ssm-source" {
                value 47;
              }
              enum "p2mp-lsp-root" {
                value 48;
              }
              enum "cos-next-hop-map" {
                value 49;
              }
              enum "dynamic-tunnel-attributes" {
                value 50;
              }
              enum "tunnel-end-point-address" {
                value 51;
              }
              enum "selected-mldp-egress" {
                value 52;
              }
              enum "mhop-bfd-port" {
                value 53;
              }
              enum "no-backup" {
                value 54;
              }
              enum "default-action" {
                value 55;
              }
              enum "next" {
                value 56;
              }
              enum "accept_reject" {
                value 57;
              }
              enum "bgp-output-queue-priority" {
                value 58;
              }
              enum "multipath-resolve" {
                value 59;
              }
              enum
                "source-routing-path-template" {
                value 60;
              }
              enum
                "label-allocation-fallback-reject" {
                value 61;
              }
              enum "resolution-map" {
                value 62;
              }
              enum "ignore-service-label" {
                value 63;
              }
              enum "request-long-lived-ack" {
                value 64;
              }
              enum
                "send-withdrawal-on-route-change" {
                value 65;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          uses apply-advanced;
    
          container metric {
            description "Metric value";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container igp
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container expression {
                description
                  "Calculate value based on route metric and metric2";
                uses metric_expression_type;
              }  // container expression
              leaf aigp {
                type empty;
                description
                  "Use aigp, if it exists, to set the IGP metric";
              }
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric (BGP only)";
                leaf metric_offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_action
          }  // container metric
    
          container metric2 {
            description "Metric value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric2
    
          container metric3 {
            description "Metric value 3";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric3 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric3
    
          container metric4 {
            description "Metric value 4";
            uses apply-advanced;
    
            choice metric_action {
              leaf metric4 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container metric4
    
          container tag {
            description "Tag string";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag
    
          container tag2 {
            description "Tag string 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container tag2
    
          container preference {
            description "Preference value";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference
    
          container preference2 {
            description "Preference value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf preference2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container preference2
    
          container color {
            description
              "Color (preference) value";
            uses apply-advanced;
    
            choice metric_action {
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color
    
          container color2 {
            description
              "Color (preference) value 2";
            uses apply-advanced;
    
            choice metric_action {
              leaf color2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container color2
    
          container local-preference {
            description
              "Local preference associated with a route";
            uses apply-advanced;
    
            choice metric_action {
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
              }
              leaf add {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Add constant to attribute";
              }
              leaf subtract {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Subtract constant from attribute";
              }
            }  // choice metric_action
          }  // container local-preference
    
          leaf priority {
            type enumeration {
              enum "high" {
                value 0;
                description
                  "Set priority to high";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "low" {
                value 2;
                description
                  "Set priority to low";
              }
            }
            description
              "Set priority for route installation";
          }
    
          container prefix-segment {
            junos:must "(".. .. then")";
            junos:must-message "prefix-segment is only a then action";
            junos:must "((". index" || ". algorithm"))";
            junos:must-message "atleast one prefix-segment index is mandatory";
            description
              "Set prefix segment attributes";
            uses apply-advanced;
    
            list algorithm {
              key "name";
              max-elements 15;
              description
                "Set prefix segment attributes for strict/flex algorithm ";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Set prefix segment for strict/flex algorithm";
              }
    
              leaf index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set prefix segment index id";
              }
    
              leaf node-segment {
                type empty;
                description
                  "Set node segment flag for this prefix segment";
              }
            }  // list algorithm
    
            leaf index {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 199999";
                }
              }
              description
                "Set prefix segment index id";
            }
    
            leaf node-segment {
              junos:must "(".. index")";
              junos:must-message "default prefix-segment index is mandatory";
              type empty;
              description
                "Set node segment flag for default prefix segment";
            }
          }  // container prefix-segment
    
          leaf label-allocation {
            type enumeration {
              enum "per-table" {
                value 0;
                description
                  "Set per-table label allocation mode";
              }
              enum "per-nexthop" {
                value 1;
                description
                  "Set per-nexthop label allocation mode";
              }
              enum "per-table-localize" {
                value 2;
                description
                  "Set per-table-localize label allocation mode";
              }
            }
            description
              "Set label allocation mode";
          }
    
          container add-path {
            junos:must "((!(".. .. then next-hop self") && !(".. .. then next-hop")))";
            junos:must-message "add-path requires unique next-hops";
            junos:must "(".. .. then")";
            junos:must-message "add-path is only a then action";
            description
              "Set BGP add-path attributes";
            leaf send-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of add-paths sent";
            }
          }  // container add-path
    
          leaf validation-state {
            type enumeration {
              enum "valid" {
                value 0;
                description
                  "Set validaton-state to valid";
              }
              enum "invalid" {
                value 1;
                description
                  "Set validation-state to invalid";
              }
              enum "unknown" {
                value 2;
                description
                  "Set validation-state to unknown";
              }
            }
            description
              "Set validation-state of a route";
          }
    
          leaf origin {
            type enumeration {
              enum "igp" {
                value 0;
                description
                  "Path originated in the local IGP";
              }
              enum "egp" {
                value 1;
                description
                  "Path originated in another AS";
              }
              enum "incomplete" {
                value 2;
                description
                  "Path was learned by some other means";
              }
            }
            description "BGP path origin";
          }
    
          container aigp-originate {
            junos:must "((".. .. then next-hop self" || ".. .. then next-hop"))";
            junos:must-message "aigp-originate requires 'next-hop'";
            presence "enable aigp-originate";
            description
              "Originate a BGP AIGP attribute";
            leaf distance {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "AIGP distance";
            }
          }  // container aigp-originate
    
          container aigp-adjust {
            description
              "Adjust a BGP AIGP attribute";
            choice math-op {
              leaf add {
                type empty;
              }
              leaf subtract {
                type empty;
              }
              leaf multiply {
                type empty;
              }
              leaf divide {
                type empty;
              }
            }  // choice math-op
    
            choice adjust-value {
              leaf user-value {
                type union {
                  type uint64;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Adjustment value";
              }
              leaf distance-to-protocol-nexthop {
                type empty;
                description "Metric2";
              }
            }  // choice adjust-value
          }  // container aigp-adjust
    
          list community {
            key "choice-ident choice-value community-name";
            ordered-by user;
            description
              "BGP community properties associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "equal-literal" {
                  value 0;
                }
                enum "set" {
                  value 1;
                }
                enum "plus-literal" {
                  value 2;
                }
                enum "add" {
                  value 3;
                }
                enum "minus-literal" {
                  value 4;
                }
                enum "delete" {
                  value 5;
                }
                enum "community-name" {
                  value 6;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf community-name {
              type string;
              description
                "Name to identify a BGP community";
            }
          }  // list community
    
          list tunnel-attribute {
            key "choice-ident choice-value tunnel-attribute-name";
            ordered-by user;
            description
              "BGP tunnel attribute associated with a route";
            leaf choice-ident {
              type enumeration {
                enum "set" {
                  value 0;
                }
                enum "remove" {
                  value 1;
                }
                enum "tunnel-attribute-name" {
                  value 2;
                }
              }
            }
    
            leaf choice-value {
              type string;
            }
    
            leaf tunnel-attribute-name {
              type string;
              description
                "Name of a tunnel attribute , or 'all'";
            }
          }  // list tunnel-attribute
    
          leaf damping {
            type string;
            description
              "Define BGP route flap damping parameters";
          }
    
          leaf aggregate-bandwidth {
            type empty;
            description
              "Advertise aggregate outbound link bandwidth";
          }
    
          leaf limit-bandwidth {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Limit advertised aggregate outbound link bandwidth";
          }
    
          leaf no-entropy-label-capability {
            type empty;
            description
              "Don't advertise entropy label capability";
          }
    
          leaf as-path-prepend {
            type string;
            description
              "Prepend AS numbers to an AS path (BGP only)";
          }
    
          container as-path-expand {
            description
              "Prepend AS numbers prior to adding local-as (BGP only)";
            choice aspath_exp_value {
              container last-as {
                presence "enable last-as";
                description "Prepend last AS";
                leaf count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 32";
                    }
                  }
                  description "Repeat count";
                }
              }  // container last-as
              leaf aspath {
                type string;
                description "AS path string";
              }
            }  // choice aspath_exp_value
          }  // container as-path-expand
    
          container next-hop {
            description
              "Set the address of the next-hop router";
            choice nexthop_value {
              leaf self {
                type empty;
                description
                  "Use a local address as the next-hop address";
              }
              leaf peer-address {
                type empty;
                description
                  "Use the remote peer address as the next-hop address";
              }
              leaf address {
                type jt:ipaddr;
                description "Next-hop address";
              }
              leaf reject {
                type empty;
                description
                  "Use a reject next hop";
              }
              leaf discard {
                type empty;
                description
                  "Use a discard next hop";
              }
              leaf next-table {
                type string;
                description
                  "Perform a forwarding lookup in the specified table";
              }
            }  // choice nexthop_value
          }  // container next-hop
    
          container install-nexthop {
            description
              "Choose the next hop to be used for forwarding";
            choice strict_type {
              leaf strict {
                type empty;
                description
                  "Do not use any other available next hops";
              }
              leaf strict-named-lsp {
                junos:must "((".. lsp" || (".. lsp-regex" || (".. static-lsp" || ".. static-lsp-regex"))))";
                junos:must-message "strict-named-lsp cannot be configured with non-lsp or non-labelled";
                type empty;
                description
                  "Do not use any other non-lsp next hops";
              }
            }  // choice strict_type
    
            choice nexthop-value {
              leaf-list lsp {
                type string;
                ordered-by user;
                description "Next-hop LSP name";
              }
              leaf-list lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop LSP name regular expression";
              }
              leaf-list static-lsp {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name";
              }
              leaf-list static-lsp-regex {
                type string;
                ordered-by user;
                description
                  "Next-hop static LSP name regular expression";
              }
              leaf non-lsp-nexthop {
                type empty;
                description
                  "Next-hop with non-lsp";
              }
              leaf non-labelled-nexthop {
                type empty;
                description
                  "Next-hop without tag";
              }
            }  // choice nexthop-value
    
            container except {
              description
                "Do not choose to install matching next hops";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container fallback {
                junos:must "((".. .. strict-named-lsp" || ".. .. strict"))";
                junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
                description "Backup option";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
    
                container except {
                  description
                    "Do not choose to install matching next hops";
                  uses apply-advanced;
    
                  choice nexthop-value {
                    leaf-list lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name";
                    }
                    leaf-list lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop LSP name regular expression";
                    }
                    leaf-list static-lsp {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name";
                    }
                    leaf-list static-lsp-regex {
                      type string;
                      ordered-by user;
                      description
                        "Next-hop static LSP name regular expression";
                    }
                    leaf non-lsp-nexthop {
                      type empty;
                      description
                        "Next-hop with non-lsp";
                    }
                    leaf non-labelled-nexthop {
                      type empty;
                      description
                        "Next-hop without tag";
                    }
                  }  // choice nexthop-value
                }  // container except
              }  // container fallback
            }  // container except
    
            container fallback {
              junos:must "((".. strict-named-lsp" || ".. strict"))";
              junos:must-message "Fallback can be configured only when strict or strict-named-lsp is configured";
              description "Backup option ";
              uses apply-advanced;
    
              choice nexthop-value {
                leaf-list lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name";
                }
                leaf-list lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop LSP name regular expression";
                }
                leaf-list static-lsp {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name";
                }
                leaf-list static-lsp-regex {
                  type string;
                  ordered-by user;
                  description
                    "Next-hop static LSP name regular expression";
                }
                leaf non-lsp-nexthop {
                  type empty;
                  description
                    "Next-hop with non-lsp";
                }
                leaf non-labelled-nexthop {
                  type empty;
                  description
                    "Next-hop without tag";
                }
              }  // choice nexthop-value
    
              container except {
                description
                  "Do not choose to install matching next hops";
                uses apply-advanced;
    
                choice nexthop-value {
                  leaf-list lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name";
                  }
                  leaf-list lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop LSP name regular expression";
                  }
                  leaf-list static-lsp {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name";
                  }
                  leaf-list static-lsp-regex {
                    type string;
                    ordered-by user;
                    description
                      "Next-hop static LSP name regular expression";
                  }
                  leaf non-lsp-nexthop {
                    type empty;
                    description
                      "Next-hop with non-lsp";
                  }
                  leaf non-labelled-nexthop {
                    type empty;
                    description
                      "Next-hop without tag";
                  }
                }  // choice nexthop-value
              }  // container except
            }  // container fallback
          }  // container install-nexthop
    
          leaf trace {
            type empty;
            description
              "Log matches to a trace file";
          }
    
          container external {
            junos:must "((". type" || ". nssa-only"))";
            junos:must-message "type OR nssa-only configuration is mandatory";
            presence "enable external";
            description "External route";
            uses apply-advanced;
    
            leaf type {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "OSPF external metric type";
            }
    
            leaf nssa-only {
              type empty;
              description
                "Clear P-bit on lsa type 7";
            }
          }  // container external
    
          container load-balance {
            description
              "Type of load balancing in forwarding table";
            choice load_balance_type {
              leaf per-packet {
                type empty;
                description
                  "Load balance on a per-packet basis";
              }
              leaf random {
                junos:must "("chassis network-services enhanced-ip")";
                junos:must-message "To configure random mode, chassis network-services enhanced-ip must be set";
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure random mode, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Load balance using packet random spray";
              }
              leaf per-prefix {
                type empty;
                description
                  "Load balance on a per-prefix basis";
              }
              leaf consistent-hash {
                type empty;
                description
                  "Give a prefix consistent load-balancing";
              }
              leaf source-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure source ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a source based ip load-balancing";
              }
              leaf destination-ip-only {
                junos:must "(!(".. ..  cos-next-hop-map"))";
                junos:must-message "To configure destination ip load balancing, CBF must not be enabled in the same policy term";
                type empty;
                description
                  "Give a destination based ip load-balancing";
              }
            }  // choice load_balance_type
          }  // container load-balance
    
          leaf no-route-localize {
            type empty;
            description
              "Force route install on all fib-remote PFEs";
          }
    
          choice install-to-fib-choice {
            leaf install-to-fib {
              type empty;
              description "Install route to fib";
            }
            leaf no-install-to-fib {
              type empty;
              description
                "Don't install route to fib";
            }
          }  // choice install-to-fib-choice
    
          leaf analyze {
            type empty;
            description
              "Send to registered controllers for analysis";
          }
    
          leaf class {
            type string;
            description
              "Set class-of-service parameters";
          }
    
          leaf destination-class {
            type string;
            description
              "Set destination class in forwarding table";
          }
    
          leaf source-class {
            type string;
            description
              "Set source class in forwarding table";
          }
    
          leaf forwarding-class {
            type string;
            description
              "Set source or destination class in forwarding table";
          }
    
          container map-to-interface {
            description
              "Set output logical interface";
            choice map_to_interface_value {
              leaf self {
                type empty;
                description
                  "Map the interface to itself";
              }
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Output logical interface";
              }
            }  // choice map_to_interface_value
          }  // container map-to-interface
    
          leaf-list ssm-source {
            type jt:ipaddr;
            ordered-by user;
            description
              "List of Sources for SSM mapping";
          }
    
          container p2mp-lsp-root {
            description "P2mp lsp root address";
            uses apply-advanced;
    
            leaf address {
              type jt:ipv4addr;
              description "Ipv4 root address";
            }
          }  // container p2mp-lsp-root
    
          leaf cos-next-hop-map {
            type string;
            description
              "Set CoS-based next-hop map in forwarding table";
          }
    
          leaf dynamic-tunnel-attributes {
            type string;
            description
              "Choose the dynamic tunnel attributes used for forwarding";
          }
    
          leaf tunnel-end-point-address {
            type jt:ipaddr;
            description
              "Set tunnel end-point address of tunnel";
          }
    
          leaf selected-mldp-egress {
            type empty;
            description
              "This node should act as egress node for MLDP inband signalling";
          }
    
          leaf mhop-bfd-port {
            type empty;
            description
              "Use port number 4784 for MPLS-BFD as per RFC5884";
          }
    
          leaf no-backup {
            type empty;
            description
              "This prefix should not have backup";
          }
    
          leaf default-action {
            type enumeration {
              enum "accept" {
                value 0;
                description "Accept a route";
              }
              enum "reject" {
                value 1;
                description "Reject a route";
              }
            }
            description
              "Set default policy action";
          }
    
          leaf next {
            type enumeration {
              enum "policy" {
                value 0;
                description
                  "Skip to next policy filter";
              }
              enum "term" {
                value 1;
                description
                  "Skip to next term in a policy filter";
              }
            }
            description
              "Skip to next policy or term";
          }
    
          choice accept_reject {
            leaf accept {
              type empty;
              description "Accept a route";
            }
            leaf reject {
              type empty;
              description "Reject a route";
            }
          }  // choice accept_reject
    
          container bgp-output-queue-priority {
            description
              "Set the BGP Update output queue priority.";
            choice class {
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
              leaf expedited {
                type empty;
                description
                  "Expedited queue; highest priority";
              }
            }  // choice class
          }  // container bgp-output-queue-priority
    
          leaf multipath-resolve {
            type empty;
            description
              "Use all paths for resolution over this prefix";
          }
    
          leaf source-routing-path-template {
            junos:must "("protocols source-packet-routing source-routing-path-template $$")";
            junos:must-message "Referenced Spring-te template does not exist";
            type string {
              junos:posix-pattern "^.{1,64}$";
              junos:pattern-message "Must be less than 64 characters";
            }
            description
              "Spring-te template to apply";
          }
    
          leaf label-allocation-fallback-reject {
            junos:must "((".. label" || ".. .. then"))";
            junos:must-message "This can only be a 'route-filter-list' or 'route-filter' or 'then' action. Label configuration is mandatory under route-filter-list/route-filter";
            type empty;
            description
              "Suppress prefix export when label allocation fails";
          }
    
          leaf resolution-map {
            type string;
            description
              "Set resolution map modes";
          }
    
          leaf ignore-service-label {
            type empty;
            description "Ignore service labels";
          }
    
          leaf request-long-lived-ack {
            type empty;
            description
              "Advertise route after forwarding is programmed";
          }
    
          leaf send-withdrawal-on-route-change {
            type empty;
            description
              "Withdraw route if change is not acked from forwarding";
          }
        }  // grouping source_address_filter_list_items
    
        grouping srd-ev-action-object {
          junos:must "(("add-static-route" || "delete-static-route"))";
          junos:must-message "Add or delete of static route needed";
          description
            "Action to be taken on the occurence if defined events";
          uses apply-advanced;
    
          leaf mship-actions {
            type enumeration {
              enum "acquire-mastership" {
                value 0;
                description
                  "Attempt to acquire mastership";
              }
              enum "release-mastership" {
                value 1;
                description
                  "Attempt to release mastership";
              }
              enum "release-mastership-force" {
                value 2;
                description
                  "Attempt to release mastership";
              }
              enum
                "release-mastership-if-standby-clear" {
                value 3;
                description
                  "Attempt to release mastership if standby has no warning";
              }
              enum "broadcast-warning" {
                value 4;
                description
                  "Attempt to release mastership";
              }
            }
            description
              "Mastership related actions";
          }
    
          list add-static-route {
            key "name";
            max-elements 1;
            ordered-by user;
            description
              "Add a static route in the specified routing table";
            uses srd-route-add-object;
          }  // list add-static-route
    
          list delete-static-route {
            key "name";
            max-elements 1;
            ordered-by user;
            description
              "Delete a static route in the specified routing table";
            uses srd-route-delete-object;
          }  // list delete-static-route
        }  // grouping srd-ev-action-object
    
        grouping srd-route-add-object {
          description "Route details";
          leaf name {
            type jt:ipv4prefix-mandatory;
            description
              " Destination route address with prefix length";
          }
    
          uses apply-advanced;
    
          choice next-hop-details {
            leaf next-hop {
              type string;
              description
                "Next-hop (interface) to destination";
            }
            leaf receive {
              type empty;
              description
                "Install a receive route for the destination";
            }
          }  // choice next-hop-details
    
          leaf routing-instance {
            type string;
            description
              "Routing instance where the route should be added";
          }
        }  // grouping srd-route-add-object
    
        grouping srd-route-delete-object {
          description "Route details";
          leaf name {
            type jt:ipv4prefix-mandatory;
            description
              "Destination route address with prefix length";
          }
    
          uses apply-advanced;
    
          leaf routing-instance {
            type string;
            description
              "Routing instance where the route should be added";
          }
        }  // grouping srd-route-delete-object
      }  // module junos-nfx-conf-policy-options
    

© 2023 YumaWorks, Inc. All rights reserved.