AETHER-2874 Bootstrap Aether-2.x models

Change-Id: Ia987596109584df696aaa57703f9148075569422
diff --git a/config-models/aether-2.0.x/files/yang/onf-upf.yang b/config-models/aether-2.0.x/files/yang/onf-upf.yang
new file mode 100755
index 0000000..5c8be50
--- /dev/null
+++ b/config-models/aether-2.0.x/files/yang/onf-upf.yang
@@ -0,0 +1,98 @@
+// 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; }
+  import onf-site{ prefix st; }
+
+  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;
+        }
+   description "The typedef for upf-id";
+  }
+
+  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.
+      leaf enterprise {
+        type leafref {
+          path "/ent:enterprise/ent:enterprise/ent:id";
+        }
+        mandatory true;
+        description
+          "Link to enterprise that owns this Access Point List";
+      }
+
+      // UPFs always reside at a site, as the exist on physical infrastructure. GUI
+      // will ensure that the tuple (DG, VCS, UPF) all exist on the same site.
+      leaf site {
+        type leafref {
+          path "/st:site/st:site/st:id";
+        }
+        mandatory true;
+        description
+          "Link to site";
+      }
+    }
+  }
+}