blob: 8c276337c4b0655c523544ec5f971a28ec4d6159 [file] [log] [blame]
Scott Bakera91cbd52021-07-28 09:23:08 -07001..
2 SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org>
3 SPDX-License-Identifier: Apache-2.0
4
5Runtime Operational Control (ROC)
6=================================
7
8Purpose
9-------
10
11The Aether Runtime Operation Control (ROC) is a component designed with the primary purpose of managing the
12Aether Connectivity Service (ACS), including facilitating the integration of edge services with the ACS.
13The Aether ROC allows enterprises to configure subscribers and profiles, as well as implement policies related
14to those profiles. It also allows the Aether operations team to configure the parameters of those policies.
15The ROC is one of many subsystems that make up the Aether Management Platform (AMP).
16
17What the ROC *does* do:
18
19- Add/Update/Delete/Query configuration
20
21- Persist configuration
22
23- Push configuration to services and devices
24
25- Make observations actionable, either manually or automatically
26
27What the ROC *does not* do:
28
29- The ROC does not directly deploy or manage the lifecycle of containers.
30 This is done using the Terraform/Rancher/Helm/Kubernetes stack.
31
32- The ROC does not directly collect or store logging or metric information.
33 This is done using the ElasticStack and Grafana/Prometheus components.
34
35- The ROC is not a message bus used for component-to-component communication.
36 If a message bus is required, then a suitable service such as Kafka could be used.
37
38- The ROC does not implement a service dependency graph.
39 This can be done through helm charts, which are typically hierarchical in nature.
40
41- The ROC is not a formal service mesh.
42 Other tools, such as Istio, could be leveraged to provide service meshes.
43
44- The ROC does not configure *Edge Services*.
45 While the ROCs modeling support is general and could be leveraged to support an edge service, and an
46 adapter could be written to configure an edge service, promoting an edge service to ROC management would
47 be the exception rather than the rule. Edge services have their own GUIs and APIs, perhaps belonging to
48 a 3rd-party service provider.
49
50Although we call out the tasks that ROC doesnt do itself, its often still necessary for the ROC to be aware
51of the actions these other components have taken.
52For example, while the ROC doesnt implement a service dependency graph, it is the case that the ROC is aware
53of how services are related. This is necessary because some of the actions it takes affect multiple services
54(e.g., a ROC-supported operation on a subscriber profile might result in the ROC making calls to SD-Core,
55SD-RAN, and SD-Fabric).
56
57Throughout the design process, the ROC design team has taken lessons learned from prior systems, such as XOS,
58and applied them to create a next generation design that focuses on solving the configuration problem in a
59focused and lightweight manner.
60
61Design and Requirements
62-----------------------
63
64- The ROC must offer an *API* that may be used by administrators, as well as external services, to configure
65 Aether.
66
67- This ROC API must support new end-to-end abstractions that cross multiple subsystems of Aether.
68 For example, give subscriber X running application Y QoS guarantee Z'' is an abstraction that potentially
69 spans SD-RAN, SD-Fabric.
70 The ROC defines and implements such end-to-end abstractions.
71
72- The ROC must offer an *Operations GUI* to Operations Personnel, so they may configure the Aether Connectivity
73 service.
74
75- The ROC must offer an *Enterprise GUI* to Enterprise Personnel, so they may configure the connectivity aspects
76 of their particular edge site.
77 Its possible this GUI shares implementation with the Operations GUI, but the presentation, content, and
78 workflow may differ.
79
80- The ROC must support *versioning* of configuration, so changes can be rolled back as necessary, and an audit
81 history may be retrieved of previous configurations.
82
83- The ROC must support best practices of *performance*, *high availability*, *reliability*, and *security*.
84
85- The ROC must support *role-based access controls (RBAC)*, so that different parties have different visibility
86 into the data model.
87
88- The ROC must be extensible.
89 Aether will incorporate new services over time, and existing services will evolve.
90
91Data Model
92----------
93
94An important aspect of the ROC is that it maintains a data model that represents all the abstractions, such as
95subscribers and profiles, it is responsible for.
96The ROCs data model is based on YANG specifications.
97YANG is a rich language for data modeling, with support for strong validation of the data stored in the models.
98YANG allows relations between objects to be specified, adding a relational aspect that our previous approaches
99(for example, protobuf) did not directly support.
100YANG is agnostic as to how the data is stored, and is not directly tied to SQL/RDBMS or NoSQL paradigms.
101
102ROC uses tooling built around aether-config (an ONOS-based microservice) to maintain a set of YANG models.
103Among other things, aether-config implements model versioning.
104Migration from one version of the data model to another is supported, as is simultaneous operation of
105different versions.
106
107Architecture
108------------
109
110Below is a high-level architectural diagram of the ROC:
111
112.. image:: images/aether-architecture.svg
113
114The following walks through the main stack of ROC components in a top-down manner, starting with the GUI(s) and
115ending with the devices/services.
116
117Operations Portal / Enterprise Portal
118"""""""""""""""""""""""""""""""""""""
119
120The code base for the Operations Portal and Enterprise Portal is shared.
121They are two different perspectives of the same portal.
122The *Operations Portal* presents a rougher, more expansive view of the breadth of the Aether modeling.
123The Enterprise Portal presents a more curated view of the modeling.
124These different perspectives can be enforced through the following:
125
126- RBAC controls, to limit access to information that might be unsuitable for a particular party.
127
128- Dashboards, to aggregate/present information in an intuitive manner
129
130- Multi-step workflows (aka Wizards) to break a complex task into smaller guided steps.
131
132The *Portal* is an angular-based typescript GUI.
133The GUI uses REST API to communicate with the aether-roc-api layer, which in turn communicates with aether-config
134via gNMI.
135The GUI implementation is consistent with modern GUI design, implemented as a single-page application and includes
136a “commit list” that allows several changes to be atomically submitted together.
137Views within the GUI are handcrafted, and as new models are added to Aether, the GUI must be adapted to incorporate
138the new models.
139
140The Portal is a combination of control and observation.
141The control aspect relates to pushing configuration, and the observation aspect relates to viewing metrics,
142logging, and alerts.
143The Portal will leverage other components to do some of the heavy lifting.
144For example, it would make no sense for us to implement our own graph-drawing tool or our own metrics querying
145language when Grafana and Prometheus are already able to do that and we can leverage them.
146GUI pages can be constructed that embed the Grafana renderer.
147
148aether-roc-api
149""""""""""""""
150
151Aether-roc-api a REST API layer that sits between the portals and aether-config.
152The southbound layer of aether-roc-api is gNMI.
153This is how aether-roc-api talks to aether-config.
154Aether-roc-api at this time is entirely auto-generated; developers need not spend time manually creating REST APIs
155for their models.
156The API layer serves multiple purposes:
157
158- gNMI is an inconvenient interface to use for GUI design, and REST is expected for GUI development.
159
160- The API layer is a potential location for early validation and early security checking, allowing errors to be caught
161 closer to the user.
162 This allows error messages to be generated in a more customary way than gNMI.
163
164- The API layer is yet another place for semantic translation to take place.
165 Although the API layer is currently auto-generated, it is possible that additional methods could be added.
166 gNMI supports only “GET” and “SET”, whereas the aether-roc-api natively supports “GET”, “PUT”, “POST”, “PATCH”,
167 and “DELETE”.
168
169aether-config
170"""""""""""""
171
172*Aether-config* (a Aether-specific deployment of the \ *onos-config*\ microservice) is the core of the ROCs
173configuration system.
174Aether-config is a component that other teams may use in other contexts.
175Its possible that an Aether deployment might have multiple instances of aether-config used for independent purposes.
176The job of aether-config is to store and version configuration data.
177Configuration is pushed to aether-config through the northbound gNMI interface, is stored in an Atomix database
178(not shown in the figure), and is pushed to services and devices using a southbound gNMI interface.
179
180Adapters
181""""""""
182
183Not every device or service beneath the ROC supports gNMI, and in the case where it is not supported, an adapter is
184written to translate between gNMI and the devices or services native API.
185For example, a gNMI REST adapter exists to translate between the ROCs modeling and the Aether Connectivity
186Control (SD-Core) components. The adapter is not necessarily only a syntactic translation, but may also be a
187semantic translation.
188[1]_ This supports a logical decoupling of the models stored in the ROC and the interface used by the southbound
189device/service, allowing the southbound device/service and the ROC to evolve independently.
190It also allows for southbound devices/services to be replaced without affecting the northbound interface.
191
192Workflow Engine
193"""""""""""""""
194
195The workflow engine, to the left of the aether-config stack, is where multi-step workflows may be implemented.
196At this time we do not have these workflows, but during the experience with SEBA/VOLTHA, we learned that workflow
197became a key aspect of the implementation.
198For example, SEBA had a state machine surrounding how devices were authorized, activated, and deactivated.
199The workflow engine is a placeholder where workflows may be implemented in Aether as they are required.
200
201Another use of the workflow engine may be to translate between levels in modeling.
202For example, the workflow engine may examine the high-level Enterprise modeling and make changes to the Operations
203modeling to achieve the Enterprise behavior.
204
205Previously this component was referred to as “onos-ztp”.
206It is expected that a workflow engine would both read and write the aether-config data model, as well as respond to
207external events.
208
209Analytics Engine
210""""""""""""""""
211
212The analytics engine, to the right of the aether-config stack, is where enrichment of analytics will be performed.
213Raw metrics and logs are collected with open source components Grafana/Prometheus and ElasticStack.
214Those metrics might need additional transformation before they can be presented to Enterprise users, or in some
215cases even before they are presented to the Ops team.
216The Analytics engine would be a place where those metrics could be transformed or enriched, and then written back
217to Prometheus or Elastic (or forwarded as alerts).
218
219The analytics engine is also where analytics would be related to config models in aether-config, in order for
220Enterprise or Operations personnel to take action in response to data and insights received through analytics.
221Action doesn’t necessarily have to involve humans.
222It is expected that the combination of Analytics Engine and Workflow Engine could automate a response.
223
224The analytics engine also provides an opportunity to implement access control from the telemetry API.
225Prometheus itself is not multi-tenant and does not support fine-grained access controls.
226
227Aether Operator
228"""""""""""""""
229
230Not pictured in the diagram is the ONOS Operator, which is responsible for configuring the models within
231aether-config. Models to load are specified by a helm chart.
232The operator compiles them on demand and incorporates them into aether-config.
233This eliminates dynamic load compatibility issues that were previously a problem with building models and
234aether-config separately. Operators are considered a best practice in Kubernetes.
235
236Modules are loaded into the process primarily for performance and simplicity reasons.
237The design team has had experience with other systems (for example, Voltha and XOS) where modules were decoupled
238and message buses introduced between them, but that can lead to both complexity issues and performance bottlenecks
239in those systems. The same module and operator pattern will be applied to aether-roc-api.
240
241Aether Modeling
242---------------
243
244There is no fixed distinction between high-level and low-level modeling in the ROC.
245There is one set of Aether modeling that might have customer-facing and internal-facing aspects.
246
247.. image:: images/aether-highlevel.svg
248
249The above diagram is an example of how a single set of models could serve both high-level and low-level needs and
250is not necessarily identical to the current implementation.
251For example, *App* and *Service* are concepts that are necessarily enterprise-facing.
252*UPF*\ s are concepts that are operator-facing.
253A UPF might be used by a Service, but the customer need not be aware of this detail.
254Similarly, some objects might be partially customer-facing and partially operator-facing.
255For example, a *Radio* is a piece of hardware the customer has deployed on his premises, so he must know of it, but
256the configuration details of the radio (signal strength, IP address, etc) are operator-facing.
257
258An approximation of the current Aether-3.0 (Release 1.5) modeling is presented below:
259
260.. image:: images/aether-3.0-models.svg
261
262The key Enterprise-facing abstractions are *Applicatio*\ n, *Virtual Cellular Service* (VCS), and *DeviceGroup*.
263
264Identity Management
265-------------------
266
267The ROC leverages an external identity database (i.e.
268LDAP server) to store user data such as account names and passwords for users who are able to log in to the ROC.
269This LDAP server also has the capability to associate users with groups, for example adding ROC administrators to
270ONFAetherAdmin would be a way to grant those people administrative privileges within the ROC.
271
272An external authentication service (DEX) is used to authenticate the user, handling the mechanics of accepting the
273password, validating it, and securely returning the group the user belongs to.
274The group identifier is then used to grant access to resources within the ROC.
275
276The ROC leverages Open Policy Agent (OPA) as a framework for writing access control policies.
277
278Securing Machine-to-Machine Communications
279------------------------------------------
280
281gNMI naturally lends itself to mutual TLS for authentication, and that is the recommended way to secure
282communications between components that speak gNMI.
283For example, the communication between aether-config and its adapters uses gNMI and therefore uses mutual TLS.
284Distributing certificates between components is a problem outside the scope of the ROC.
285Its assumed that another tool will be responsible for distribution, renewing certificates before they expire, etc.
286
287For components that speak REST, HTTPS is used to secure the connection, and authentication can take place using
288mechanisms within the HTTPS protocol (basic auth, tokens, etc).
289Oath2 and OpenID Connect are leveraged as an authorization provider when using these REST APIs.
290
291.. [1]
292 Adaptors are an ad hoc approach to implementing the workflow engine,
293 where they map models onto models, including the appropriate semantic
294 translation. This is what we originally did in XOS, but we prefer a
295 more structured approach for ROC.
296
297
298