Overview
Domain Proxy is an application whose purpose is to communicate eNodeBs with SAS, send requests to SAS on behalf of them, and maintain their desired state.
Motivation
Vendor neutral Domain Proxy serves as a single point of contact for eNB-SAS communication for private networks using Magma as the Operator Core.
Without a vendor neutral Domain Proxy an eNB has to request for SAS Spectrums / Grants on its own. This requires the eNB to speak the same protocol as SAS (JSON over HTTPS), have the intelligence to send specific requests required by SAS, and adhere to the sequence in which they need to be sent. Radios capable of doing this have their own (usually internal) proprietary domain proxy.
One of the primary goals of Domain Proxy is to keep the validity of the grant obtained by a radio from SAS even in case of intermittent network failures. This happens thanks to heartbeat requests being sent to SAS on behalf of the radio for up to 4 hours (by default) of radio's inactivity.
Implementation
Backend
DP is a microservice application written in Python and Go. Internally components communicate with each other using **
gRPC** calls. In addition to the application, which is deployed as a separate entity, there is a DP service within the
Orchestrator, written in Go, acting as an API backend for the currently developed UI NMS portal.
Frontend
NMS UI page for Domain Proxy management is currently under development.
Big Picture
The picture below gives a very general look at the Domain Proxy as a proxy service between radios and SAS

Domain Proxy in Magma's Context

If we take a closer look, Domain Proxy as part of Magma is situated next to Orc8r, (typically on the same Kubernetes cluster) and uses the same database as the Orc8r.
In addition there is a DP service within the Orc8r that serves as backend for NMS UI portal (under development)
Both DP service and Domain Proxy Application perform CRUD operations on the same tables in the database.
Operation modes
Domain Proxy was designed to be able to work in two modes: passive and active.
Passive mode (currently deprecated)
The only purpose of passive mode is to capture incoming HTTPs requests from eNodeBs, bundle them together by type and
send over to SAS. This scenario however assumes that the radio is capable of sustaining an independent communication
with SAS. Since all the radios currently using Domain Proxy use TR069 and need to be fully configured, we are now only
supporting active mode. The code for passive mode has been developed and tested as part of an
HTTPs Protocol Controller but is not a part of DP's deployment.
Active mode
Active Mode is currently the default mode of operation for Domain Proxy. It assumes that the radio needs to be fully configured by external means (like eNodeB) and Domain Proxy is to carry out the entire communication with SAS for the radio. This is achieved mainly by Active Mode Controller
Domain Proxy components
In the picture we see three components that comprise Domain Proxy

Radio Controller
Written in Python; it is used to store individual serialized requests coming from eNodeBd in the database. A vital part
of Radio Controller is the dp_service - a GRPC server used by Enodebd's dp_client for sending information about
radios and getting back information about their state and transmission parameters once they are authorized in SAS. It is
also used by another Domain Proxy component - Active Mode Controller to determine what type of requests should be
stored in the database based off a CBSD state (more on that in the next section).
Active Mode Controller
Written in Go; used to monitor and maintain desired state of radios.
Radios that do not have a proprietary domain proxy are unaware neither of the type of messages that need to be sent to
SAS, nor of their sequence. Therefore, a dedicated entity called Active Mode Config is stored in the database for each
radio as soon as EnodeBd contacts Domain Proxy with its information.
The Active Mode Config is looked at by the Active Mode Controller at an interval specified in the config and based
off the current state of the radio and its config, an appropriate request is sent to SAS on behalf of the radio.
E.g. if the radio is not registered yet, a RegistrationRequest will be sent. If the radio is marked for deletion,
a RelinquishmentRequest
will be issued. If the radio is authorized in SAS a HeartbeatRequest will be sent on its behalf at a specified
interval.
Configuration Controller
Written in Python; it is responsible for picking up pending requests from the database, bundling them together by type
and source and sending to SAS. Once a response from SAS is received, Configuration Controller will split it into
individual responses (if the response was bundled), connect them with corresponding requests and insert in the database.
The related request is also marked as processed.
*Protocol Controller
NOTE: Protocol Controller is a historical name for a component that is no longer an independent part of Domain Proxy, but still
needs to be mentioned. CBSD-SAS Protocol Controller was removed by GitHub PR 12420.
Protocol Controller is used to handle incoming requests from an eNB or another domain proxy. It is meant to handle
messages sent using a specific protocol. Currently, the only eNBs connected to DP speak TR069 protocol (Sercomm
Englewood and Baicells 430 Nova).
Instead, the component treated by Domain Proxy as the only Protocol Controller is currently
AGW's Enodebd
being the configuration component for TR069 based radios.
Enodebd communicates with Domain Proxy's Radio Controller as if it were just another DP component, over gRPC, using
a newly introduced component called dp_client.
In case if future CBSD models speak different protocols, a new Protocol Controller will need to be implemented.