mirror of
https://github.com/Telecominfraproject/wlan-cloud-rrm.git
synced 2025-10-29 09:42:22 +00:00
Update documentation (#37)
Signed-off-by: Jeffrey Han <39203126+elludraon@users.noreply.github.com>
This commit is contained in:
@@ -1,19 +1,31 @@
|
||||
# Implementation
|
||||
This document provides high-level implementation details of the RRM service.
|
||||
This document provides high-level implementation details for the RRM service.
|
||||
|
||||
## Overview
|
||||
|
||||
<p align="center">
|
||||
<img src="./diagram.svg" width="960" />
|
||||
</p>
|
||||
|
||||
## Framework
|
||||
`Launcher` is the main class, which creates *clients* and then passes them to
|
||||
the `RRM` class to run all *modules* (details below). Many of these will run in
|
||||
their own threads and implement the standard `Runnable` interface.
|
||||
|
||||
The service configuration model is specified in the `RRMConfig` class, which can
|
||||
be provided either via environment variables or as a JSON-serialized file. When
|
||||
using the static file option, any new/missing fields are appended automatically.
|
||||
All fields are documented in Javadoc.
|
||||
### Initialization
|
||||
`Launcher` is the main class, exposing a command-line interface implemented
|
||||
using [picocli]. The launcher creates *clients* and then passes them to the
|
||||
`RRM` class to start all *modules* (details below). Typically, each module is an
|
||||
event loop which runs in its own thread, implementing the Java `Runnable`
|
||||
interface.
|
||||
|
||||
The service configuration is defined in the `RRMConfig` class, and can be
|
||||
provided either via environment variables or as a JSON-serialized file. Default
|
||||
values are used for any omitted fields. When using the static file option, any
|
||||
new/missing fields are appended automatically. All fields are documented in
|
||||
Javadoc.
|
||||
|
||||
### Data Structures
|
||||
The device topology, `DeviceTopology`, is specified as groupings of APs into
|
||||
disjoint "RF zones" (default `topology.json`). For example:
|
||||
```JSON
|
||||
```json
|
||||
{
|
||||
"<zone-name>": ["<serialNumber1>", "<serialNumber2>"],
|
||||
"building-A": ["aaaaaaaaaa01", "aaaaaaaaaa02"]
|
||||
@@ -28,24 +40,49 @@ following layers from least to greatest precedence:
|
||||
* Per-zone config (`zoneConfig`)
|
||||
* Per-AP config (`apConfig`)
|
||||
|
||||
`DeviceDataManager` wraps all operations for the device topology and device
|
||||
configuration, and enables safe concurrent access.
|
||||
|
||||
### Logging
|
||||
Logging is handled using [SLF4J]/[Log4j] and configured in
|
||||
`src/main/resources/log4j.properties`.
|
||||
`src/main/resources/log4j.properties`. Output is written to console as well as
|
||||
rotated log files.
|
||||
|
||||
### Versioning
|
||||
The artifact version is defined in `pom.xml` and should match the OpenAPI
|
||||
document version (see `ApiServer` annotations). During Maven builds, the version
|
||||
string is written to `src/main/resources-filtered/version.txt`, and additional
|
||||
metadata can also be appended via the property `appendVersionString`. During
|
||||
runtime, version information can be accessed via `VersionProvider`.
|
||||
|
||||
## Clients
|
||||
The *clients* implement connections to external services.
|
||||
|
||||
### uCentral Client
|
||||
`UCentralClient` implements OpenAPI HTTP client calls to the [uCentralGw] and
|
||||
[uCentralSec] services using [Unirest]. Where possible, request/response models
|
||||
are defined in the package `com.facebook.openwifirrm.ucentral.gw.models` and
|
||||
serialized/deserialized using [Gson].
|
||||
### uCentral OpenAPI
|
||||
`UCentralClient` implements OpenAPI HTTP client calls to other uCentral services
|
||||
(ex. [uCentralGw], [uCentralSec], [owprov]) using [Unirest]. Most request and
|
||||
response schemas are defined in a corresponding "models" subpackage and are
|
||||
serialized/deserialized as JSON using [Gson].
|
||||
|
||||
### uCentral Kafka Consumer
|
||||
`UCentralKafkaConsumer` implements the [Apache Kafka] consumer for uCentral
|
||||
topics, and passes data to other modules via listener interfaces. This is
|
||||
wrapped by `KafkaConsumerRunner` to handle graceful shutdown.
|
||||
The client supports two modes:
|
||||
* **Private endpoints:** When deployed in a cluster with other OpenWiFi
|
||||
services, private service URLs are learned from Kafka and requests are sent
|
||||
with API keys (i.e. `X-API-KEY` header).
|
||||
* **Public endpoints:** Mainly for development purposes, public service URLs are
|
||||
learned from [uCentralSec] and requests are sent with a Bearer token (i.e.
|
||||
`Authorization` header) obtained via login using configured credentials.
|
||||
|
||||
### Database Client
|
||||
### uCentral Kafka
|
||||
`KafkaRunner` wraps the following [Apache Kafka] clients, handling the run loop
|
||||
and graceful shutdown:
|
||||
* `UCentralKafkaConsumer` implements the Kafka consumer for OpenWiFi topics, and
|
||||
passes data (ex. device state, wifi scan results, system endpoints) to other
|
||||
modules via listener interfaces.
|
||||
* `UCentralKafkaProducer` implements the Kafka producer, which is responsible
|
||||
for periodically pushing system events required for discoverability by other
|
||||
OpenWiFi services.
|
||||
|
||||
### RRM Database
|
||||
`DatabaseManager` handles JDBC connection details for the RRM database and
|
||||
exposes methods for specific database operations. It uses the
|
||||
[MySQL Connector/J] driver and [HikariCP] for connection pooling.
|
||||
@@ -58,15 +95,30 @@ The *modules* implement the service's application logic.
|
||||
* Issues WiFi scan commands periodically and handles responses
|
||||
* Registers Kafka listeners to write records into the RRM database
|
||||
* Registers config listeners to configure the stats interval in OpenWiFi devices
|
||||
* Periodically queries capabilities for OpenWiFi devices
|
||||
|
||||
### Config Manager
|
||||
`ConfigManager` periodically sends config changes to OpenWiFi devices. Any
|
||||
`ConfigManager` sends config changes to OpenWiFi devices (via [uCentralGw]). Any
|
||||
desired config changes are applied via listener interfaces, including the output
|
||||
of RRM algorithms.
|
||||
of RRM algorithms. Device config updates are either applied periodically (when
|
||||
needed) or only triggered upon events (ex. RRM algorithm execution, API calls),
|
||||
depending on RRM service configuration. To minimize polling frequency since
|
||||
device config updates are rare, this thread has a long default sleep time and is
|
||||
interrupted by other threads when a config update is needed.
|
||||
|
||||
`UCentralApConfiguration` wraps the raw device configuration JSON and provides
|
||||
various access methods.
|
||||
|
||||
### Modeler
|
||||
`Modeler` subscribes to uCentral device state and wifi scan data, then prepares
|
||||
it for use by an optimizer.
|
||||
`Modeler` subscribes to raw uCentral data, then prepares it for use by an
|
||||
optimizer. The "model" is defined in `DataModel` and includes the following
|
||||
information for each device:
|
||||
* Recent wifi scan results
|
||||
* Statistics (or "state")
|
||||
* Configuration (or "status")
|
||||
* Capabilities
|
||||
|
||||
Additional data processing utilities are contained in `ModelerUtils`.
|
||||
|
||||
### API Server
|
||||
`ApiServer` is an OpenAPI HTTP server written using [Spark], exposing the
|
||||
@@ -77,23 +129,42 @@ following endpoints:
|
||||
[Swagger Core]
|
||||
* `/api/v1/<method>` - RRM API methods
|
||||
|
||||
### owprov Monitor
|
||||
`ProvMonitor` handles sync with the owprov service when it is desirable to use
|
||||
their topology ("venues") and certain device configuration fields.
|
||||
The OpenWiFi SDK dictates several API endpoints which must be implemented by
|
||||
every service, as well as endpoints specific to RRM providers. They are both
|
||||
marked here under the "SDK" tag.
|
||||
|
||||
### Scheduler
|
||||
Depending on RRM service configuration, the API server may also enable CORS
|
||||
selectively or globally, HTTP basic auth, and/or OpenWiFi auth (via Bearer
|
||||
tokens or internal API keys).
|
||||
|
||||
### Provisioning Monitor
|
||||
`ProvMonitor` syncs device topology ("venues") and configuration with the
|
||||
OpenWiFi Provisioning service (when enabled).
|
||||
|
||||
### RRM Scheduler
|
||||
`RRMScheduler` uses the [Quartz Job Scheduler] to schedule RRM algorithms to run
|
||||
per zone with different intervals and parameters.
|
||||
per zone with different intervals and parameters. The schedules are specified in
|
||||
the device configuration as `RRMSchedule` and are applied only at the zone and
|
||||
network layers.
|
||||
|
||||
## Optimizers
|
||||
The *optimizers* implement the RRM algorithms, which are described in
|
||||
The *optimizers* implement the RRM algorithms, and are described in detail in
|
||||
[ALGORITHMS.md](ALGORITHMS.md).
|
||||
|
||||
The `RRMAlgorithm` class provides a common entry point for all algorithm
|
||||
invocations. The general logic is as follows:
|
||||
* Identify the algorithm type (`AlgorithmType`), implementation class ("mode"),
|
||||
and any algorithm arguments
|
||||
* Take the current data model snapshot from `Modeler` as input
|
||||
* Compute the new device configs, then save and push them via `ConfigManager`
|
||||
|
||||
|
||||
[picocli]: https://picocli.info/
|
||||
[SLF4J]: http://www.slf4j.org/
|
||||
[Log4j]: https://logging.apache.org/log4j/
|
||||
[uCentralGw]: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
|
||||
[uCentralSec]: https://github.com/Telecominfraproject/wlan-cloud-ucentralsec
|
||||
[owprov]: https://github.com/Telecominfraproject/wlan-cloud-owprov
|
||||
[Unirest]: https://github.com/kong/unirest-java
|
||||
[Gson]: https://github.com/google/gson
|
||||
[Apache Kafka]: https://kafka.apache.org/
|
||||
|
||||
@@ -21,7 +21,6 @@ Unit tests are written using [JUnit 5].
|
||||
```
|
||||
$ java -jar openwifi-rrm.jar [-h]
|
||||
```
|
||||
The command-line interface is implemented using [picocli].
|
||||
|
||||
To start the service, use the `run` command while providing configuration via
|
||||
either environment variables (`--config-env`) or a static JSON file
|
||||
@@ -55,4 +54,3 @@ See [LICENSE](LICENSE).
|
||||
|
||||
[Apache Maven]: https://maven.apache.org/
|
||||
[JUnit 5]: https://junit.org/junit5/
|
||||
[picocli]: https://picocli.info/
|
||||
|
||||
4
diagram.svg
Normal file
4
diagram.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 34 KiB |
Reference in New Issue
Block a user