This section provides a high-level view of ONOS, and its general design approach.
ONOS in a Sentence
Aside from being an SDN OS, ONOS is a multi-module project whose modules are managed as OSGi bundles.
Design Goals
ONOS is designed with a few points in mind:
- Modularity : It should be possible to introduce new functionalities as self-contained units.
- Configurability : It should be possible to load and unload various features, wether it be at startup or at runtime.
- Protocol agnosticism : It, and its applications, should not be bound to specific protocol libraries.
We take a succinct look at each below.
Run-Time Extensibility
ONOS is written to leverage Apache Karaf as its OSGi framework. In addition to dependency resolution at startup and dynamic module loading at runtime, Karaf provides the following:
- Enable use of standard JAX-RS API to develop our REST APIs and make them secure
- The notion of features as a set of bundles allowing assembly of custom setups
- Strict semantic versioning of code bundles, including third-party dependencies
- Local and remote ssh console with easily extensible CLI
- The notion of run-time log levels
Code Organization and Modularity
The project is comprised of a set of sub-projects, each with their own source tree that can be built independently. To do this, the ONOS source tree is organized in a hierarchical fashion that takes advantage of Maven's notion of a hierarchical POM file organization. Each sub-project has its own pom.xml file, and intermediate directories have parent aggregate pom.xml files. The latter contains shared dependencies and configurations for those sub-projects, enabling them to be built independent of unrelated sub-projects. The ONOS root contains the top-level pom file used to build the full project and all of its modules.
For implementation details of the source tree and POM file organization, refer to [Appendix C] of the Developer's Guide.
Protocol Agnosticism
While currently focused on OpenFlow, a southbound API shields the ONOS core layer and its platform-resident applications from the specifics of a particular protocol library.