import helm charts from sdran-helm-charts
- Fixed licensing issues
Change-Id: Ib4f726a6359e340884d329a801eb0b498d7bbb38
diff --git a/config-models/aether-1.x/.helmignore b/config-models/aether-1.x/.helmignore
new file mode 100644
index 0000000..01d4cd9
--- /dev/null
+++ b/config-models/aether-1.x/.helmignore
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: 2021 Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/config-models/aether-1.x/Chart.yaml b/config-models/aether-1.x/Chart.yaml
new file mode 100644
index 0000000..40a8be0
--- /dev/null
+++ b/config-models/aether-1.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 1.0.4
+kubeVersion: ">=1.18.0"
+appVersion: 1.0.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-1.x/files/aether-1.0.0.tree b/config-models/aether-1.x/files/aether-1.0.0.tree
new file mode 100644
index 0000000..7c24828
--- /dev/null
+++ b/config-models/aether-1.x/files/aether-1.0.0.tree
@@ -0,0 +1,54 @@
+module: access-profile
+ +--rw access-profile
+ +--rw access-profile* [id]
+ +--rw id access-profile-id
+ +--rw type? string
+ +--rw filter? string
+ +--rw description? string
+
+module: aether-subscriber
+ +--rw subscriber
+ +--rw ue* [ueid]
+ +--rw ueid ueid
+ +--rw serving-plmn
+ | +--rw mcc? mcc
+ | +--rw mnc? mnc
+ | +--rw tac? tac
+ +--rw requested-apn? string
+ +--rw priority? uint32
+ +--rw enabled? boolean
+ +--rw profiles
+ +--rw apn-profile? -> /apn:apn-profile/apn-profile/id
+ +--rw up-profile? -> /up:up-profile/up-profile/id
+ +--rw qos-profile? -> /qos:qos-profile/qos-profile/id
+ +--rw access-profile* [access-profile]
+ +--rw access-profile -> /ap:access-profile/access-profile/id
+ +--rw allowed? boolean
+
+module: apn-profile
+ +--rw apn-profile
+ +--rw apn-profile* [id]
+ +--rw id apn-profile-id
+ +--rw apn-name? string
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw mtu? uint32
+ +--rw gx-enabled? boolean
+ +--rw description? string
+
+module: qos-profile
+ +--rw qos-profile
+ +--rw qos-profile* [id]
+ +--rw id qos-profile-id
+ +--rw apn-ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw description? string
+
+module: up-profile
+ +--rw up-profile
+ +--rw up-profile* [id]
+ +--rw id up-profile-id
+ +--rw user-plane? string
+ +--rw access-control? string
+ +--rw description? string
diff --git a/config-models/aether-1.x/files/yang/access-profile.yang b/config-models/aether-1.x/files/yang/access-profile.yang
new file mode 100755
index 0000000..29e10a1
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/access-profile.yang
@@ -0,0 +1,64 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module access-profile {
+ namespace "http://opennetworking.org/aether/access-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-08-18" {
+ description "An Aether access Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef access-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container access-profile {
+ description "The top level container";
+
+ list access-profile {
+ key "id";
+ description
+ "List of access profiles";
+
+ leaf id {
+ type access-profile-id;
+ description "ID for this access profile.";
+ }
+
+ leaf type {
+ type string {
+ length 1..32;
+ }
+ description "type of profile";
+ }
+
+ leaf filter {
+ type string {
+ length 0..32;
+ }
+ description "filter";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-1.x/files/yang/aether-subscriber.yang b/config-models/aether-1.x/files/yang/aether-subscriber.yang
new file mode 100644
index 0000000..963217f
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/aether-subscriber.yang
@@ -0,0 +1,147 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module aether-subscriber {
+ namespace "http://opennetworking.org/aether/subscriber";
+ prefix sub;
+
+ import apn-profile{ prefix apn; }
+ import qos-profile{ prefix qos; }
+ import up-profile{ prefix up; }
+ import access-profile{ prefix ap; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-08-18" {
+ description "An Aether Subscriber";
+ reference "RFC 6087";
+ }
+
+ // User Equipment ID (UEID), Basically an IMSI range
+ // examples:
+ // 123456789??????? ... wildcard at the end
+ // 123456???0123455 ... wildcard in the middle
+ // 1234567890000000-123456789000005 ... range
+ typedef ueid {
+ type string {
+ length 1..31;
+ }
+ }
+
+ typedef mcc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef mnc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef tac {
+ type uint32 {
+ range 0..99999999;
+ }
+ }
+
+ container subscriber {
+ description "The top level container";
+
+ list ue {
+ key "ueid";
+ description
+ "List of subscriber devices";
+
+ leaf ueid {
+ description "identifier for this subscriber, may or may not be an IMSI";
+ type ueid;
+ }
+
+ container serving-plmn {
+ leaf mcc {
+ type mcc;
+ description "mobile country code";
+ }
+ leaf mnc {
+ type mnc;
+ description "mobile network code";
+ }
+ leaf tac {
+ type tac;
+ description "type allocation code";
+ }
+ }
+
+ leaf requested-apn {
+ type string {
+ length 1..31;
+ }
+ description "requested access point name";
+ }
+
+ leaf priority {
+ type uint32 {
+ range 0..1000;
+ }
+ default 0;
+ description
+ "Priority for this subscriber range";
+ }
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enable or disable this ue";
+ }
+
+ container profiles {
+ leaf apn-profile {
+ type leafref {
+ path "/apn:apn-profile/apn:apn-profile/apn:id";
+ }
+ description
+ "Link to apn profile";
+ }
+ leaf up-profile {
+ type leafref {
+ path "/up:up-profile/up:up-profile/up:id";
+ }
+ description
+ "Link to user plane profile";
+ }
+ leaf qos-profile {
+ type leafref {
+ path "/qos:qos-profile/qos:qos-profile/qos:id";
+ }
+ description
+ "Link to qos profile";
+ }
+ list access-profile {
+ key "access-profile";
+ leaf access-profile {
+ type leafref {
+ path "/ap:access-profile/ap:access-profile/ap:id";
+ }
+// type ap:access-profile-id;
+ description
+ "Link to access profile";
+ }
+ leaf allowed {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow this ue to use this access profile";
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-1.x/files/yang/apn-profile.yang b/config-models/aether-1.x/files/yang/apn-profile.yang
new file mode 100755
index 0000000..20e1763
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/apn-profile.yang
@@ -0,0 +1,84 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module apn-profile {
+ namespace "http://opennetworking.org/aether/apn-profile";
+ prefix pro;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-08-18" {
+ description "An Aether APN Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef apn-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container apn-profile {
+ description "The top level container";
+
+ list apn-profile {
+ key "id";
+ description
+ "List of apn profiles";
+
+ leaf id {
+ type apn-profile-id;
+ description "ID for this apn profile.";
+ }
+
+ leaf apn-name {
+ type string {
+ length 1..32;
+ }
+ description "apn name";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ leaf mtu {
+ type uint32 {
+ range 68..65535;
+ }
+ units bytes;
+ default 1460;
+ description "maximum transmission unit";
+ }
+
+ leaf gx-enabled {
+ type boolean;
+ default false;
+ description "enable gx interface";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-1.x/files/yang/ietf-inet-types.yang b/config-models/aether-1.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-1.x/files/yang/qos-profile.yang b/config-models/aether-1.x/files/yang/qos-profile.yang
new file mode 100755
index 0000000..257f4ff
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/qos-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module qos-profile {
+ namespace "http://opennetworking.org/aether/qos-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-08-18" {
+ description "An Aether qos Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef qos-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container qos-profile {
+ description "The top level container";
+
+ list qos-profile {
+ key "id";
+ description
+ "List of qos profiles";
+
+ leaf id {
+ type qos-profile-id;
+ description "ID for this qos profile.";
+ }
+
+ container apn-ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-1.x/files/yang/up-profile.yang b/config-models/aether-1.x/files/yang/up-profile.yang
new file mode 100755
index 0000000..6a43bf4
--- /dev/null
+++ b/config-models/aether-1.x/files/yang/up-profile.yang
@@ -0,0 +1,64 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module up-profile {
+ namespace "http://opennetworking.org/aether/user-plane-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-08-18" {
+ description "An Aether user plane Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef up-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container up-profile {
+ description "The top level container";
+
+ list up-profile {
+ key "id";
+ description
+ "List of user plane profiles";
+
+ leaf id {
+ type up-profile-id;
+ description "ID for this user plane profile.";
+ }
+
+ leaf user-plane {
+ type string {
+ length 1..255;
+ }
+ description "user plane name";
+ }
+
+ leaf access-control {
+ type string {
+ length 1..32;
+ }
+ description "access control policy";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-1.x/templates/_helpers.tpl b/config-models/aether-1.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-1.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-1.x/templates/model.yaml b/config-models/aether-1.x/templates/model.yaml
new file mode 100644
index 0000000..f88e9f2
--- /dev/null
+++ b/config-models/aether-1.x/templates/model.yaml
@@ -0,0 +1,41 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: aether-subscriber
+ organization: Open Networking Foundation
+ revision: 2020-08-18
+ file: aether-subscriber.yang
+ - name: apn-profile
+ organization: Open Networking Foundation
+ revision: 2020-08-18
+ file: apn-profile.yang
+ - name: up-profile
+ organization: Open Networking Foundation
+ revision: 2020-08-18
+ file: up-profile.yang
+ - name: qos-profile
+ organization: Open Networking Foundation
+ revision: 2020-08-18
+ file: qos-profile.yang
+ - name: access-profile
+ organization: Open Networking Foundation
+ revision: 2020-08-18
+ file: access-profile.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-1.x/values.yaml b/config-models/aether-1.x/values.yaml
new file mode 100644
index 0000000..1b22ea4
--- /dev/null
+++ b/config-models/aether-1.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
diff --git a/config-models/aether-2.1.x/.helmignore b/config-models/aether-2.1.x/.helmignore
new file mode 100644
index 0000000..01d4cd9
--- /dev/null
+++ b/config-models/aether-2.1.x/.helmignore
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: 2021 Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/config-models/aether-2.1.x/Chart.yaml b/config-models/aether-2.1.x/Chart.yaml
new file mode 100644
index 0000000..e7ddb89
--- /dev/null
+++ b/config-models/aether-2.1.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 2.1.3
+kubeVersion: ">=1.18.0"
+appVersion: 2.1.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-2.1.x/files/aether-2.1.0.tree b/config-models/aether-2.1.x/files/aether-2.1.0.tree
new file mode 100644
index 0000000..84dd39a
--- /dev/null
+++ b/config-models/aether-2.1.x/files/aether-2.1.0.tree
@@ -0,0 +1,153 @@
+module: access-profile
+ +--rw access-profile
+ +--rw access-profile* [id]
+ +--rw id access-profile-id
+ +--rw display-name? string
+ +--rw type? string
+ +--rw filter? string
+ +--rw description? string
+
+module: aether-subscriber
+ +--rw subscriber
+ +--rw ue* [id]
+ +--rw id ietf:uuid
+ +--rw display-name? string
+ +--rw (imsi)?
+ | +--:(wildcard)
+ | | +--rw imsi-wildcard? string
+ | +--:(range)
+ | +--rw imsi-range-from? uint64
+ | +--rw imsi-range-to? uint64
+ +--rw serving-plmn
+ | +--rw mcc? mcc
+ | +--rw mnc? mnc
+ | +--rw tac? tac
+ +--rw requested-apn? string
+ +--rw priority? uint32
+ +--rw enabled? boolean
+ +--rw enterprise? -> /ent:enterprise/enterprise/id
+ +--rw profiles
+ +--rw apn-profile? -> /apn:apn-profile/apn-profile/id
+ +--rw up-profile? -> /up:up-profile/up-profile/id
+ +--rw qos-profile? -> /qos:qos-profile/qos-profile/id
+ +--rw access-profile* [access-profile]
+ | +--rw access-profile -> /ap:access-profile/access-profile/id
+ | +--rw allowed? boolean
+ +--rw security-profile? -> /sec:security-profile/security-profile/id
+
+module: apn-profile
+ +--rw apn-profile
+ +--rw apn-profile* [id]
+ +--rw id apn-profile-id
+ +--rw display-name? string
+ +--rw apn-name? string
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw mtu? uint32
+ +--rw gx-enabled? boolean
+ +--rw description? string
+ +--rw service-group? -> /sg:service-group/service-group/id
+
+module: connectivity-service
+ +--rw connectivity-service
+ +--rw connectivity-service* [id]
+ +--rw id connectivity-service-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw spgwc-endpoint? inet:uri
+ +--rw hss-endpoint? inet:uri
+ +--rw pcrf-endpoint? inet:uri
+
+module: enterprise
+ +--rw enterprise
+ +--rw enterprise* [id]
+ +--rw id enterprise-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw connectivity-service* [connectivity-service]
+ +--rw connectivity-service -> /cs:connectivity-service/connectivity-service/id
+ +--rw enabled? boolean
+
+module: qos-profile
+ +--rw qos-profile
+ +--rw qos-profile* [id]
+ +--rw id qos-profile-id
+ +--rw display-name? string
+ +--rw apn-ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw qci? uint32
+ +--rw arp
+ | +--rw priority? uint32
+ | +--rw preemption-capability? boolean
+ | +--rw preemption-vulnerability? boolean
+ +--rw description? string
+
+module: security-profile
+ +--rw security-profile
+ +--rw security-profile* [id]
+ +--rw id security-profile-id
+ +--rw display-name? string
+ +--rw key? string
+ +--rw opc? string
+ +--rw sqn? uint32
+ +--rw description? string
+
+module: service-group
+ +--rw service-group
+ +--rw service-group* [id]
+ +--rw id service-group-id
+ +--rw display-name? string
+ +--rw service-policies* [service-policy]
+ | +--rw service-policy -> /serv:service-policy/service-policy/id
+ | +--rw kind? service-kind
+ +--rw description? string
+
+module: service-policy
+ +--rw service-policy
+ +--rw service-policy* [id]
+ +--rw id service-policy-id
+ +--rw display-name? string
+ +--rw qci? uint32
+ +--rw arp? uint32
+ +--rw ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw rules* [rule]
+ | +--rw rule -> /sr:service-rule/service-rule/id
+ | +--rw enabled? boolean
+ +--rw description? string
+
+module: service-rule
+ +--rw service-rule
+ +--rw service-rule* [id]
+ +--rw id service-rule-id
+ +--rw display-name? string
+ +--rw charging-rule-name? string
+ +--rw qos
+ | +--rw qci? uint32
+ | +--rw arp
+ | | +--rw priority? uint32
+ | | +--rw preemption-capability? boolean
+ | | +--rw preemption-vulnerability? boolean
+ | +--rw maximum-requested-bandwidth
+ | | +--rw uplink? uint32
+ | | +--rw downlink? uint32
+ | +--rw guaranteed-bitrate
+ | | +--rw uplink? uint32
+ | | +--rw downlink? uint32
+ | +--rw aggregate-maximum-bitrate
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw flow
+ | +--rw specification? string
+ +--rw description? string
+
+module: up-profile
+ +--rw up-profile
+ +--rw up-profile* [id]
+ +--rw id up-profile-id
+ +--rw display-name? string
+ +--rw user-plane? string
+ +--rw access-control? string
+ +--rw description? string
diff --git a/config-models/aether-2.1.x/files/yang/access-profile.yang b/config-models/aether-2.1.x/files/yang/access-profile.yang
new file mode 100755
index 0000000..d58a674
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/access-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module access-profile {
+ namespace "http://opennetworking.org/aether/access-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether access Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef access-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container access-profile {
+ description "The top level container";
+
+ list access-profile {
+ key "id";
+ description
+ "List of access profiles";
+
+ leaf id {
+ type access-profile-id;
+ description "ID for this access profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf type {
+ type string {
+ length 1..32;
+ }
+ description "type of profile";
+ }
+
+ leaf filter {
+ type string {
+ length 0..32;
+ }
+ description "filter";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/aether-subscriber.yang b/config-models/aether-2.1.x/files/yang/aether-subscriber.yang
new file mode 100755
index 0000000..30f3e52
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/aether-subscriber.yang
@@ -0,0 +1,178 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module aether-subscriber {
+ namespace "http://opennetworking.org/aether/subscriber";
+ prefix sub;
+
+ import apn-profile{ prefix apn; }
+ import qos-profile{ prefix qos; }
+ import up-profile{ prefix up; }
+ import access-profile{ prefix ap; }
+ import security-profile{ prefix sec; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix ietf; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether Subscriber";
+ reference "RFC 6087";
+ }
+
+ typedef mcc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef mnc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef tac {
+ type uint32 {
+ range 0..99999999;
+ }
+ }
+
+ container subscriber {
+ description "The top level container";
+
+ list ue {
+ key "id";
+ description
+ "List of subscriber devices";
+
+ leaf id {
+ description "identifier for this subscriber, typically a UUID";
+ type ietf:uuid;
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ choice imsi {
+ case wildcard {
+ leaf imsi-wildcard {
+ type string {
+ length 1..15;
+ }
+ }
+ }
+ case range {
+ leaf imsi-range-from {
+ type uint64;
+ }
+ leaf imsi-range-to {
+ type uint64;
+ }
+ }
+ }
+
+ container serving-plmn {
+ leaf mcc {
+ type mcc;
+ description "mobile country code";
+ }
+ leaf mnc {
+ type mnc;
+ description "mobile network code";
+ }
+ leaf tac {
+ type tac;
+ description "type allocation code";
+ }
+ }
+
+ leaf requested-apn {
+ type string {
+ length 0..31;
+ }
+ description "requested access point name";
+ }
+
+ leaf priority {
+ type uint32 {
+ range 0..1000;
+ }
+ default 0;
+ description
+ "Priority for this subscriber range";
+ }
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enable or disable this ue";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ description
+ "Link to enterprise that owns this UE range";
+ }
+
+ container profiles {
+ leaf apn-profile {
+ type leafref {
+ path "/apn:apn-profile/apn:apn-profile/apn:id";
+ }
+ description
+ "Link to apn profile";
+ }
+ leaf up-profile {
+ type leafref {
+ path "/up:up-profile/up:up-profile/up:id";
+ }
+ description
+ "Link to user plane profile";
+ }
+ leaf qos-profile {
+ type leafref {
+ path "/qos:qos-profile/qos:qos-profile/qos:id";
+ }
+ description
+ "Link to qos profile";
+ }
+ list access-profile {
+ key "access-profile";
+ leaf access-profile {
+ type leafref {
+ path "/ap:access-profile/ap:access-profile/ap:id";
+ }
+ description
+ "Link to access profile";
+ }
+ leaf allowed {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow this ue to use this access profile";
+ }
+ }
+ leaf security-profile {
+ type leafref {
+ path "/sec:security-profile/sec:security-profile/sec:id";
+ }
+ description
+ "Link to security profile";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/apn-profile.yang b/config-models/aether-2.1.x/files/yang/apn-profile.yang
new file mode 100755
index 0000000..27361dc
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/apn-profile.yang
@@ -0,0 +1,100 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module apn-profile {
+ namespace "http://opennetworking.org/aether/apn-profile";
+ prefix pro;
+
+ import ietf-inet-types { prefix inet; }
+ import service-group { prefix sg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether APN Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef apn-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container apn-profile {
+ description "The top level container";
+
+ list apn-profile {
+ key "id";
+ description
+ "List of apn profiles";
+
+ leaf id {
+ type apn-profile-id;
+ description "ID for this apn profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf apn-name {
+ type string {
+ length 1..32;
+ }
+ description "apn name";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ leaf mtu {
+ type uint32 {
+ range 68..65535;
+ }
+ units bytes;
+ default 1460;
+ description "maximum transmission unit";
+ }
+
+ leaf gx-enabled {
+ type boolean;
+ default false;
+ description "enable gx interface";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+
+ leaf service-group {
+ type leafref {
+ path "/sg:service-group/sg:service-group/sg:id";
+ }
+ description
+ "Link to service group";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/connectivity-service.yang b/config-models/aether-2.1.x/files/yang/connectivity-service.yang
new file mode 100755
index 0000000..f12340b
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/connectivity-service.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module connectivity-service {
+ namespace "http://opennetworking.org/aether/connectivity-service";
+ prefix cs;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-18" {
+ description "An Aether Connectivity Service. Specifies the endpoints where the sdcore-adapter should push configuration to. A single connectivity service may be attached to multiple Enterprises.";
+ reference "RFC 6087";
+ }
+
+ typedef connectivity-service-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container connectivity-service {
+ description "The top level container";
+
+ list connectivity-service {
+ key "id";
+ description
+ "List of connectivity services";
+
+ leaf id {
+ type connectivity-service-id;
+ description "ID for this connectivity service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this connectivity service";
+ }
+
+ leaf spgwc-endpoint {
+ type inet:uri;
+ description "url of the spgwc service";
+ }
+
+ leaf hss-endpoint {
+ type inet:uri;
+ description "url of the hss service";
+ }
+
+ leaf pcrf-endpoint {
+ type inet:uri;
+ description "url of the pcrf service";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/enterprise.yang b/config-models/aether-2.1.x/files/yang/enterprise.yang
new file mode 100755
index 0000000..38cb4b8
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/enterprise.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module enterprise {
+ namespace "http://opennetworking.org/aether/enterprise";
+ prefix ent;
+
+ import connectivity-service { prefix cs; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Enterprise. Used to distinguish ownership of devices and other resources as well as a domain of configuration.";
+ reference "RFC 6087";
+ }
+
+ typedef enterprise-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container enterprise {
+ description "The top level container";
+
+ list enterprise {
+ key "id";
+ description
+ "List of enterprises";
+
+ leaf id {
+ type enterprise-id;
+ description "ID for this enterprise.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this enterprise";
+ }
+
+ list connectivity-service {
+ key "connectivity-service";
+ leaf connectivity-service {
+ type leafref {
+ path "/cs:connectivity-service/cs:connectivity-service/cs:id";
+ }
+ description
+ "Link to connectivity services where configuration should be pushed for this enterprise's devices";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow pushes to this connectivity service";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/ietf-inet-types.yang b/config-models/aether-2.1.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-2.1.x/files/yang/ietf-yang-types.yang b/config-models/aether-2.1.x/files/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..ee58fa3
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/ietf-yang-types.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/qos-profile.yang b/config-models/aether-2.1.x/files/yang/qos-profile.yang
new file mode 100755
index 0000000..5ad91b4
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/qos-profile.yang
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module qos-profile {
+ namespace "http://opennetworking.org/aether/qos-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether qos Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef qos-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container qos-profile {
+ description "The top level container";
+
+ list qos-profile {
+ key "id";
+ description
+ "List of qos profiles";
+
+ leaf id {
+ type qos-profile-id;
+ description "ID for this qos profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ container apn-ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ container arp {
+ leaf priority {
+ type uint32 {
+ range 0..15;
+ }
+ default 0;
+ description
+ "Priority";
+ }
+ leaf preemption-capability {
+ type boolean;
+ default true;
+ description
+ "True if a bearer with lower priority should be dropped";
+ }
+ leaf preemption-vulnerability {
+ type boolean;
+ default true;
+ description
+ "This bearer may be dropped for a bearer with higher priority";
+ }
+ description "Evolved-ARP";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/security-profile.yang b/config-models/aether-2.1.x/files/yang/security-profile.yang
new file mode 100755
index 0000000..a8a3069
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/security-profile.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module security-profile {
+ namespace "http://opennetworking.org/aether/security-profile";
+ prefix sec;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Security Profile. Contains keys and other security items associated with devices. Configured by the operator.";
+ reference "RFC 6087";
+ }
+
+ typedef security-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container security-profile {
+ description "The top level container";
+
+ list security-profile {
+ key "id";
+ description
+ "List of security profiles";
+
+ leaf id {
+ type security-profile-id;
+ description "ID for this security profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf key {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for USIM";
+ }
+
+ leaf opc {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for Operator";
+ }
+
+ leaf sqn {
+ type uint32;
+ description "sequence number";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this security profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/service-group.yang b/config-models/aether-2.1.x/files/yang/service-group.yang
new file mode 100755
index 0000000..9f2e7da
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/service-group.yang
@@ -0,0 +1,80 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-group {
+ namespace "http://opennetworking.org/aether/service-group";
+ prefix sg;
+
+ import service-policy { prefix serv; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service Group";
+ reference "RFC 6087";
+ }
+
+ typedef service-group-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ typedef service-kind {
+ type string {
+ length 1..32;
+ pattern "default|on-demand";
+ }
+ }
+
+ container service-group {
+ description "The top level container";
+
+ list service-group {
+ key "id";
+ description
+ "List of service groups";
+
+ leaf id {
+ type service-group-id;
+ description "ID for this service group.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list service-policies {
+ key "service-policy";
+ leaf service-policy {
+ type leafref {
+ path "/serv:service-policy/serv:service-policy/serv:id";
+ }
+ description
+ "Link to service policy";
+ }
+ leaf kind {
+ type service-kind;
+ default "default";
+ description
+ "Type of service link";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this service group";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/service-policy.yang b/config-models/aether-2.1.x/files/yang/service-policy.yang
new file mode 100755
index 0000000..a0db158
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/service-policy.yang
@@ -0,0 +1,112 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-policy {
+ namespace "http://opennetworking.org/aether/service-policy";
+ prefix serv;
+
+ import service-rule { prefix sr; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service";
+ reference "RFC 6087";
+ }
+
+ typedef service-policy-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container service-policy {
+ description "The top level container";
+
+ list service-policy {
+ key "id";
+ description
+ "List of services";
+
+ leaf id {
+ type service-policy-id;
+ description "ID for this service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ leaf arp {
+ type uint32 {
+ range 0..15;
+ }
+ default 9;
+ description
+ "Evolved-ARP";
+ }
+
+ container ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ list rules {
+ key "rule";
+ leaf rule {
+ type leafref {
+ path "/sr:service-rule/sr:service-rule/sr:id";
+ }
+ description
+ "Link to service rule";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Enable or disable this service to use this rule";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/service-rule.yang b/config-models/aether-2.1.x/files/yang/service-rule.yang
new file mode 100755
index 0000000..5dce127
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/service-rule.yang
@@ -0,0 +1,168 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-rule {
+ namespace "http://opennetworking.org/aether/service-rule";
+ prefix sr;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service Rule";
+ reference "RFC 6087";
+ }
+
+ typedef service-rule-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container service-rule {
+ description "The top level container";
+
+ list service-rule {
+ key "id";
+ description
+ "List of service rules";
+
+ leaf id {
+ type service-rule-id;
+ description "ID for this service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf charging-rule-name {
+ type string {
+ length 1..80;
+ }
+ description "name of charging rule";
+ }
+
+ container qos {
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ container arp {
+ leaf priority {
+ type uint32 {
+ range 0..15;
+ }
+ default 0;
+ description
+ "Priority";
+ }
+ leaf preemption-capability {
+ type boolean;
+ default true;
+ description
+ "True if a bearer with lower priority should be dropped";
+ }
+ leaf preemption-vulnerability {
+ type boolean;
+ default true;
+ description
+ "This bearer may be dropped for a bearer with higher priority";
+ }
+ description "Evolved-ARP";
+ }
+
+ container maximum-requested-bandwidth {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream maximum requested bandwidth";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream maximum requested bandwidth";
+ }
+ }
+
+ container guaranteed-bitrate {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream guaranteed bitrate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream guaranteed bitrate";
+ }
+ }
+
+ container aggregate-maximum-bitrate {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bitrate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bitrate";
+ }
+ }
+ }
+
+ container flow {
+ leaf specification {
+ type string {
+ length 1..1024;
+ }
+ description "specification of this flow";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this rule";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/files/yang/up-profile.yang b/config-models/aether-2.1.x/files/yang/up-profile.yang
new file mode 100755
index 0000000..9a38b02
--- /dev/null
+++ b/config-models/aether-2.1.x/files/yang/up-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module up-profile {
+ namespace "http://opennetworking.org/aether/user-plane-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether user plane Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef up-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container up-profile {
+ description "The top level container";
+
+ list up-profile {
+ key "id";
+ description
+ "List of user plane profiles";
+
+ leaf id {
+ type up-profile-id;
+ description "ID for this user plane profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf user-plane {
+ type string {
+ length 1..255;
+ }
+ description "user plane name";
+ }
+
+ leaf access-control {
+ type string {
+ length 1..32;
+ }
+ description "access control policy";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.1.x/templates/_helpers.tpl b/config-models/aether-2.1.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-2.1.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-2.1.x/templates/model.yaml b/config-models/aether-2.1.x/templates/model.yaml
new file mode 100644
index 0000000..84d2fbb
--- /dev/null
+++ b/config-models/aether-2.1.x/templates/model.yaml
@@ -0,0 +1,65 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: aether-subscriber
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: aether-subscriber.yang
+ - name: apn-profile
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: apn-profile.yang
+ - name: up-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: up-profile.yang
+ - name: qos-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: qos-profile.yang
+ - name: access-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: access-profile.yang
+ - name: enterprise
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: enterprise.yang
+ - name: connectivity-service
+ organization: Open Networking Foundation
+ revision: 2021-03-18
+ file: connectivity-service.yang
+ - name: security-profile
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: security-profile.yang
+ - name: service-group
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-group.yang
+ - name: service-policy
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-policy.yang
+ - name: service-rule
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-rule.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-2.1.x/values.yaml b/config-models/aether-2.1.x/values.yaml
new file mode 100644
index 0000000..2e984ed
--- /dev/null
+++ b/config-models/aether-2.1.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
diff --git a/config-models/aether-2.2.x/Chart.yaml b/config-models/aether-2.2.x/Chart.yaml
new file mode 100644
index 0000000..cbeac17
--- /dev/null
+++ b/config-models/aether-2.2.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 2.2.3
+kubeVersion: ">=1.18.0"
+appVersion: 2.2.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-2.2.x/files/aether-2.2.0.tree b/config-models/aether-2.2.x/files/aether-2.2.0.tree
new file mode 100644
index 0000000..2336f65
--- /dev/null
+++ b/config-models/aether-2.2.x/files/aether-2.2.0.tree
@@ -0,0 +1,155 @@
+module: access-profile
+ +--rw access-profile
+ +--rw access-profile* [id]
+ +--rw id access-profile-id
+ +--rw display-name? string
+ +--rw type? string
+ +--rw filter? string
+ +--rw description? string
+
+module: aether-subscriber
+ +--rw subscriber
+ +--rw ue* [id]
+ +--rw id ietf:uuid
+ +--rw display-name? string
+ +--rw (imsi)?
+ | +--:(wildcard)
+ | | +--rw imsi-wildcard? string
+ | +--:(range)
+ | +--rw imsi-range-from? uint64
+ | +--rw imsi-range-to? uint64
+ +--rw serving-plmn
+ | +--rw mcc? mcc
+ | +--rw mnc? mnc
+ | +--rw tac? tac
+ +--rw requested-apn? string
+ +--rw priority? uint32
+ +--rw enabled? boolean
+ +--rw enterprise? -> /ent:enterprise/enterprise/id
+ +--rw profiles
+ +--rw apn-profile? -> /apn:apn-profile/apn-profile/id
+ +--rw up-profile? -> /up:up-profile/up-profile/id
+ +--rw qos-profile? -> /qos:qos-profile/qos-profile/id
+ +--rw access-profile* [access-profile]
+ | +--rw access-profile -> /ap:access-profile/access-profile/id
+ | +--rw allowed? boolean
+ +--rw security-profile? -> /sec:security-profile/security-profile/id
+
+module: apn-profile
+ +--rw apn-profile
+ +--rw apn-profile* [id]
+ +--rw id apn-profile-id
+ +--rw display-name? string
+ +--rw apn-name? string
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw mtu? uint32
+ +--rw gx-enabled? boolean
+ +--rw description? string
+ +--rw service-group? -> /sg:service-group/service-group/id
+
+module: connectivity-service
+ +--rw connectivity-service
+ +--rw connectivity-service* [id]
+ +--rw id connectivity-service-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw spgwc-endpoint? inet:uri
+ +--rw hss-endpoint? inet:uri
+ +--rw pcrf-endpoint? inet:uri
+
+module: enterprise
+ +--rw enterprise
+ +--rw enterprise* [id]
+ +--rw id enterprise-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw connectivity-service* [connectivity-service]
+ +--rw connectivity-service -> /cs:connectivity-service/connectivity-service/id
+ +--rw enabled? boolean
+
+module: qos-profile
+ +--rw qos-profile
+ +--rw qos-profile* [id]
+ +--rw id qos-profile-id
+ +--rw display-name? string
+ +--rw apn-ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw qci? uint32
+ +--rw arp
+ | +--rw priority? uint32
+ | +--rw preemption-capability? boolean
+ | +--rw preemption-vulnerability? boolean
+ +--rw description? string
+
+module: security-profile
+ +--rw security-profile
+ +--rw security-profile* [id]
+ +--rw id security-profile-id
+ +--rw display-name? string
+ +--rw imsi-range-from? uint64
+ +--rw imsi-range-to? uint64
+ +--rw key? string
+ +--rw opc? string
+ +--rw sqn? uint32
+ +--rw description? string
+
+module: service-group
+ +--rw service-group
+ +--rw service-group* [id]
+ +--rw id service-group-id
+ +--rw display-name? string
+ +--rw service-policies* [service-policy]
+ | +--rw service-policy -> /serv:service-policy/service-policy/id
+ | +--rw kind? service-kind
+ +--rw description? string
+
+module: service-policy
+ +--rw service-policy
+ +--rw service-policy* [id]
+ +--rw id service-policy-id
+ +--rw display-name? string
+ +--rw qci? uint32
+ +--rw arp? uint32
+ +--rw ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw rules* [rule]
+ | +--rw rule -> /sr:service-rule/service-rule/id
+ | +--rw enabled? boolean
+ +--rw description? string
+
+module: service-rule
+ +--rw service-rule
+ +--rw service-rule* [id]
+ +--rw id service-rule-id
+ +--rw display-name? string
+ +--rw charging-rule-name? string
+ +--rw qos
+ | +--rw qci? uint32
+ | +--rw arp
+ | | +--rw priority? uint32
+ | | +--rw preemption-capability? boolean
+ | | +--rw preemption-vulnerability? boolean
+ | +--rw maximum-requested-bandwidth
+ | | +--rw uplink? uint32
+ | | +--rw downlink? uint32
+ | +--rw guaranteed-bitrate
+ | | +--rw uplink? uint32
+ | | +--rw downlink? uint32
+ | +--rw aggregate-maximum-bitrate
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw flow
+ | +--rw specification? string
+ +--rw description? string
+
+module: up-profile
+ +--rw up-profile
+ +--rw up-profile* [id]
+ +--rw id up-profile-id
+ +--rw display-name? string
+ +--rw user-plane? string
+ +--rw access-control? string
+ +--rw description? string
diff --git a/config-models/aether-2.2.x/files/yang/access-profile.yang b/config-models/aether-2.2.x/files/yang/access-profile.yang
new file mode 100755
index 0000000..d58a674
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/access-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module access-profile {
+ namespace "http://opennetworking.org/aether/access-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether access Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef access-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container access-profile {
+ description "The top level container";
+
+ list access-profile {
+ key "id";
+ description
+ "List of access profiles";
+
+ leaf id {
+ type access-profile-id;
+ description "ID for this access profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf type {
+ type string {
+ length 1..32;
+ }
+ description "type of profile";
+ }
+
+ leaf filter {
+ type string {
+ length 0..32;
+ }
+ description "filter";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/aether-subscriber.yang b/config-models/aether-2.2.x/files/yang/aether-subscriber.yang
new file mode 100755
index 0000000..30f3e52
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/aether-subscriber.yang
@@ -0,0 +1,178 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module aether-subscriber {
+ namespace "http://opennetworking.org/aether/subscriber";
+ prefix sub;
+
+ import apn-profile{ prefix apn; }
+ import qos-profile{ prefix qos; }
+ import up-profile{ prefix up; }
+ import access-profile{ prefix ap; }
+ import security-profile{ prefix sec; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix ietf; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether Subscriber";
+ reference "RFC 6087";
+ }
+
+ typedef mcc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef mnc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef tac {
+ type uint32 {
+ range 0..99999999;
+ }
+ }
+
+ container subscriber {
+ description "The top level container";
+
+ list ue {
+ key "id";
+ description
+ "List of subscriber devices";
+
+ leaf id {
+ description "identifier for this subscriber, typically a UUID";
+ type ietf:uuid;
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ choice imsi {
+ case wildcard {
+ leaf imsi-wildcard {
+ type string {
+ length 1..15;
+ }
+ }
+ }
+ case range {
+ leaf imsi-range-from {
+ type uint64;
+ }
+ leaf imsi-range-to {
+ type uint64;
+ }
+ }
+ }
+
+ container serving-plmn {
+ leaf mcc {
+ type mcc;
+ description "mobile country code";
+ }
+ leaf mnc {
+ type mnc;
+ description "mobile network code";
+ }
+ leaf tac {
+ type tac;
+ description "type allocation code";
+ }
+ }
+
+ leaf requested-apn {
+ type string {
+ length 0..31;
+ }
+ description "requested access point name";
+ }
+
+ leaf priority {
+ type uint32 {
+ range 0..1000;
+ }
+ default 0;
+ description
+ "Priority for this subscriber range";
+ }
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enable or disable this ue";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ description
+ "Link to enterprise that owns this UE range";
+ }
+
+ container profiles {
+ leaf apn-profile {
+ type leafref {
+ path "/apn:apn-profile/apn:apn-profile/apn:id";
+ }
+ description
+ "Link to apn profile";
+ }
+ leaf up-profile {
+ type leafref {
+ path "/up:up-profile/up:up-profile/up:id";
+ }
+ description
+ "Link to user plane profile";
+ }
+ leaf qos-profile {
+ type leafref {
+ path "/qos:qos-profile/qos:qos-profile/qos:id";
+ }
+ description
+ "Link to qos profile";
+ }
+ list access-profile {
+ key "access-profile";
+ leaf access-profile {
+ type leafref {
+ path "/ap:access-profile/ap:access-profile/ap:id";
+ }
+ description
+ "Link to access profile";
+ }
+ leaf allowed {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow this ue to use this access profile";
+ }
+ }
+ leaf security-profile {
+ type leafref {
+ path "/sec:security-profile/sec:security-profile/sec:id";
+ }
+ description
+ "Link to security profile";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/apn-profile.yang b/config-models/aether-2.2.x/files/yang/apn-profile.yang
new file mode 100755
index 0000000..27361dc
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/apn-profile.yang
@@ -0,0 +1,100 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module apn-profile {
+ namespace "http://opennetworking.org/aether/apn-profile";
+ prefix pro;
+
+ import ietf-inet-types { prefix inet; }
+ import service-group { prefix sg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether APN Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef apn-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container apn-profile {
+ description "The top level container";
+
+ list apn-profile {
+ key "id";
+ description
+ "List of apn profiles";
+
+ leaf id {
+ type apn-profile-id;
+ description "ID for this apn profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf apn-name {
+ type string {
+ length 1..32;
+ }
+ description "apn name";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ leaf mtu {
+ type uint32 {
+ range 68..65535;
+ }
+ units bytes;
+ default 1460;
+ description "maximum transmission unit";
+ }
+
+ leaf gx-enabled {
+ type boolean;
+ default false;
+ description "enable gx interface";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+
+ leaf service-group {
+ type leafref {
+ path "/sg:service-group/sg:service-group/sg:id";
+ }
+ description
+ "Link to service group";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/connectivity-service.yang b/config-models/aether-2.2.x/files/yang/connectivity-service.yang
new file mode 100755
index 0000000..f12340b
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/connectivity-service.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module connectivity-service {
+ namespace "http://opennetworking.org/aether/connectivity-service";
+ prefix cs;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-18" {
+ description "An Aether Connectivity Service. Specifies the endpoints where the sdcore-adapter should push configuration to. A single connectivity service may be attached to multiple Enterprises.";
+ reference "RFC 6087";
+ }
+
+ typedef connectivity-service-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container connectivity-service {
+ description "The top level container";
+
+ list connectivity-service {
+ key "id";
+ description
+ "List of connectivity services";
+
+ leaf id {
+ type connectivity-service-id;
+ description "ID for this connectivity service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this connectivity service";
+ }
+
+ leaf spgwc-endpoint {
+ type inet:uri;
+ description "url of the spgwc service";
+ }
+
+ leaf hss-endpoint {
+ type inet:uri;
+ description "url of the hss service";
+ }
+
+ leaf pcrf-endpoint {
+ type inet:uri;
+ description "url of the pcrf service";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/enterprise.yang b/config-models/aether-2.2.x/files/yang/enterprise.yang
new file mode 100755
index 0000000..38cb4b8
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/enterprise.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module enterprise {
+ namespace "http://opennetworking.org/aether/enterprise";
+ prefix ent;
+
+ import connectivity-service { prefix cs; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Enterprise. Used to distinguish ownership of devices and other resources as well as a domain of configuration.";
+ reference "RFC 6087";
+ }
+
+ typedef enterprise-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container enterprise {
+ description "The top level container";
+
+ list enterprise {
+ key "id";
+ description
+ "List of enterprises";
+
+ leaf id {
+ type enterprise-id;
+ description "ID for this enterprise.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this enterprise";
+ }
+
+ list connectivity-service {
+ key "connectivity-service";
+ leaf connectivity-service {
+ type leafref {
+ path "/cs:connectivity-service/cs:connectivity-service/cs:id";
+ }
+ description
+ "Link to connectivity services where configuration should be pushed for this enterprise's devices";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow pushes to this connectivity service";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/ietf-inet-types.yang b/config-models/aether-2.2.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-2.2.x/files/yang/ietf-yang-types.yang b/config-models/aether-2.2.x/files/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..ee58fa3
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/ietf-yang-types.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/qos-profile.yang b/config-models/aether-2.2.x/files/yang/qos-profile.yang
new file mode 100755
index 0000000..5ad91b4
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/qos-profile.yang
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module qos-profile {
+ namespace "http://opennetworking.org/aether/qos-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether qos Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef qos-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container qos-profile {
+ description "The top level container";
+
+ list qos-profile {
+ key "id";
+ description
+ "List of qos profiles";
+
+ leaf id {
+ type qos-profile-id;
+ description "ID for this qos profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ container apn-ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ container arp {
+ leaf priority {
+ type uint32 {
+ range 0..15;
+ }
+ default 0;
+ description
+ "Priority";
+ }
+ leaf preemption-capability {
+ type boolean;
+ default true;
+ description
+ "True if a bearer with lower priority should be dropped";
+ }
+ leaf preemption-vulnerability {
+ type boolean;
+ default true;
+ description
+ "This bearer may be dropped for a bearer with higher priority";
+ }
+ description "Evolved-ARP";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/security-profile.yang b/config-models/aether-2.2.x/files/yang/security-profile.yang
new file mode 100755
index 0000000..745b88e
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/security-profile.yang
@@ -0,0 +1,83 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module security-profile {
+ namespace "http://opennetworking.org/aether/security-profile";
+ prefix sec;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-05-10" {
+ description "An Aether Security Profile. Contains keys and other security items associated with devices. Configured by the operator.";
+ reference "RFC 6087";
+ }
+
+ typedef security-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container security-profile {
+ description "The top level container";
+
+ list security-profile {
+ key "id";
+ description
+ "List of security profiles";
+
+ leaf id {
+ type security-profile-id;
+ description "ID for this security profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf imsi-range-from {
+ type uint64;
+ description "Starting IMSI in range to apply this security profile to";
+ }
+
+ leaf imsi-range-to {
+ type uint64;
+ description "Ending IMSI in range to apply this security profile to";
+ }
+
+ leaf key {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for USIM";
+ }
+
+ leaf opc {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for Operator";
+ }
+
+ leaf sqn {
+ type uint32;
+ description "sequence number";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this security profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/service-group.yang b/config-models/aether-2.2.x/files/yang/service-group.yang
new file mode 100755
index 0000000..9f2e7da
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/service-group.yang
@@ -0,0 +1,80 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-group {
+ namespace "http://opennetworking.org/aether/service-group";
+ prefix sg;
+
+ import service-policy { prefix serv; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service Group";
+ reference "RFC 6087";
+ }
+
+ typedef service-group-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ typedef service-kind {
+ type string {
+ length 1..32;
+ pattern "default|on-demand";
+ }
+ }
+
+ container service-group {
+ description "The top level container";
+
+ list service-group {
+ key "id";
+ description
+ "List of service groups";
+
+ leaf id {
+ type service-group-id;
+ description "ID for this service group.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list service-policies {
+ key "service-policy";
+ leaf service-policy {
+ type leafref {
+ path "/serv:service-policy/serv:service-policy/serv:id";
+ }
+ description
+ "Link to service policy";
+ }
+ leaf kind {
+ type service-kind;
+ default "default";
+ description
+ "Type of service link";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this service group";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/service-policy.yang b/config-models/aether-2.2.x/files/yang/service-policy.yang
new file mode 100755
index 0000000..a0db158
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/service-policy.yang
@@ -0,0 +1,112 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-policy {
+ namespace "http://opennetworking.org/aether/service-policy";
+ prefix serv;
+
+ import service-rule { prefix sr; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service";
+ reference "RFC 6087";
+ }
+
+ typedef service-policy-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container service-policy {
+ description "The top level container";
+
+ list service-policy {
+ key "id";
+ description
+ "List of services";
+
+ leaf id {
+ type service-policy-id;
+ description "ID for this service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ leaf arp {
+ type uint32 {
+ range 0..15;
+ }
+ default 9;
+ description
+ "Evolved-ARP";
+ }
+
+ container ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ list rules {
+ key "rule";
+ leaf rule {
+ type leafref {
+ path "/sr:service-rule/sr:service-rule/sr:id";
+ }
+ description
+ "Link to service rule";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Enable or disable this service to use this rule";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/service-rule.yang b/config-models/aether-2.2.x/files/yang/service-rule.yang
new file mode 100755
index 0000000..5dce127
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/service-rule.yang
@@ -0,0 +1,168 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module service-rule {
+ namespace "http://opennetworking.org/aether/service-rule";
+ prefix sr;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2021-03-04" {
+ description "An Aether Service Rule";
+ reference "RFC 6087";
+ }
+
+ typedef service-rule-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container service-rule {
+ description "The top level container";
+
+ list service-rule {
+ key "id";
+ description
+ "List of service rules";
+
+ leaf id {
+ type service-rule-id;
+ description "ID for this service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf charging-rule-name {
+ type string {
+ length 1..80;
+ }
+ description "name of charging rule";
+ }
+
+ container qos {
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ container arp {
+ leaf priority {
+ type uint32 {
+ range 0..15;
+ }
+ default 0;
+ description
+ "Priority";
+ }
+ leaf preemption-capability {
+ type boolean;
+ default true;
+ description
+ "True if a bearer with lower priority should be dropped";
+ }
+ leaf preemption-vulnerability {
+ type boolean;
+ default true;
+ description
+ "This bearer may be dropped for a bearer with higher priority";
+ }
+ description "Evolved-ARP";
+ }
+
+ container maximum-requested-bandwidth {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream maximum requested bandwidth";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream maximum requested bandwidth";
+ }
+ }
+
+ container guaranteed-bitrate {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream guaranteed bitrate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream guaranteed bitrate";
+ }
+ }
+
+ container aggregate-maximum-bitrate {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bitrate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bitrate";
+ }
+ }
+ }
+
+ container flow {
+ leaf specification {
+ type string {
+ length 1..1024;
+ }
+ description "specification of this flow";
+ }
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this rule";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/files/yang/up-profile.yang b/config-models/aether-2.2.x/files/yang/up-profile.yang
new file mode 100755
index 0000000..9a38b02
--- /dev/null
+++ b/config-models/aether-2.2.x/files/yang/up-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module up-profile {
+ namespace "http://opennetworking.org/aether/user-plane-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether user plane Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef up-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container up-profile {
+ description "The top level container";
+
+ list up-profile {
+ key "id";
+ description
+ "List of user plane profiles";
+
+ leaf id {
+ type up-profile-id;
+ description "ID for this user plane profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf user-plane {
+ type string {
+ length 1..255;
+ }
+ description "user plane name";
+ }
+
+ leaf access-control {
+ type string {
+ length 1..32;
+ }
+ description "access control policy";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.2.x/templates/_helpers.tpl b/config-models/aether-2.2.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-2.2.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-2.2.x/templates/model.yaml b/config-models/aether-2.2.x/templates/model.yaml
new file mode 100644
index 0000000..302c031
--- /dev/null
+++ b/config-models/aether-2.2.x/templates/model.yaml
@@ -0,0 +1,65 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: aether-subscriber
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: aether-subscriber.yang
+ - name: apn-profile
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: apn-profile.yang
+ - name: up-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: up-profile.yang
+ - name: qos-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: qos-profile.yang
+ - name: access-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: access-profile.yang
+ - name: enterprise
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: enterprise.yang
+ - name: connectivity-service
+ organization: Open Networking Foundation
+ revision: 2021-03-18
+ file: connectivity-service.yang
+ - name: security-profile
+ organization: Open Networking Foundation
+ revision: 2021-05-10
+ file: security-profile.yang
+ - name: service-group
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-group.yang
+ - name: service-policy
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-policy.yang
+ - name: service-rule
+ organization: Open Networking Foundation
+ revision: 2021-03-04
+ file: service-rule.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-2.2.x/values.yaml b/config-models/aether-2.2.x/values.yaml
new file mode 100644
index 0000000..2e984ed
--- /dev/null
+++ b/config-models/aether-2.2.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
diff --git a/config-models/aether-2.x/.helmignore b/config-models/aether-2.x/.helmignore
new file mode 100644
index 0000000..01d4cd9
--- /dev/null
+++ b/config-models/aether-2.x/.helmignore
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: 2021 Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/config-models/aether-2.x/Chart.yaml b/config-models/aether-2.x/Chart.yaml
new file mode 100644
index 0000000..0378168
--- /dev/null
+++ b/config-models/aether-2.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 2.0.2
+kubeVersion: ">=1.18.0"
+appVersion: 2.0.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-2.x/files/aether-2.0.0.tree b/config-models/aether-2.x/files/aether-2.0.0.tree
new file mode 100644
index 0000000..df204d5
--- /dev/null
+++ b/config-models/aether-2.x/files/aether-2.0.0.tree
@@ -0,0 +1,101 @@
+module: access-profile
+ +--rw access-profile
+ +--rw access-profile* [id]
+ +--rw id access-profile-id
+ +--rw display-name? string
+ +--rw type? string
+ +--rw filter? string
+ +--rw description? string
+
+module: aether-subscriber
+ +--rw subscriber
+ +--rw ue* [id]
+ +--rw id ietf:uuid
+ +--rw display-name? string
+ +--rw (imsi)?
+ | +--:(wildcard)
+ | | +--rw imsi-wildcard? string
+ | +--:(range)
+ | +--rw imsi-range-from? uint64
+ | +--rw imsi-range-to? uint64
+ +--rw serving-plmn
+ | +--rw mcc? mcc
+ | +--rw mnc? mnc
+ | +--rw tac? tac
+ +--rw requested-apn? string
+ +--rw priority? uint32
+ +--rw enabled? boolean
+ +--rw enterprise? -> /ent:enterprise/enterprise/id
+ +--rw profiles
+ +--rw apn-profile? -> /apn:apn-profile/apn-profile/id
+ +--rw up-profile? -> /up:up-profile/up-profile/id
+ +--rw qos-profile? -> /qos:qos-profile/qos-profile/id
+ +--rw access-profile* [access-profile]
+ | +--rw access-profile -> /ap:access-profile/access-profile/id
+ | +--rw allowed? boolean
+ +--rw security-profile? -> /sec:security-profile/security-profile/id
+
+module: apn-profile
+ +--rw apn-profile
+ +--rw apn-profile* [id]
+ +--rw id apn-profile-id
+ +--rw display-name? string
+ +--rw apn-name? string
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw mtu? uint32
+ +--rw gx-enabled? boolean
+ +--rw description? string
+
+module: connectivity-service
+ +--rw connectivity-service
+ +--rw connectivity-service* [id]
+ +--rw id connectivity-service-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw spgwc-endpoint? inet:uri
+ +--rw hss-endpoint? inet:uri
+
+module: enterprise
+ +--rw enterprise
+ +--rw enterprise* [id]
+ +--rw id enterprise-id
+ +--rw display-name? string
+ +--rw description? string
+ +--rw connectivity-service* [connectivity-service]
+ +--rw connectivity-service -> /cs:connectivity-service/connectivity-service/id
+ +--rw enabled? boolean
+
+module: qos-profile
+ +--rw qos-profile
+ +--rw qos-profile* [id]
+ +--rw id qos-profile-id
+ +--rw display-name? string
+ +--rw apn-ambr
+ | +--rw uplink? uint32
+ | +--rw downlink? uint32
+ +--rw qci? uint32
+ +--rw arp
+ | +--rw priority? uint32
+ | +--rw preemption-capability? boolean
+ | +--rw preemption-vulnerability? boolean
+ +--rw description? string
+
+module: security-profile
+ +--rw security-profile
+ +--rw security-profile* [id]
+ +--rw id security-profile-id
+ +--rw display-name? string
+ +--rw key? string
+ +--rw opc? string
+ +--rw sqn? uint32
+ +--rw description? string
+
+module: up-profile
+ +--rw up-profile
+ +--rw up-profile* [id]
+ +--rw id up-profile-id
+ +--rw display-name? string
+ +--rw user-plane? string
+ +--rw access-control? string
+ +--rw description? string
diff --git a/config-models/aether-2.x/files/yang/access-profile.yang b/config-models/aether-2.x/files/yang/access-profile.yang
new file mode 100755
index 0000000..d58a674
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/access-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module access-profile {
+ namespace "http://opennetworking.org/aether/access-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether access Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef access-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container access-profile {
+ description "The top level container";
+
+ list access-profile {
+ key "id";
+ description
+ "List of access profiles";
+
+ leaf id {
+ type access-profile-id;
+ description "ID for this access profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf type {
+ type string {
+ length 1..32;
+ }
+ description "type of profile";
+ }
+
+ leaf filter {
+ type string {
+ length 0..32;
+ }
+ description "filter";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/aether-subscriber.yang b/config-models/aether-2.x/files/yang/aether-subscriber.yang
new file mode 100755
index 0000000..30f3e52
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/aether-subscriber.yang
@@ -0,0 +1,178 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module aether-subscriber {
+ namespace "http://opennetworking.org/aether/subscriber";
+ prefix sub;
+
+ import apn-profile{ prefix apn; }
+ import qos-profile{ prefix qos; }
+ import up-profile{ prefix up; }
+ import access-profile{ prefix ap; }
+ import security-profile{ prefix sec; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix ietf; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether Subscriber";
+ reference "RFC 6087";
+ }
+
+ typedef mcc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef mnc {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef tac {
+ type uint32 {
+ range 0..99999999;
+ }
+ }
+
+ container subscriber {
+ description "The top level container";
+
+ list ue {
+ key "id";
+ description
+ "List of subscriber devices";
+
+ leaf id {
+ description "identifier for this subscriber, typically a UUID";
+ type ietf:uuid;
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ choice imsi {
+ case wildcard {
+ leaf imsi-wildcard {
+ type string {
+ length 1..15;
+ }
+ }
+ }
+ case range {
+ leaf imsi-range-from {
+ type uint64;
+ }
+ leaf imsi-range-to {
+ type uint64;
+ }
+ }
+ }
+
+ container serving-plmn {
+ leaf mcc {
+ type mcc;
+ description "mobile country code";
+ }
+ leaf mnc {
+ type mnc;
+ description "mobile network code";
+ }
+ leaf tac {
+ type tac;
+ description "type allocation code";
+ }
+ }
+
+ leaf requested-apn {
+ type string {
+ length 0..31;
+ }
+ description "requested access point name";
+ }
+
+ leaf priority {
+ type uint32 {
+ range 0..1000;
+ }
+ default 0;
+ description
+ "Priority for this subscriber range";
+ }
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enable or disable this ue";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ description
+ "Link to enterprise that owns this UE range";
+ }
+
+ container profiles {
+ leaf apn-profile {
+ type leafref {
+ path "/apn:apn-profile/apn:apn-profile/apn:id";
+ }
+ description
+ "Link to apn profile";
+ }
+ leaf up-profile {
+ type leafref {
+ path "/up:up-profile/up:up-profile/up:id";
+ }
+ description
+ "Link to user plane profile";
+ }
+ leaf qos-profile {
+ type leafref {
+ path "/qos:qos-profile/qos:qos-profile/qos:id";
+ }
+ description
+ "Link to qos profile";
+ }
+ list access-profile {
+ key "access-profile";
+ leaf access-profile {
+ type leafref {
+ path "/ap:access-profile/ap:access-profile/ap:id";
+ }
+ description
+ "Link to access profile";
+ }
+ leaf allowed {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow this ue to use this access profile";
+ }
+ }
+ leaf security-profile {
+ type leafref {
+ path "/sec:security-profile/sec:security-profile/sec:id";
+ }
+ description
+ "Link to security profile";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/apn-profile.yang b/config-models/aether-2.x/files/yang/apn-profile.yang
new file mode 100755
index 0000000..df18024
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/apn-profile.yang
@@ -0,0 +1,91 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module apn-profile {
+ namespace "http://opennetworking.org/aether/apn-profile";
+ prefix pro;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether APN Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef apn-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container apn-profile {
+ description "The top level container";
+
+ list apn-profile {
+ key "id";
+ description
+ "List of apn profiles";
+
+ leaf id {
+ type apn-profile-id;
+ description "ID for this apn profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf apn-name {
+ type string {
+ length 1..32;
+ }
+ description "apn name";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ leaf mtu {
+ type uint32 {
+ range 68..65535;
+ }
+ units bytes;
+ default 1460;
+ description "maximum transmission unit";
+ }
+
+ leaf gx-enabled {
+ type boolean;
+ default false;
+ description "enable gx interface";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/connectivity-service.yang b/config-models/aether-2.x/files/yang/connectivity-service.yang
new file mode 100755
index 0000000..1343a0d
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/connectivity-service.yang
@@ -0,0 +1,66 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module connectivity-service {
+ namespace "http://opennetworking.org/aether/connectivity-service";
+ prefix cs;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Connectivity Service. Specifies the endpoints where the sdcore-adapter should push configuration to. A single connectivity service may be attached to multiple Enterprises.";
+ reference "RFC 6087";
+ }
+
+ typedef connectivity-service-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container connectivity-service {
+ description "The top level container";
+
+ list connectivity-service {
+ key "id";
+ description
+ "List of connectivity services";
+
+ leaf id {
+ type connectivity-service-id;
+ description "ID for this connectivity service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this connectivity service";
+ }
+
+ leaf spgwc-endpoint {
+ type inet:uri;
+ description "url of the spgwc service";
+ }
+
+ leaf hss-endpoint {
+ type inet:uri;
+ description "url of the hss service";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/enterprise.yang b/config-models/aether-2.x/files/yang/enterprise.yang
new file mode 100755
index 0000000..38cb4b8
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/enterprise.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module enterprise {
+ namespace "http://opennetworking.org/aether/enterprise";
+ prefix ent;
+
+ import connectivity-service { prefix cs; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Enterprise. Used to distinguish ownership of devices and other resources as well as a domain of configuration.";
+ reference "RFC 6087";
+ }
+
+ typedef enterprise-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container enterprise {
+ description "The top level container";
+
+ list enterprise {
+ key "id";
+ description
+ "List of enterprises";
+
+ leaf id {
+ type enterprise-id;
+ description "ID for this enterprise.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this enterprise";
+ }
+
+ list connectivity-service {
+ key "connectivity-service";
+ leaf connectivity-service {
+ type leafref {
+ path "/cs:connectivity-service/cs:connectivity-service/cs:id";
+ }
+ description
+ "Link to connectivity services where configuration should be pushed for this enterprise's devices";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow pushes to this connectivity service";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/ietf-inet-types.yang b/config-models/aether-2.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-2.x/files/yang/ietf-yang-types.yang b/config-models/aether-2.x/files/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..ee58fa3
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/ietf-yang-types.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/qos-profile.yang b/config-models/aether-2.x/files/yang/qos-profile.yang
new file mode 100755
index 0000000..5ad91b4
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/qos-profile.yang
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module qos-profile {
+ namespace "http://opennetworking.org/aether/qos-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether qos Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef qos-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container qos-profile {
+ description "The top level container";
+
+ list qos-profile {
+ key "id";
+ description
+ "List of qos profiles";
+
+ leaf id {
+ type qos-profile-id;
+ description "ID for this qos profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ container apn-ambr {
+ leaf uplink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Upstream aggregate maximum bit rate";
+ }
+ leaf downlink {
+ type uint32 {
+ range 0..4294967295;
+ }
+ default 0;
+ units bps;
+ description
+ "Downstream aggregate maximum bit rate";
+ }
+ }
+
+ leaf qci {
+ type uint32 {
+ range 0..85;
+ }
+ default 9;
+ description
+ "QoS Class Identifier";
+ }
+
+ container arp {
+ leaf priority {
+ type uint32 {
+ range 0..15;
+ }
+ default 0;
+ description
+ "Priority";
+ }
+ leaf preemption-capability {
+ type boolean;
+ default true;
+ description
+ "True if a bearer with lower priority should be dropped";
+ }
+ leaf preemption-vulnerability {
+ type boolean;
+ default true;
+ description
+ "This bearer may be dropped for a bearer with higher priority";
+ }
+ description "Evolved-ARP";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/security-profile.yang b/config-models/aether-2.x/files/yang/security-profile.yang
new file mode 100755
index 0000000..a8a3069
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/security-profile.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module security-profile {
+ namespace "http://opennetworking.org/aether/security-profile";
+ prefix sec;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-11-30" {
+ description "An Aether Security Profile. Contains keys and other security items associated with devices. Configured by the operator.";
+ reference "RFC 6087";
+ }
+
+ typedef security-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container security-profile {
+ description "The top level container";
+
+ list security-profile {
+ key "id";
+ description
+ "List of security profiles";
+
+ leaf id {
+ type security-profile-id;
+ description "ID for this security profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf key {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for USIM";
+ }
+
+ leaf opc {
+ type string {
+ length 1..32;
+ }
+ description "Secret key for Operator";
+ }
+
+ leaf sqn {
+ type uint32;
+ description "sequence number";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this security profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/files/yang/up-profile.yang b/config-models/aether-2.x/files/yang/up-profile.yang
new file mode 100755
index 0000000..9a38b02
--- /dev/null
+++ b/config-models/aether-2.x/files/yang/up-profile.yang
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module up-profile {
+ namespace "http://opennetworking.org/aether/user-plane-profile";
+ prefix pro;
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "To generate JSON from this use command
+ pyang -f jtoxx test1.yang | python3 -m json.tool > test1.json
+ Copied from YangUIComponents project";
+
+ revision "2020-10-22" {
+ description "An Aether user plane Profile";
+ reference "RFC 6087";
+ }
+
+ // TODO: Think more on whether this should be a UUID or
+ // simply a unique name. If it's a UUID, could fix the
+ // string length.
+ typedef up-profile-id {
+ type string {
+ length 1..32;
+ }
+ }
+
+ container up-profile {
+ description "The top level container";
+
+ list up-profile {
+ key "id";
+ description
+ "List of user plane profiles";
+
+ leaf id {
+ type up-profile-id;
+ description "ID for this user plane profile.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf user-plane {
+ type string {
+ length 1..255;
+ }
+ description "user plane name";
+ }
+
+ leaf access-control {
+ type string {
+ length 1..32;
+ }
+ description "access control policy";
+ }
+
+ leaf description {
+ type string {
+ length 1..100;
+ }
+ description "description of this profile";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-2.x/templates/_helpers.tpl b/config-models/aether-2.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-2.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-2.x/templates/model.yaml b/config-models/aether-2.x/templates/model.yaml
new file mode 100644
index 0000000..787912e
--- /dev/null
+++ b/config-models/aether-2.x/templates/model.yaml
@@ -0,0 +1,53 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: aether-subscriber
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: aether-subscriber.yang
+ - name: apn-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: apn-profile.yang
+ - name: up-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: up-profile.yang
+ - name: qos-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: qos-profile.yang
+ - name: access-profile
+ organization: Open Networking Foundation
+ revision: 2020-10-22
+ file: access-profile.yang
+ - name: enterprise
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: enterprise.yang
+ - name: connectivity-service
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: connectivity-service.yang
+ - name: security-profile
+ organization: Open Networking Foundation
+ revision: 2020-11-30
+ file: security-profile.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-2.x/values.yaml b/config-models/aether-2.x/values.yaml
new file mode 100644
index 0000000..1b22ea4
--- /dev/null
+++ b/config-models/aether-2.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
diff --git a/config-models/aether-3.x/Chart.yaml b/config-models/aether-3.x/Chart.yaml
new file mode 100644
index 0000000..79c5a63
--- /dev/null
+++ b/config-models/aether-3.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 3.0.13
+kubeVersion: ">=1.18.0"
+appVersion: 3.0.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-3.x/files/aether-3.0.0.tree b/config-models/aether-3.x/files/aether-3.0.0.tree
new file mode 100644
index 0000000..f23f176
--- /dev/null
+++ b/config-models/aether-3.x/files/aether-3.0.0.tree
@@ -0,0 +1,140 @@
+module: ap-list
+ +--rw ap-list
+ +--rw ap-list* [id]
+ +--rw id ap-list-id
+ +--rw access-points* [address]
+ | +--rw address inet:host
+ | +--rw tac at:tac
+ | +--rw enable? boolean
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: application
+ +--rw application
+ +--rw application* [id]
+ +--rw id application-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw endpoint* [name]
+ | +--rw name string
+ | +--rw address ietf:host
+ | +--rw port-start ietf:port-number
+ | +--rw port-end? ietf:port-number
+ | +--rw protocol? at:protocol
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: connectivity-service
+ +--rw connectivity-service
+ +--rw connectivity-service* [id]
+ +--rw id connectivity-service-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw spgwc-endpoint? inet:uri
+ +--rw hss-endpoint? inet:uri
+ +--rw pcrf-endpoint? inet:uri
+ +--rw core-5g-endpoint? inet:uri
+
+module: device-group
+ +--rw device-group
+ +--rw device-group* [id]
+ +--rw id device-group-id
+ +--rw description? at:description
+ +--rw display-name? string
+ +--rw imsis* [name]
+ | +--rw name string
+ | +--rw imsi-range-from? uint64
+ | +--rw imsi-range-to? uint64
+ +--rw ip-domain? -> /ipd:ip-domain/ip-domain/id
+ +--rw site -> /st:site/site/id
+
+module: enterprise
+ +--rw enterprise
+ +--rw enterprise* [id]
+ +--rw id enterprise-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw connectivity-service* [connectivity-service]
+ +--rw connectivity-service -> /cs:connectivity-service/connectivity-service/id
+ +--rw enabled? boolean
+
+module: ip-domain
+ +--rw ip-domain
+ +--rw ip-domain* [id]
+ +--rw id ip-domain-id
+ +--rw display-name? string
+ +--rw dnn? at:dnn
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw subnet inet:ipv4-prefix
+ +--rw admin-status? at:admin-status
+ +--rw mtu? at:mtu
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: site
+ +--rw site
+ +--rw site* [id]
+ +--rw id site-id
+ +--rw display-name? string
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+ +--rw imsi-definition
+ | +--rw mcc at:mcc
+ | +--rw mnc at:mnc
+ | +--rw enterprise at:ent
+ | +--rw format string
+ +--rw description? at:description
+
+module: template
+ +--rw template
+ +--rw template* [id]
+ +--rw id template-id
+ +--rw display-name? string
+ +--rw sst? at:sst
+ +--rw sd? at:sd
+ +--rw uplink? uint32
+ +--rw downlink? uint32
+ +--rw traffic-class? -> /tc:traffic-class/traffic-class/id
+ +--rw description? at:description
+
+module: traffic-class
+ +--rw traffic-class
+ +--rw traffic-class* [id]
+ +--rw id traffic-class-id
+ +--rw display-name? string
+ +--rw pelr? at:pelr
+ +--rw pdb? at:pdb
+ +--rw qci? at:qci
+ +--rw description? at:description
+
+module: upf
+ +--rw upf
+ +--rw upf* [id]
+ +--rw id upf-id
+ +--rw address inet:host
+ +--rw port inet:port-number
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: vcs
+ +--rw vcs
+ +--rw vcs* [id]
+ +--rw id vcs-id
+ +--rw display-name? string
+ +--rw device-group* [device-group]
+ | +--rw device-group -> /dg:device-group/device-group/id
+ | +--rw enable? boolean
+ +--rw template? -> /vt:template/template/id
+ +--rw application* [application]
+ | +--rw application -> /app:application/application/id
+ | +--rw allow? boolean
+ +--rw upf? -> /upf:upf/upf/id
+ +--rw ap? -> /apl:ap-list/ap-list/id
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+ +--rw sst at:sst
+ +--rw sd at:sd
+ +--rw uplink? uint32
+ +--rw downlink? uint32
+ +--rw traffic-class -> /tc:traffic-class/traffic-class/id
diff --git a/config-models/aether-3.x/files/yang/aether-types.yang b/config-models/aether-3.x/files/yang/aether-types.yang
new file mode 100755
index 0000000..fedbdc6
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/aether-types.yang
@@ -0,0 +1,109 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module aether-types {
+ namespace "http://opennetworking.org/aether/aether-types";
+ prefix at;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "A set of base types for aether modeling.";
+
+ revision "2021-06-02" {
+ description "Aether Base Types";
+ reference "RFC 6087";
+ }
+
+ typedef mcc {
+ type string {
+ pattern '[0-9]{3}';
+ }
+ }
+
+ typedef mnc {
+ type string {
+ pattern '[0-9]{2,3}';
+ }
+ }
+
+ typedef tac {
+ type string {
+ length 4..8;
+ pattern '[0-9A-F\.]*';
+ }
+ }
+
+ typedef ent {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef dnn {
+ type string {
+ length 1..32;
+ }
+ }
+
+ typedef sst {
+ type uint8 {
+ range 1..255;
+ }
+ }
+
+ typedef sd {
+ type uint32 {
+ range 0..16777215;
+ }
+ }
+
+ typedef qci {
+ type uint8 {
+ range 1..32;
+ }
+ }
+
+ typedef pelr {
+ type int8 {
+ range 0..10;
+ }
+ }
+
+ typedef pdb {
+ type uint16 {
+ range 0..1000;
+ }
+ }
+
+ // "TCP" or "UDP"
+ typedef protocol {
+ type string {
+ length 3;
+ pattern "TCP|UDP";
+ }
+ default "TCP";
+ }
+
+ // "ENABLE" | "MAINTENTANCE" | "DISABLE"
+ typedef admin-status {
+ type string {
+ length 0..16;
+ pattern "ENABLE|MAINTENANCE|DISABLE";
+ }
+ default "ENABLE";
+ }
+
+ typedef mtu {
+ type inet:port-number;
+ default 1492;
+ }
+
+ typedef description {
+ type string {
+ length 1..1024;
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/ap-list.yang b/config-models/aether-3.x/files/yang/ap-list.yang
new file mode 100755
index 0000000..3c1a759
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/ap-list.yang
@@ -0,0 +1,91 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module ap-list {
+ namespace "http://opennetworking.org/aether/ap-list";
+ prefix apl;
+
+ import ietf-inet-types { prefix inet; }
+ import aether-types { prefix at; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether AP List is a named list of access points.";
+
+ revision "2021-06-02" {
+ description "An Aether Access Point List";
+ reference "RFC 6087";
+ }
+
+ typedef ap-list-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container ap-list {
+ description "The top level container";
+
+ list ap-list {
+ key "id";
+ description
+ "A list of named ap-lists.";
+
+ leaf id {
+ type ap-list-id;
+ description "ID for this ap-list.";
+ }
+
+ list access-points {
+ key "address";
+ leaf address {
+ type inet:host;
+ description
+ "Address of access point";
+ }
+ leaf tac {
+ type at:tac;
+ mandatory true;
+ description
+ "Type Allocation Code";
+ }
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enable this access point";
+ }
+ description
+ "List of access point addresses";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this ap-list";
+ }
+
+ // Access point lists are always owned by an Enterprise, since they typically exist on the
+ // Enterprise's edge. An ApList is not owned by Site, to cover the case where a ApList may
+ // include access points that span multiple sites.
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this Access Point List";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/application.yang b/config-models/aether-3.x/files/yang/application.yang
new file mode 100755
index 0000000..2f1a4fc
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/application.yang
@@ -0,0 +1,99 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module application {
+ namespace "http://opennetworking.org/enterprise/application";
+ prefix app;
+
+ import ietf-inet-types{ prefix ietf; }
+ import aether-types{ prefix at; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Application is an application that UE devices may
+ connect to. Includes a set of endpoints where services are
+ provided.";
+
+ revision "2021-06-02" {
+ description "Aether Application.";
+ reference "RFC 6087";
+ }
+
+ typedef application-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container application {
+ description "The top level container";
+
+ list application {
+ key "id";
+ description
+ "List of applications";
+
+ leaf id {
+ type application-id;
+ description "ID for this application.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this application";
+ }
+
+ list endpoint {
+ key "name";
+ max-elements 1;
+ leaf name {
+ type string;
+ description
+ "Name of this endpoint";
+ }
+ leaf address {
+ type ietf:host;
+ mandatory true;
+ description
+ "Address of this endpoint. Either a hostname, and IP, or a subnet.";
+ }
+ leaf port-start {
+ type ietf:port-number;
+ mandatory true;
+ description
+ "First port in range";
+ }
+ leaf port-end {
+ type ietf:port-number;
+ description
+ "Last port in range";
+ }
+ leaf protocol {
+ type at:protocol;
+ description
+ "Name of this endpoint";
+ }
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this Application. May be set to None if the application is global to all Enterprises.";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/connectivity-service.yang b/config-models/aether-3.x/files/yang/connectivity-service.yang
new file mode 100755
index 0000000..f3cc3fc
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/connectivity-service.yang
@@ -0,0 +1,76 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module connectivity-service {
+ namespace "http://opennetworking.org/aether/connectivity-service";
+ prefix cs;
+
+ import aether-types { prefix at; }
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Connectivity service is the linkage between the
+ ROC and a core that provides connectivity.";
+
+ revision "2021-06-02" {
+ description "An Aether Connectivity Service. Specifies the endpoints where the sdcore-adapter should push configuration to. A single connectivity service may be attached to multiple Enterprises.";
+ reference "RFC 6087";
+ }
+
+ typedef connectivity-service-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container connectivity-service {
+ description "The top level container";
+
+ list connectivity-service {
+ key "id";
+ description
+ "List of connectivity services";
+
+ leaf id {
+ type connectivity-service-id;
+ description "ID for this connectivity service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this connectivity service";
+ }
+
+ leaf spgwc-endpoint {
+ type inet:uri;
+ description "url of the spgwc service";
+ }
+
+ leaf hss-endpoint {
+ type inet:uri;
+ description "url of the hss service";
+ }
+
+ leaf pcrf-endpoint {
+ type inet:uri;
+ description "url of the pcrf service";
+ }
+
+ leaf core-5g-endpoint {
+ type inet:uri;
+ description "url of the 5g core";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/device-group.yang b/config-models/aether-3.x/files/yang/device-group.yang
new file mode 100755
index 0000000..e9c1590
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/device-group.yang
@@ -0,0 +1,99 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module device-group {
+ namespace "http://opennetworking.org/aether/device-group";
+ prefix dg;
+
+ import aether-types { prefix at; }
+ import ip-domain{ prefix ipd; }
+ import site{ prefix st; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An aether device group represents a list of device IMSIS.
+ This list is expressed as a set of ranges,
+ [(from_imsi, to_imsi),
+ (from_imsi, to_imsi),
+ ...].
+ Each device group belongs to a site and has associated
+ with it an ip-profile that determines the IP address
+ and DNS settings that apply to devices within the
+ group";
+
+ revision "2021-06-02" {
+ description "An Aether Device Group";
+ reference "RFC 6087";
+ }
+
+ typedef device-group-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container device-group {
+ description "The top level container";
+
+ list device-group {
+ key "id";
+ description
+ "List of device groups";
+
+ leaf id {
+ type device-group-id;
+ description "ID for this device group.";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this device group";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list imsis {
+ // TODO: imsi-range-from cannot be used as a list index
+ key "name";
+ leaf name {
+ type string;
+ }
+ leaf imsi-range-from {
+ type uint64;
+ }
+ leaf imsi-range-to {
+ type uint64;
+ }
+ description
+ "List of imsi ranges that comprise this group. It's acceptable for
+ a range to degenerate to being a singleton";
+ }
+
+ leaf ip-domain {
+ type leafref {
+ path "/ipd:ip-domain/ipd:ip-domain/ipd:id";
+ }
+ description
+ "Link to ip-domain settings that determine the pool of IP addresses,
+ as well as the domain resolver settings to use";
+ }
+
+ leaf site {
+ type leafref {
+ path "/st:site/st:site/st:id";
+ }
+ mandatory true;
+ description
+ "Link to site";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/enterprise.yang b/config-models/aether-3.x/files/yang/enterprise.yang
new file mode 100755
index 0000000..4d91f47
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/enterprise.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module enterprise {
+ namespace "http://opennetworking.org/aether/enterprise";
+ prefix ent;
+
+ import aether-types { prefix at; }
+ import connectivity-service { prefix cs; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Enterprise is an administration entity that
+ has ownership of resrouces.";
+
+ revision "2021-06-02" {
+ description "An Aether Enterprise. Used to distinguish ownership of devices and other resources as well as a domain of configuration.";
+ reference "RFC 6087";
+ }
+
+ typedef enterprise-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container enterprise {
+ description "The top level container";
+
+ list enterprise {
+ key "id";
+ description
+ "List of enterprises";
+
+ leaf id {
+ type enterprise-id;
+ description "ID for this enterprise.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this enterprise";
+ }
+
+ list connectivity-service {
+ key "connectivity-service";
+ leaf connectivity-service {
+ type leafref {
+ path "/cs:connectivity-service/cs:connectivity-service/cs:id";
+ }
+ description
+ "Link to connectivity services where configuration should be pushed for this enterprise's devices";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow pushes to this connectivity service";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/ietf-inet-types.yang b/config-models/aether-3.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-3.x/files/yang/ietf-yang-types.yang b/config-models/aether-3.x/files/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..ee58fa3
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/ietf-yang-types.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/ip-domain.yang b/config-models/aether-3.x/files/yang/ip-domain.yang
new file mode 100755
index 0000000..7f2bf73
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/ip-domain.yang
@@ -0,0 +1,102 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module ip-domain {
+ namespace "http://opennetworking.org/aether/ip-domain";
+ prefix ipd;
+
+ import ietf-inet-types { prefix inet; }
+ import aether-types { prefix at; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether IP-Domain. This is a list of available subnets
+ that may be assigned to UEs, as well as DNS servers and other
+ metadata";
+
+ revision "2021-06-02" {
+ description "An Aether IP and Domain Specification";
+ reference "RFC 6087";
+ }
+
+ typedef ip-domain-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container ip-domain {
+ description "The top level container";
+
+ list ip-domain {
+ key "id";
+ description
+ "List of ip domains";
+
+ leaf id {
+ type ip-domain-id;
+ description "ID for this ip domain.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf dnn {
+ type at:dnn;
+ description "DNN/APN";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ // Note: Cannot use a subnet as a list key. Dropped support from a
+ // list of subnets to a single subnet. Revisit in the future.
+ leaf subnet {
+ type inet:ipv4-prefix;
+ mandatory true;
+ description "subnet to allocate ip addresses from";
+ }
+
+ leaf admin-status {
+ type at:admin-status;
+ description "administrative status";
+ }
+
+ leaf mtu {
+ type at:mtu;
+ description "maximum transmission unit";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this ip domain";
+ }
+
+ // Ip-Domain is always owned by an Enterprise, because it contains
+ // IP addresses relative to that Enterprise.
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this IP-Domain";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/site.yang b/config-models/aether-3.x/files/yang/site.yang
new file mode 100755
index 0000000..89f8fc7
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/site.yang
@@ -0,0 +1,100 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module site {
+ namespace "http://opennetworking.org/aether/site";
+ prefix st;
+
+ import aether-types{ prefix at; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether site is a location where resources are deployed.";
+
+ revision "2021-06-02" {
+ description "An Aether Site.";
+ reference "RFC 6087";
+ }
+
+ typedef site-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container site {
+ description "The top level container";
+
+ list site {
+ key "id";
+ description
+ "List of site";
+
+ leaf id {
+ type site-id;
+ description "ID for this site.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ description
+ "Link to enterprise that owns this site";
+ mandatory true;
+ }
+
+ container imsi-definition {
+ leaf mcc {
+ type at:mcc;
+ description "mobile country code";
+ mandatory true;
+ }
+ leaf mnc {
+ type at:mnc;
+ description "mobile network code";
+ mandatory true;
+ }
+ leaf enterprise {
+ type at:ent;
+ description "enterprise-specific identifier";
+ mandatory true;
+ }
+ leaf format {
+ type string {
+ length 15;
+ }
+ mandatory true;
+ description "IMSI format specifier, describes how fields are packed into an IMSI. Must be exactly 15 characters long. For example, CCCNNNEEESSSSSS.";
+ // Format specifiers:
+ // C = MCC
+ // N = MNC
+ // E = Enterprise
+ // 0 = Forced Zero
+ // S = Subscriber ID
+ // default is
+ // 3 digit MCC
+ // 3 digit MNC
+ // 3 digit enterprise ID
+ // 5 digit subscriber ID
+ }
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this site";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/template.yang b/config-models/aether-3.x/files/yang/template.yang
new file mode 100755
index 0000000..ea040e7
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/template.yang
@@ -0,0 +1,85 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module template {
+ namespace "http://opennetworking.org/aether/template";
+ prefix tp;
+
+ import aether-types{ prefix at; }
+ import traffic-class{ prefix tc; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "The aether vcs-template holds common parameters used
+ by a virtual connectivity service. Templates are used to
+ populate a VCS.";
+
+ revision "2021-06-02" {
+ description "An Aether Virtual Cellular Service Template";
+ reference "RFC 6087";
+ }
+
+ typedef template-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container template {
+ description "The top level container";
+
+ list template {
+ key "id";
+ description
+ "List of vcs templates";
+
+ leaf id {
+ type template-id;
+ description "ID for this vcs template.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf sst {
+ type at:sst;
+ description "Slice/Service type";
+ }
+
+ leaf sd {
+ type at:sd;
+ description "Slice differentiator";
+ }
+
+ leaf uplink {
+ type uint32;
+ description "Uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type uint32;
+ description "Downlink data rate in mbps";
+ }
+
+ leaf traffic-class {
+ type leafref {
+ path "/tc:traffic-class/tc:traffic-class/tc:id";
+ }
+ description
+ "Link to traffic class";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this vcs template";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/traffic-class.yang b/config-models/aether-3.x/files/yang/traffic-class.yang
new file mode 100755
index 0000000..636c816
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/traffic-class.yang
@@ -0,0 +1,70 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module traffic-class {
+ namespace "http://opennetworking.org/aether/traffic-class";
+ prefix tp;
+
+ import aether-types{ prefix at; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "The aether traffic class associates qos constants
+ with a named class of service";
+
+ revision "2021-06-02" {
+ description "An Aether Traffic Class";
+ reference "RFC 6087";
+ }
+
+ typedef traffic-class-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container traffic-class {
+ description "The top level container";
+
+ list traffic-class {
+ key "id";
+ description
+ "List of traffic class";
+
+ leaf id {
+ type traffic-class-id;
+ description "ID for this traffic class.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf pelr {
+ type at:pelr;
+ description "PELR exponent";
+ }
+
+ leaf pdb {
+ type at:pdb;
+ description "PDB";
+ }
+
+ leaf qci {
+ type at:qci;
+ description "QCI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this traffic class";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/upf.yang b/config-models/aether-3.x/files/yang/upf.yang
new file mode 100755
index 0000000..1c92214
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/upf.yang
@@ -0,0 +1,81 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module upf {
+ namespace "http://opennetworking.org/aether/upf";
+ prefix upf;
+
+ import aether-types { prefix at; }
+ import ietf-inet-types { prefix inet; }
+ import enterprise{ prefix ent; }
+ import ietf-yang-types{ prefix yg; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "A Aether UPF List is a named User Plane Function.";
+
+ revision "2021-06-02" {
+ description "An Aether User Plane Function";
+ reference "RFC 6087";
+ }
+
+ typedef upf-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container upf {
+ description "The top level container";
+
+ list upf {
+ key "id";
+ description
+ "A list of named upfs.";
+
+ leaf id {
+ type upf-id;
+ description "ID for this upf.";
+ }
+
+ leaf address {
+ type inet:host;
+ mandatory true;
+ description
+ "Address of UPF";
+ }
+
+ leaf port {
+ type inet:port-number;
+ mandatory true;
+ description
+ "Port for UPF";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this UPF";
+ }
+
+ // UPFs are always owned by an Enterprise, since they typically exist on the
+ // Enterprise's edge. TODO: Consider whether they should be owned by a Site
+ // instead of Enterprise.
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this Access Point List";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-3.x/files/yang/vcs.yang b/config-models/aether-3.x/files/yang/vcs.yang
new file mode 100755
index 0000000..ab4e370
--- /dev/null
+++ b/config-models/aether-3.x/files/yang/vcs.yang
@@ -0,0 +1,171 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module vcs {
+ namespace "http://opennetworking.org/aether/vcs";
+ prefix sl;
+
+ import template{ prefix vt; }
+ import upf { prefix upf; }
+ import ap-list{ prefix apl; }
+ import application{ prefix app; }
+ import aether-types{ prefix at; }
+ import device-group{ prefix dg; }
+ import traffic-class{ prefix tc; }
+ import ietf-yang-types{ prefix yg; }
+ import enterprise{ prefix ent; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Virtual Cellular Service (VCS) is
+ used to connect UE devices with applications";
+
+ revision "2021-06-02" {
+ description "An Aether Virtual Cellular Service";
+ reference "RFC 6087";
+ }
+
+ typedef vcs-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container vcs {
+ description "The top level container";
+
+ list vcs {
+ key "id";
+ description
+ "List of virtual cellular services";
+
+ leaf id {
+ type vcs-id;
+ description "ID for this vcs.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list device-group {
+ key "device-group";
+ leaf device-group {
+ type leafref {
+ path "/dg:device-group/dg:device-group/dg:id";
+ }
+ description
+ "Link to device group";
+ }
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enable this device group";
+ }
+ description
+ "A list of device groups. Groups will only participate in
+ the VCS if the enable field is set to True";
+ }
+
+ leaf template {
+ type leafref {
+ path "/vt:template/vt:template/vt:id";
+ }
+ description
+ "Link to user vcs template that was used to initialize
+ this VCS";
+ }
+
+ list application {
+ key "application";
+ leaf application {
+ type leafref {
+ path "/app:application/app:application/app:id";
+ }
+ mandatory true;
+ description
+ "Link to application";
+ }
+ leaf allow {
+ type boolean;
+ default true;
+ description
+ "Allow or deny this application";
+ }
+ description
+ "An ordered list of applications to allow and deny. The deny rules
+ will be executed first, followed by the allow rules. The first rule
+ to match is returned. An implicit DENY ALL lies at the end.";
+ }
+
+ leaf upf {
+ type leafref {
+ path "/upf:upf/upf:upf/upf:id";
+ }
+ description
+ "Link to user plane that implements this vcf";
+ }
+
+ leaf ap {
+ type leafref {
+ path "/apl:ap-list/apl:ap-list/apl:id";
+ }
+ description
+ "Link to access-point list";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this vcs";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this VCS";
+ }
+
+ // the following are populated from the template
+ leaf sst {
+ type at:sst;
+ mandatory true;
+ description "Slice/Service type. Immutable.";
+ }
+
+ leaf sd {
+ type at:sd;
+ mandatory true;
+ description "Slice differentiator. Immutable.";
+ }
+
+ leaf uplink {
+ type uint32;
+ description "Uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type uint32;
+ description "Downlink data rate in mbps";
+ }
+
+ leaf traffic-class {
+ type leafref {
+ path "/tc:traffic-class/tc:traffic-class/tc:id";
+ }
+ mandatory true;
+ description
+ "Link to traffic class";
+ }
+ // end of items populated from the template
+ }
+ }
+}
diff --git a/config-models/aether-3.x/templates/_helpers.tpl b/config-models/aether-3.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-3.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-3.x/templates/model.yaml b/config-models/aether-3.x/templates/model.yaml
new file mode 100644
index 0000000..949b436
--- /dev/null
+++ b/config-models/aether-3.x/templates/model.yaml
@@ -0,0 +1,70 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: connectivity-service
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: connectivity-service.yang
+ - name: enterprise
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: enterprise.yang
+# new 5G models
+ - name: aether-types
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: aether-types.yang
+ - name: ap-list
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: ap-list.yang
+ - name: application
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: application.yang
+ - name: device-group
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: device-group.yang
+ - name: ip-domain
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: ip-domain.yang
+ - name: site
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: site.yang
+ - name: upf-list
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: upf.yang
+ - name: vcs
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: vcs.yang
+ - name: template
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: template.yang
+ - name: traffic-class
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: traffic-class.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-3.x/values.yaml b/config-models/aether-3.x/values.yaml
new file mode 100644
index 0000000..2e984ed
--- /dev/null
+++ b/config-models/aether-3.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
diff --git a/config-models/aether-4.x/CHANGELOG.md b/config-models/aether-4.x/CHANGELOG.md
new file mode 100644
index 0000000..6a855ed
--- /dev/null
+++ b/config-models/aether-4.x/CHANGELOG.md
@@ -0,0 +1,32 @@
+<!--
+SPDX-FileCopyrightText: 2021 Open Networking Foundation
+
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+-->
+Differences from Aether-3.0.0
+
+VCS and Template:
+ * Containerized device MBR Uplink and Download to device.mbr.uplink and device.mbr.downlink
+ * Added slice.mbr.uplink and slice.mbr.downlink
+ * Remove link to AP-List
+ * All bitrates are now uint64 and have units "bps"
+
+Site:
+ * Added link to AP-List
+ * Now includes a list of access points
+ * Small-cell (formerly access-point) list includes a name for each AP
+
+Application:
+ * Added mbr.uplink and mbr.downlink
+
+Traffic-Class:
+ * Removed pelr and pdb
+ * Added arp
+
+AP-List
+ * Removed; contents added to slice
+
+UPF:
+ * Added config-endpoint
+
+Models prefixed with onf- throughout.
diff --git a/config-models/aether-4.x/Chart.yaml b/config-models/aether-4.x/Chart.yaml
new file mode 100644
index 0000000..3f4a1be
--- /dev/null
+++ b/config-models/aether-4.x/Chart.yaml
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+name: config-model-aether
+version: 4.0.3
+kubeVersion: ">=1.18.0"
+appVersion: 4.0.0
+description: Aether config model
+keywords:
+ - onos
+ - sdn
+ - config
+home: https://onosproject.org
+maintainers:
+ - name: ONOS Support
+ email: support@opennetworking.org
diff --git a/config-models/aether-4.x/files/aether-4.0.0.tree b/config-models/aether-4.x/files/aether-4.0.0.tree
new file mode 100644
index 0000000..11038cc
--- /dev/null
+++ b/config-models/aether-4.x/files/aether-4.0.0.tree
@@ -0,0 +1,147 @@
+module: onf-application
+ +--rw application
+ +--rw application* [id]
+ +--rw id application-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw endpoint* [name]
+ | +--rw name string
+ | +--rw address ietf:host
+ | +--rw port-start ietf:port-number
+ | +--rw port-end? ietf:port-number
+ | +--rw protocol? at:protocol
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+ +--rw mbr
+ +--rw uplink? at:bitrate
+ +--rw downlink? at:bitrate
+
+module: onf-connectivity-service
+ +--rw connectivity-service
+ +--rw connectivity-service* [id]
+ +--rw id connectivity-service-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw spgwc-endpoint? inet:uri
+ +--rw hss-endpoint? inet:uri
+ +--rw pcrf-endpoint? inet:uri
+ +--rw core-5g-endpoint? inet:uri
+
+module: onf-device-group
+ +--rw device-group
+ +--rw device-group* [id]
+ +--rw id device-group-id
+ +--rw description? at:description
+ +--rw display-name? string
+ +--rw imsis* [name]
+ | +--rw name string
+ | +--rw imsi-range-from? uint64
+ | +--rw imsi-range-to? uint64
+ +--rw ip-domain? -> /ipd:ip-domain/ip-domain/id
+ +--rw site -> /st:site/site/id
+
+module: onf-enterprise
+ +--rw enterprise
+ +--rw enterprise* [id]
+ +--rw id enterprise-id
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw connectivity-service* [connectivity-service]
+ +--rw connectivity-service -> /cs:connectivity-service/connectivity-service/id
+ +--rw enabled? boolean
+
+module: onf-ip-domain
+ +--rw ip-domain
+ +--rw ip-domain* [id]
+ +--rw id ip-domain-id
+ +--rw display-name? string
+ +--rw dnn? at:dnn
+ +--rw dns-primary? inet:ip-address
+ +--rw dns-secondary? inet:ip-address
+ +--rw subnet inet:ipv4-prefix
+ +--rw admin-status? at:admin-status
+ +--rw mtu? at:mtu
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: onf-site
+ +--rw site
+ +--rw site* [id]
+ +--rw id site-id
+ +--rw display-name? string
+ +--rw small-cell* [name]
+ | +--rw name yg:yang-identifier
+ | +--rw address? inet:host
+ | +--rw tac at:tac
+ | +--rw enable? boolean
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+ +--rw imsi-definition
+ | +--rw mcc at:mcc
+ | +--rw mnc at:mnc
+ | +--rw enterprise at:ent
+ | +--rw format string
+ +--rw description? at:description
+
+module: onf-template
+ +--rw template
+ +--rw template* [id]
+ +--rw id template-id
+ +--rw display-name? string
+ +--rw sst? at:sst
+ +--rw sd? at:sd
+ +--rw device
+ | +--rw mbr
+ | +--rw uplink? at:bitrate
+ | +--rw downlink? at:bitrate
+ +--rw slice
+ | +--rw mbr
+ | +--rw uplink? at:bitrate
+ | +--rw downlink? at:bitrate
+ +--rw traffic-class? -> /tc:traffic-class/traffic-class/id
+ +--rw description? at:description
+
+module: onf-traffic-class
+ +--rw traffic-class
+ +--rw traffic-class* [id]
+ +--rw id traffic-class-id
+ +--rw display-name? string
+ +--rw arp? at:arp
+ +--rw qci? at:qci
+ +--rw description? at:description
+
+module: onf-upf
+ +--rw upf
+ +--rw upf* [id]
+ +--rw id upf-id
+ +--rw address inet:host
+ +--rw port inet:port-number
+ +--rw config-endpoint? inet:uri
+ +--rw display-name? string
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+
+module: onf-vcs
+ +--rw vcs
+ +--rw vcs* [id]
+ +--rw id vcs-id
+ +--rw display-name? string
+ +--rw device-group* [device-group]
+ | +--rw device-group -> /dg:device-group/device-group/id
+ | +--rw enable? boolean
+ +--rw template? -> /vt:template/template/id
+ +--rw application* [application]
+ | +--rw application -> /app:application/application/id
+ | +--rw allow? boolean
+ +--rw upf? -> /upf:upf/upf/id
+ +--rw description? at:description
+ +--rw enterprise -> /ent:enterprise/enterprise/id
+ +--rw sst at:sst
+ +--rw sd at:sd
+ +--rw device
+ | +--rw mbr
+ | +--rw uplink? at:bitrate
+ | +--rw downlink? at:bitrate
+ +--rw slice
+ | +--rw mbr
+ | +--rw uplink? at:bitrate
+ | +--rw downlink? at:bitrate
+ +--rw traffic-class -> /tc:traffic-class/traffic-class/id
diff --git a/config-models/aether-4.x/files/yang/ietf-inet-types.yang b/config-models/aether-4.x/files/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..eacefb6
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/ietf-inet-types.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/config-models/aether-4.x/files/yang/ietf-yang-types.yang b/config-models/aether-4.x/files/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..ee58fa3
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/ietf-yang-types.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-aether-types.yang b/config-models/aether-4.x/files/yang/onf-aether-types.yang
new file mode 100755
index 0000000..07b526e
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-aether-types.yang
@@ -0,0 +1,120 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-aether-types {
+ namespace "http://opennetworking.org/aether/aether-types";
+ prefix at;
+
+ import ietf-inet-types { prefix inet; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "A set of base types for aether modeling.";
+
+ revision "2021-09-10" {
+ description "Aether Base Types";
+ reference "RFC 6087";
+ }
+
+ typedef bitrate {
+ type uint64 {
+ }
+ }
+
+ typedef mcc {
+ type string {
+ pattern '[0-9]{3}';
+ }
+ }
+
+ typedef mnc {
+ type string {
+ pattern '[0-9]{2,3}';
+ }
+ }
+
+ typedef tac {
+ type string {
+ length 4..8;
+ pattern '[0-9A-F\.]*';
+ }
+ }
+
+ typedef ent {
+ type uint32 {
+ range 0..999;
+ }
+ }
+
+ typedef dnn {
+ type string {
+ length 1..32;
+ }
+ }
+
+ typedef sst {
+ type uint8 {
+ range 1..255;
+ }
+ }
+
+ typedef sd {
+ type uint32 {
+ range 0..16777215;
+ }
+ }
+
+ typedef qci {
+ type uint8 {
+ range 1..32;
+ }
+ }
+
+ typedef arp {
+ type uint8 {
+ range 1..15;
+ }
+ }
+
+ typedef pelr {
+ type int8 {
+ range 0..10;
+ }
+ }
+
+ typedef pdb {
+ type uint16 {
+ range 0..1000;
+ }
+ }
+
+ // "TCP" or "UDP"
+ typedef protocol {
+ type string {
+ length 3;
+ pattern "TCP|UDP";
+ }
+ default "TCP";
+ }
+
+ // "ENABLE" | "MAINTENTANCE" | "DISABLE"
+ typedef admin-status {
+ type string {
+ length 0..16;
+ pattern "ENABLE|MAINTENANCE|DISABLE";
+ }
+ default "ENABLE";
+ }
+
+ typedef mtu {
+ type inet:port-number;
+ default 1492;
+ }
+
+ typedef description {
+ type string {
+ length 1..1024;
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-application.yang b/config-models/aether-4.x/files/yang/onf-application.yang
new file mode 100755
index 0000000..0f7d4b6
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-application.yang
@@ -0,0 +1,114 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-application {
+ namespace "http://opennetworking.org/enterprise/application";
+ prefix app;
+
+ import ietf-inet-types{ prefix ietf; }
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types{ prefix at; }
+ import onf-enterprise{ prefix ent; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Application is an application that devices may
+ connect to. Includes a set of endpoints where services are
+ provided.";
+
+ revision "2021-09-10" {
+ description "Aether Application.";
+ reference "RFC 6087";
+ }
+
+ typedef application-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container application {
+ description "The top level container";
+
+ list application {
+ key "id";
+ description
+ "List of applications";
+
+ leaf id {
+ type application-id;
+ description "ID for this application.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this application";
+ }
+
+ list endpoint {
+ key "name";
+ max-elements 1;
+ leaf name {
+ type string;
+ description
+ "Name of this endpoint";
+ }
+ leaf address {
+ type ietf:host;
+ mandatory true;
+ description
+ "Address of this endpoint. Either a hostname, and IP, or a subnet.";
+ }
+ leaf port-start {
+ type ietf:port-number;
+ mandatory true;
+ description
+ "First port in range";
+ }
+ leaf port-end {
+ type ietf:port-number;
+ description
+ "Last port in range";
+ }
+ leaf protocol {
+ type at:protocol;
+ description
+ "Name of this endpoint";
+ }
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this Application. May be set to None if the application is global to all Enterprises.";
+ }
+
+ container mbr {
+ description "Maximum bitrate";
+ leaf uplink {
+ type at:bitrate;
+ units mbr;
+ description "Per-Application mbr uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type at:bitrate;
+ units mbr;
+ description "Per-Application mbr downlink data rate in mbps";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-connectivity-service.yang b/config-models/aether-4.x/files/yang/onf-connectivity-service.yang
new file mode 100755
index 0000000..f5ca075
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-connectivity-service.yang
@@ -0,0 +1,76 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-connectivity-service {
+ namespace "http://opennetworking.org/aether/connectivity-service";
+ prefix cs;
+
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types { prefix at; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Connectivity service is the linkage between the
+ ROC and a core that provides connectivity.";
+
+ revision "2021-06-02" {
+ description "An Aether Connectivity Service. Specifies the endpoints where the sdcore-adapter should push configuration to. A single connectivity service may be attached to multiple Enterprises.";
+ reference "RFC 6087";
+ }
+
+ typedef connectivity-service-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container connectivity-service {
+ description "The top level container";
+
+ list connectivity-service {
+ key "id";
+ description
+ "List of connectivity services";
+
+ leaf id {
+ type connectivity-service-id;
+ description "ID for this connectivity service.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this connectivity service";
+ }
+
+ leaf spgwc-endpoint {
+ type inet:uri;
+ description "url of the spgwc service";
+ }
+
+ leaf hss-endpoint {
+ type inet:uri;
+ description "url of the hss service";
+ }
+
+ leaf pcrf-endpoint {
+ type inet:uri;
+ description "url of the pcrf service";
+ }
+
+ leaf core-5g-endpoint {
+ type inet:uri;
+ description "url of the 5g core";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-device-group.yang b/config-models/aether-4.x/files/yang/onf-device-group.yang
new file mode 100755
index 0000000..90ce834
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-device-group.yang
@@ -0,0 +1,99 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-device-group {
+ namespace "http://opennetworking.org/aether/device-group";
+ prefix dg;
+
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types { prefix at; }
+ import onf-ip-domain{ prefix ipd; }
+ import onf-site{ prefix st; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An aether device group represents a list of device IMSIS.
+ This list is expressed as a set of ranges,
+ [(from_imsi, to_imsi),
+ (from_imsi, to_imsi),
+ ...].
+ Each device group belongs to a site and has associated
+ with it an ip-profile that determines the IP address
+ and DNS settings that apply to devices within the
+ group";
+
+ revision "2021-06-02" {
+ description "An Aether Device Group";
+ reference "RFC 6087";
+ }
+
+ typedef device-group-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container device-group {
+ description "The top level container";
+
+ list device-group {
+ key "id";
+ description
+ "List of device groups";
+
+ leaf id {
+ type device-group-id;
+ description "ID for this device group.";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this device group";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list imsis {
+ // TODO: imsi-range-from cannot be used as a list index
+ key "name";
+ leaf name {
+ type string;
+ }
+ leaf imsi-range-from {
+ type uint64;
+ }
+ leaf imsi-range-to {
+ type uint64;
+ }
+ description
+ "List of imsi ranges that comprise this group. It's acceptable for
+ a range to degenerate to being a singleton";
+ }
+
+ leaf ip-domain {
+ type leafref {
+ path "/ipd:ip-domain/ipd:ip-domain/ipd:id";
+ }
+ description
+ "Link to ip-domain settings that determine the pool of IP addresses,
+ as well as the domain resolver settings to use";
+ }
+
+ leaf site {
+ type leafref {
+ path "/st:site/st:site/st:id";
+ }
+ mandatory true;
+ description
+ "Link to site";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-enterprise.yang b/config-models/aether-4.x/files/yang/onf-enterprise.yang
new file mode 100755
index 0000000..ec61bf4
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-enterprise.yang
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-enterprise {
+ namespace "http://opennetworking.org/aether/enterprise";
+ prefix ent;
+
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types { prefix at; }
+ import onf-connectivity-service { prefix cs; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Enterprise is an administration entity that
+ has ownership of resrouces.";
+
+ revision "2021-06-02" {
+ description "An Aether Enterprise. Used to distinguish ownership of devices and other resources as well as a domain of configuration.";
+ reference "RFC 6087";
+ }
+
+ typedef enterprise-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container enterprise {
+ description "The top level container";
+
+ list enterprise {
+ key "id";
+ description
+ "List of enterprises";
+
+ leaf id {
+ type enterprise-id;
+ description "ID for this enterprise.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this enterprise";
+ }
+
+ list connectivity-service {
+ key "connectivity-service";
+ leaf connectivity-service {
+ type leafref {
+ path "/cs:connectivity-service/cs:connectivity-service/cs:id";
+ }
+ description
+ "Link to connectivity services where configuration should be pushed for this enterprise's devices";
+ }
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Allow or disallow pushes to this connectivity service";
+ }
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-ip-domain.yang b/config-models/aether-4.x/files/yang/onf-ip-domain.yang
new file mode 100755
index 0000000..837647a
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-ip-domain.yang
@@ -0,0 +1,102 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-ip-domain {
+ namespace "http://opennetworking.org/aether/ip-domain";
+ prefix ipd;
+
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types { prefix at; }
+ import onf-enterprise{ prefix ent; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether IP-Domain. This is a list of available subnets
+ that may be assigned to UEs, as well as DNS servers and other
+ metadata";
+
+ revision "2021-06-02" {
+ description "An Aether IP and Domain Specification";
+ reference "RFC 6087";
+ }
+
+ typedef ip-domain-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container ip-domain {
+ description "The top level container";
+
+ list ip-domain {
+ key "id";
+ description
+ "List of ip domains";
+
+ leaf id {
+ type ip-domain-id;
+ description "ID for this ip domain.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf dnn {
+ type at:dnn;
+ description "DNN/APN";
+ }
+
+ leaf dns-primary {
+ type inet:ip-address;
+ description "primary dns server name";
+ }
+
+ leaf dns-secondary {
+ type inet:ip-address;
+ description "secondary dns server name";
+ }
+
+ // Note: Cannot use a subnet as a list key. Dropped support from a
+ // list of subnets to a single subnet. Revisit in the future.
+ leaf subnet {
+ type inet:ipv4-prefix;
+ mandatory true;
+ description "subnet to allocate ip addresses from";
+ }
+
+ leaf admin-status {
+ type at:admin-status;
+ description "administrative status";
+ }
+
+ leaf mtu {
+ type at:mtu;
+ description "maximum transmission unit";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this ip domain";
+ }
+
+ // Ip-Domain is always owned by an Enterprise, because it contains
+ // IP addresses relative to that Enterprise.
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this IP-Domain";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-site.yang b/config-models/aether-4.x/files/yang/onf-site.yang
new file mode 100755
index 0000000..74a6b80
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-site.yang
@@ -0,0 +1,129 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-site {
+ namespace "http://opennetworking.org/aether/site";
+ prefix st;
+
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types{ prefix at; }
+ import onf-enterprise{ prefix ent; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether site is a location where resources are deployed.";
+
+ revision "2021-09-10" {
+ description "An Aether Site.";
+ reference "RFC 6087";
+ }
+
+ typedef site-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container site {
+ description "The top level container";
+
+ list site {
+ key "id";
+ description
+ "List of site";
+
+ leaf id {
+ type site-id;
+ description "ID for this site.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list small-cell {
+ key "name";
+ leaf name {
+ type yg:yang-identifier;
+ description
+ "Name of small cell";
+ }
+ leaf address {
+ type inet:host;
+ description
+ "Address of small cell";
+ }
+ leaf tac {
+ type at:tac;
+ mandatory true;
+ description
+ "Type Allocation Code";
+ }
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enable this small cell";
+ }
+ description
+ "List of small cell addresses";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ description
+ "Link to enterprise that owns this site";
+ mandatory true;
+ }
+
+ container imsi-definition {
+ leaf mcc {
+ type at:mcc;
+ description "mobile country code";
+ mandatory true;
+ }
+ leaf mnc {
+ type at:mnc;
+ description "mobile network code";
+ mandatory true;
+ }
+ leaf enterprise {
+ type at:ent;
+ description "enterprise-specific identifier";
+ mandatory true;
+ }
+ leaf format {
+ type string {
+ length 15;
+ }
+ mandatory true;
+ description "IMSI format specifier, describes how fields are packed into an IMSI. Must be exactly 15 characters long. For example, CCCNNNEEESSSSSS.";
+ // Format specifiers:
+ // C = MCC
+ // N = MNC
+ // E = Enterprise
+ // 0 = Forced Zero
+ // S = Subscriber ID
+ // default is
+ // 3 digit MCC
+ // 3 digit MNC
+ // 3 digit enterprise ID
+ // 5 digit subscriber ID
+ }
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this site";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-template.yang b/config-models/aether-4.x/files/yang/onf-template.yang
new file mode 100755
index 0000000..7d05600
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-template.yang
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-template {
+ namespace "http://opennetworking.org/aether/template";
+ prefix tp;
+
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types{ prefix at; }
+ import onf-traffic-class{ prefix tc; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "The aether vcs-template holds common parameters used
+ by a virtual connectivity service. Templates are used to
+ populate a VCS.";
+
+ revision "2021-06-02" {
+ description "An Aether Virtual Cellular Service Template";
+ reference "RFC 6087";
+ }
+
+ typedef template-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container template {
+ description "The top level container";
+
+ list template {
+ key "id";
+ description
+ "List of vcs templates";
+
+ leaf id {
+ type template-id;
+ description "ID for this vcs template.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf sst {
+ type at:sst;
+ description "Slice/Service type";
+ }
+
+ leaf sd {
+ type at:sd;
+ description "Slice differentiator";
+ }
+
+ container device {
+ description "Per-device QOS Settings";
+ container mbr {
+ description "Maximum bitrate";
+ leaf uplink {
+ type at:bitrate;
+ units bps;
+ description "Per-device mbr uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type at:bitrate;
+ units bps;
+ description "Per-device mbr downlink data rate in mbps";
+ }
+ }
+ }
+
+ container slice {
+ description "Per-Slice QOS Settings";
+ container mbr {
+ description "Maximum bitrate";
+ leaf uplink {
+ type at:bitrate;
+ units bps;
+ description "Per-Slice mbr uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type at:bitrate;
+ units bps;
+ description "Per-Slice mbr downlink data rate in mbps";
+ }
+ }
+ }
+
+ leaf traffic-class {
+ type leafref {
+ path "/tc:traffic-class/tc:traffic-class/tc:id";
+ }
+ description
+ "Link to traffic class";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this vcs template";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-traffic-class.yang b/config-models/aether-4.x/files/yang/onf-traffic-class.yang
new file mode 100755
index 0000000..8a84ee0
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-traffic-class.yang
@@ -0,0 +1,65 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-traffic-class {
+ namespace "http://opennetworking.org/aether/traffic-class";
+ prefix tp;
+
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types{ prefix at; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "The aether traffic class associates qos constants
+ with a named class of service";
+
+ revision "2021-09-10" {
+ description "An Aether Traffic Class";
+ reference "RFC 6087";
+ }
+
+ typedef traffic-class-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container traffic-class {
+ description "The top level container";
+
+ list traffic-class {
+ key "id";
+ description
+ "List of traffic class";
+
+ leaf id {
+ type traffic-class-id;
+ description "ID for this traffic class.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf arp {
+ type at:arp;
+ description "Allocation and Retention Priority. 1 is the highest. 15 is the lowest.";
+ }
+
+ leaf qci {
+ type at:qci;
+ description "QOS Class Identifier";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this traffic class";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-upf.yang b/config-models/aether-4.x/files/yang/onf-upf.yang
new file mode 100755
index 0000000..3d1c764
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-upf.yang
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-upf {
+ namespace "http://opennetworking.org/aether/upf";
+ prefix upf;
+
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types { prefix at; }
+ import onf-enterprise{ prefix ent; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description "A Aether UPF List is a named User Plane Function.";
+
+ revision "2021-09-16" {
+ description "An Aether User Plane Function";
+ reference "RFC 6087";
+ }
+
+ typedef upf-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container upf {
+ description "The top level container";
+
+ list upf {
+ key "id";
+ description
+ "A list of named upfs.";
+
+ leaf id {
+ type upf-id;
+ description "ID for this upf.";
+ }
+
+ leaf address {
+ type inet:host;
+ mandatory true;
+ description
+ "Address of UPF";
+ }
+
+ leaf port {
+ type inet:port-number;
+ mandatory true;
+ description
+ "Port for UPF";
+ }
+
+ leaf config-endpoint {
+ type inet:uri;
+ description "url for configuring the UPF";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this UPF";
+ }
+
+ // UPFs are always owned by an Enterprise, since they typically exist on the
+ // Enterprise's edge. TODO: Consider whether they should be owned by a Site
+ // instead of Enterprise.
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this Access Point List";
+ }
+ }
+ }
+}
diff --git a/config-models/aether-4.x/files/yang/onf-vcs.yang b/config-models/aether-4.x/files/yang/onf-vcs.yang
new file mode 100755
index 0000000..7a7487d
--- /dev/null
+++ b/config-models/aether-4.x/files/yang/onf-vcs.yang
@@ -0,0 +1,188 @@
+// SPDX-FileCopyrightText: 2021 Open Networking Foundation
+//
+// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+module onf-vcs {
+ namespace "http://opennetworking.org/aether/vcs";
+ prefix sl;
+
+ import ietf-yang-types{ prefix yg; }
+ import onf-aether-types{ prefix at; }
+ import onf-application{ prefix app; }
+ import onf-device-group{ prefix dg; }
+ import onf-enterprise{ prefix ent; }
+ import onf-template{ prefix vt; }
+ import onf-traffic-class{ prefix tc; }
+ import onf-upf { prefix upf; }
+
+ organization "Open Networking Foundation.";
+ contact "Scott Baker";
+ description
+ "An Aether Virtual Cellular Service (VCS) is
+ used to connect devices with applications";
+
+ revision "2021-09-10" {
+ description "An Aether Virtual Cellular Service";
+ reference "RFC 6087";
+ }
+
+ typedef vcs-id {
+ type yg:yang-identifier {
+ length 1..32;
+ }
+ }
+
+ container vcs {
+ description "The top level container";
+
+ list vcs {
+ key "id";
+ description
+ "List of virtual cellular services";
+
+ leaf id {
+ type vcs-id;
+ description "ID for this vcs.";
+ }
+
+ leaf display-name {
+ type string {
+ length 1..80;
+ }
+ description "display name to use in GUI or CLI";
+ }
+
+ list device-group {
+ key "device-group";
+ leaf device-group {
+ type leafref {
+ path "/dg:device-group/dg:device-group/dg:id";
+ }
+ description
+ "Link to device group";
+ }
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enable this device group";
+ }
+ description
+ "A list of device groups. Groups will only participate in
+ the VCS if the enable field is set to True";
+ }
+
+ leaf template {
+ type leafref {
+ path "/vt:template/vt:template/vt:id";
+ }
+ description
+ "Link to user vcs template that was used to initialize
+ this VCS";
+ }
+
+ list application {
+ key "application";
+ leaf application {
+ type leafref {
+ path "/app:application/app:application/app:id";
+ }
+ mandatory true;
+ description
+ "Link to application";
+ }
+ leaf allow {
+ type boolean;
+ default true;
+ description
+ "Allow or deny this application";
+ }
+ description
+ "An ordered list of applications to allow and deny. The deny rules
+ will be executed first, followed by the allow rules. The first rule
+ to match is returned. An implicit DENY ALL lies at the end.";
+ }
+
+ leaf upf {
+ type leafref {
+ path "/upf:upf/upf:upf/upf:id";
+ }
+ description
+ "Link to user plane that implements this vcf";
+ }
+
+ leaf description {
+ type at:description;
+ description "description of this vcs";
+ }
+
+ leaf enterprise {
+ type leafref {
+ path "/ent:enterprise/ent:enterprise/ent:id";
+ }
+ mandatory true;
+ description
+ "Link to enterprise that owns this VCS";
+ }
+
+ // the following are populated from the template
+ leaf sst {
+ type at:sst;
+ mandatory true;
+ description "Slice/Service type. Immutable.";
+ }
+
+ leaf sd {
+ type at:sd;
+ mandatory true;
+ description "Slice differentiator. Immutable.";
+ }
+
+ container device {
+ description "Per-device QOS Settings";
+ container mbr {
+ description "Maximum bitrate";
+ leaf uplink {
+ type at:bitrate;
+ units bps;
+ description "Per-device mbr uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type at:bitrate;
+ units bps;
+ description "Per-device mbr downlink data rate in mbps";
+ }
+ }
+ }
+
+ container slice {
+ description "Per-Slice QOS Settings";
+ container mbr {
+ description "Maximum bitrate";
+ leaf uplink {
+ type at:bitrate;
+ units bps;
+ description "Per-Slice mbr uplink data rate in mbps";
+ }
+
+ leaf downlink {
+ type at:bitrate;
+ units bps;
+ description "Per-Slice mbr downlink data rate in mbps";
+ }
+ }
+ }
+
+ leaf traffic-class {
+ type leafref {
+ path "/tc:traffic-class/tc:traffic-class/tc:id";
+ }
+ mandatory true;
+ description
+ "Link to traffic class";
+ }
+ // end of items populated from the template
+ }
+ }
+}
diff --git a/config-models/aether-4.x/templates/_helpers.tpl b/config-models/aether-4.x/templates/_helpers.tpl
new file mode 100644
index 0000000..0380f1a
--- /dev/null
+++ b/config-models/aether-4.x/templates/_helpers.tpl
@@ -0,0 +1,52 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Expand the name of the chart.
+*/}}
+{{- define "aether.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "aether.fullname" -}}
+{{- if contains "config-model-aether" .Release.Name -}}
+{{- printf "%s-%s" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s-config-model-aether" .Release.Name .Chart.AppVersion | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "aether.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Common labels
+*/}}
+{{- define "aether.labels" -}}
+helm.sh/chart: {{ include "aether.chart" . }}
+{{ include "aether.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "aether.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "aether.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+}
diff --git a/config-models/aether-4.x/templates/model.yaml b/config-models/aether-4.x/templates/model.yaml
new file mode 100644
index 0000000..2581353
--- /dev/null
+++ b/config-models/aether-4.x/templates/model.yaml
@@ -0,0 +1,65 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: config.onosproject.org/v1beta1
+kind: Model
+metadata:
+ name: {{ template "aether.fullname" . }}
+ namespace: {{ .Release.Namespace }}
+ labels:
+ {{- include "aether.labels" . | nindent 4 }}
+spec:
+ plugin:
+ type: Aether
+ version: {{ .Chart.AppVersion | quote }}
+ modules:
+ - name: connectivity-service
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: onf-connectivity-service.yang
+ - name: enterprise
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: onf-enterprise.yang
+ - name: aether-types
+ organization: Open Networking Foundation
+ revision: 2021-09-10
+ file: onf-aether-types.yang
+ - name: application
+ organization: Open Networking Foundation
+ revision: 2021-09-10
+ file: onf-application.yang
+ - name: device-group
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: onf-device-group.yang
+ - name: ip-domain
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: onf-ip-domain.yang
+ - name: site
+ organization: Open Networking Foundation
+ revision: 2021-09-10
+ file: onf-site.yang
+ - name: upf-list
+ organization: Open Networking Foundation
+ revision: 2021-09-16
+ file: onf-upf.yang
+ - name: vcs
+ organization: Open Networking Foundation
+ revision: 2021-09-10
+ file: onf-vcs.yang
+ - name: template
+ organization: Open Networking Foundation
+ revision: 2021-09-10
+ file: onf-template.yang
+ - name: traffic-class
+ organization: Open Networking Foundation
+ revision: 2021-06-02
+ file: onf-traffic-class.yang
+ files:
+ {{- range $path, $_ := $.Files.Glob "files/yang/*.yang" }}
+ {{ base $path }}: |
+{{ $.Files.Get $path | indent 6 }}
+ {{- end }}
diff --git a/config-models/aether-4.x/values.yaml b/config-models/aether-4.x/values.yaml
new file mode 100644
index 0000000..2e984ed
--- /dev/null
+++ b/config-models/aether-4.x/values.yaml
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0