Document update
[ric-plt/submgr.git] / docs / user-guide-RMR.rst
diff --git a/docs/user-guide-RMR.rst b/docs/user-guide-RMR.rst
new file mode 100755 (executable)
index 0000000..cc5af0a
--- /dev/null
@@ -0,0 +1,413 @@
+..
+..  Copyright (c) 2019 AT&T Intellectual Property.
+..  Copyright (c) 2019 Nokia.
+..
+..  Licensed under the Creative Commons Attribution 4.0 International
+..  Public License (the "License"); you may not use this file except
+..  in compliance with the License. You may obtain a copy of the License at
+..
+..    https://creativecommons.org/licenses/by/4.0/
+..
+..  Unless required by applicable law or agreed to in writing, documentation
+..  distributed under the License is distributed on an "AS IS" BASIS,
+..  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+..
+..  See the License for the specific language governing permissions and
+..  limitations under the License.
+..
+
+User-Guide
+==========
+
+.. contents::
+   :depth: 3
+   :local:
+
+``RMR based interface between xApp and Subscription Manager which is explained in this User-Guide is deprecated and will be removed in the future.
+See second User-Guide which explains new REST based interface.``
+
+Overview
+--------
+Subscription Manager is a basic platform service in RIC. It is responsible for managing E2 subscriptions from xApps to the
+Radio Access Network (RAN).
+
+xApp can subscribe and unsubscribe messages from gNodeB through Subscription Manager. Subscription Manager manages the subscriptions
+and message routing of the subscribed messages between E2 Termination and xApps. If one xApp has already made a subscription and then
+another xApp initiates identical subscription, Subscription Manager does not forward the subscription to gNodeB but merges the
+subscriptions internally. In merge case Subscription Manager just updates the message routing information to Routing Manager and
+sends response to xApp.
+
+There can be only one ongoing RIC Subscription or RIC Subscription Delete procedure towards RAN at any time. That is because Subscription
+Manager is able to merge new subscriptions only which those it has already received successful response from RAN. Subscriptions
+and delete subscriptions are therefore queued in Subscription Manager. Subscription Manager may need to do reties during subscribe or
+unsubscribe procedure. This needs to be considered when retries are implemented in xApp side, as it can increase completion time of the
+procedure. xApp's retry delay should not be too short.
+
+    .. image:: images/PlaceInRICSoftwareArchitecture_RMR.png
+      :width: 600
+      :alt: Place in RIC's software architecture picture
+
+Architecture
+------------
+
+  * Message routing
+
+      Subscribed messages from RAN are transported to RIC inside RIC Indication message. RIC Indication message is transported to xApp
+      inside RMR message, in Payload field of the RMR message. RMR message is routed to xApp based on SubId field (subscription id) in
+      the RMR header. Same routing mechanism is used also for response messages from Subscription Manager to xApp. Subscription Manager is
+      not able to respond to xApp if route for subscription has not been created.
+
+      When xApp sends message to Subscription Manager it sets -1 in SubId field in the RMR header. It means that messages are routed based
+      on message type (Mtype filed in RMR header). RIC Subscription Request and RIC Subscription delete Request messages are pre configured
+      to be routed to Subscription Manager.
+
+      Subscription Manager allocates unique RIC Request Sequence Number for every subscription during Subscription procedure. Subscription
+      Manager replaces existing ASN.1 decoded RIC Request Sequence Number in the RIC Subscription Request message allocated by the xApp.
+      That sequence number (subscription id) is then used for the subscription in RIC and RAN as long the subscription lives. xApp gets
+      the sequence number in RIC Subscription Response message from Subscription manager based on the message types.
+      
+      Subscribed messages are routed to xApps based on sequence number. Sequence number is placed in the SubId field of the RMR message
+      header when E2 Termination sends the subscribed message to xApp. When xApp wants to delete the subscription, the same sequence number
+      must be included in the ASN.1 encoded RIC Subscription Delete Request message sent to Subscription Manager.
+
+      Subscription Manager allocates and substitutes RIC Requestor ID for E2 interface communication. Currently the ID value is always 123.
+      RAN gets the Request of the xApp who makes the first subscription. RAN uses Subscription Manager allocated Requestor ID in all RIC
+      Indication messages it sends to RIC for the subscription.  Subscription Manager returns the same RIC Requestor ID in response message
+      to xApp as was in the request. In merge case subscription is created only for the first requestor.
+
+      TransactionId (Xid) in RMR message header is used to track messages between xApp and Subscription Manager. xApp allocates it. Subscription
+      Manager returns TransactionId received from xApp in response message to xApp. xApp uses it to map response messages to request messages
+      it sends.
+
+  * Subscription procedure
+      
+    * Successful case
+
+      xApp sends RIC Subscription Request message to Subscription Manager. Subscription Manager validates request types in the message and sends
+      route create to Routing Manager over REST interface. When route is created successfully Subscription Manager forwards request to E2
+      Termination. When RIC Subscription Response arrives from E2 Termination Subscription Manager forwards it to xApp.
+      
+      Subscription Manager supervises route create and RIC Subscription Request with a timer.
+
+      RIC Indication messages which are used to transport subscribed messages from RAN are routed from E2 Termination to xApps
+      directly using the routes created during Subscription procedure.
+
+      Subscription Manager supports REPORT, POLICY and INSERT type subscriptions (RICActionTypes). CONTROL is not supported. POLICY type
+      subscription can be updated. In update case signaling sequence is the same as above, except route is not created to Routing manager.
+      xApp uses initially allocated TransactionId and RIC Request Sequence Number in update case. Route in POLICY type subscription case is needed
+      only that Subscription Manager can send response messages to xApp. RIC Subscription Request message contains list of RICaction-ToBeSetup-ItemIEs.
+      The list cannot have REPORT, POLICY, INSERT action types at the same time. Subscription Manager checks actions types in the message.
+      If both action types is found the message is dropped.
+
+
+    .. image:: images/Successful_Subscription_ASN.1.png
+      :width: 600
+      :alt: Successful subscription picture
+
+
+    * Failure case
+
+      In failure case Subscription Manager checks the failure cause and acts based on that. If failure cause is "duplicate" Subscription
+      Manager sends delete to RAN and then resends the same subscription. If failure cause is such that Subscription manager cannot do
+      anything to fix the problem, it sends delete to RAN and sends RIC Subscription Failure to xApp. Subscription Manager may retry RIC
+      Subscription Request and RIC Subscription Delete messages also in this case before it responds to xApp.
+
+    .. image:: images/Subscription_Failure_ASN.1.png
+      :width: 600
+      :alt: Subscription failure picture
+
+    * Timeout in Subscription Manager
+
+     In case of timeout in Subscription Manager, Subscription Manager may resend the RIC Subscription Request to RAN. If there is no response
+      after retry, Subscription Manager shall NOT send any response to xApp. xApp may retry RIC Subscription Request, if it wishes to do so.
+      Subscription Manager does no handle the retry if Subscription Manager has ongoing subscription procedure for the same subscription.
+      Subscription just drops the request.
+
+    * Timeout in xApp
+
+      xApp may resend the same request if there is no response in expected time. If xApp resends the same request while processing of previous
+      request has not been completed in Subscription Manager then Subscription Manager drops the new request, makes a log writing and continues
+      processing previous request.
+
+    .. image:: images/Subscription_Timeout_ASN.1.png
+      :width: 600
+      :alt: Subscription timeout picture
+
+  * Subscription delete procedure
+
+    * Successful case
+
+      xApp sends RIC Subscription Delete Request message to Subscription Manager. xApp must use the same RIC Request Sequence Number which
+      it received in RIC Subscription Response message when subscription is deleted. When Subscription Manager receives RIC Subscription
+      Delete Request message, Subscription Manager first forwards the request to E2 Termination. When RIC Subscription Delete Response arrives
+      from E2 Termination to Subscription Manager, Subscription Manager forwards it to xApp and then request route deletion from Routing Manager.
+      
+      Subscription Manager supervises RIC Subscription Deletion Request and route delete with a timer.
+
+    .. image:: images/Successful_Subscription_Delete_ASN.1.png
+      :width: 600
+      :alt: Successful subscription delete picture
+
+    * Failure case
+
+      Delete procedure cannot fail from xApp point of view. Subscription Manager always responds with RIC Subscription Delete Response to xApp.
+
+    .. image:: images/Subscription_Delete_Failure_ASN.1.png
+      :width: 600
+      :alt: Subscription delete failure picture
+
+    * Timeout in Subscription Manager
+
+      In case of timeout in Subscription Manager, Subscription Manager may resend the RIC Subscription Delete Request to RAN. If there is no
+      response after retry, Subscription Manager responds to xApp with RIC Subscription Delete Response.
+
+    * Timeout in xApp
+
+      xApp may resend the same request if there is no response in expected time. If xApp resends the same request while processing of previous
+      request has not been completed in Subscription Manager then Subscription Manager drops the new request, makes a log writing and continues
+      processing previous request.
+
+    .. image:: images/Subscription_Delete_Timeout_ASN.1.png
+      :width: 600
+      :alt: Subscription delete timeout picture
+
+    * Unknown subscription
+
+      If Subscription Manager receives RIC Subscription Delete Request for a subscription which does not exist, Subscription Manager cannot respond
+      to xApp as there is no route for the subscription.
+
+  * Subscription merge procedure
+
+    * Successful case
+
+      xApp sends RIC Subscription Request message to Subscription Manager. Subscription Manager checks is the Subscription mergeable. If not,
+      Subscription Manager continues with normal Subscription procedure. If Subscription is mergeable, Subscription Manager sends route create
+      to Routing Manager and then responds with RIC Subscription Response to xApp.
+      
+      Route create is supervised with a timer.
+
+      Merge for REPORT type subscription is possible if Action Type and Event Trigger Definition of subscriptions are equal.
+
+      ``Only REPORT type subscriptions can be be merged.``
+
+    .. image:: images/Successful_Subscription_Merge_ASN.1.png
+      :width: 600
+      :alt: Successful subscription merge picture
+
+    * Failure case
+
+      Failure case is basically the same as in normal subscription procedure. Failure can come only from RAN when merge is not yet done.
+      If error happens during route create Subscription Manager drops the RIC Subscription Request message and xApp does not get any response.
+
+    * Timeout in Subscription Manager
+
+      Timeout case is basically the same as in normal subscription procedure but timeout can come only in route create during merge operation.
+      If error happens during route create, Subscription Manager drops the RIC Subscription Request message and xApp does not get any response.
+
+    * Timeout in xApp
+
+      xApp may resend the same request if there is no response in expected time. If xApp resends the same request while processing of previous
+      request has not been completed in Subscription Manager then Subscription Manager drops the new request, makes a log writing and continues
+      processing previous request.
+
+  * Subscription delete merge procedure
+
+    * Successful case
+
+      xApp sends RIC Subscription Delete Request message to Subscription Manager. If delete concerns merged subscription, Subscription Manager
+      responds with RIC Subscription Delete Response to xApp and then sends route delete request to Routing manager.
+      
+      Subscription Manager supervises route delete with a timer.
+
+    .. image:: images/Successful_Subscription_Delete_Merge_ASN.1.png
+      :width: 600
+      :alt: Successful subscription delete merge picture
+
+    * Failure case
+
+      Delete procedure cannot fail from xApp point of view. Subscription Manager responds with RIC Subscription Delete Response message to xApp.
+
+    * Timeout in Subscription Manager
+
+      Timeout can only happen in route delete to Routing manager. Subscription Manager responds with RIC Subscription Delete Response message to xApp.
+
+    * Timeout in xApp
+
+      xApp may resend the same request if there is no response in expected time. If xApp resends the same request while processing of previous
+      request has not been completed in Subscription Manager then Subscription Manager drops the new request, makes a log writing and continues
+      processing previous request.
+
+  * Unknown message
+
+     If Subscription Manager receives unknown message, Subscription Manager drops the message.
+
+  * xApp restart
+
+    When xApp is restarted for any reason it may resend subscription requests for subscriptions which have already been subscribed. If REPORT or INSERT type
+    subscription already exists and RMR endpoint of requesting xApp is attached to subscription then successful response is sent to xApp directly without
+    updating Routing Manager and BTS. If POLICY type subscription already exists, request is forwarded to BTS and successful response is sent to xApp.
+    BTS is expected to accept duplicate POLICY type requests. In restart IP address of the xApp may change but domain service address name does not.
+    RMR message routing uses domain service address name.
+
+  * Subscription Manager restart
+
+    Subscription Manager stores successfully described subscriptions from db (SDL). Subscriptions are restored from db in restart. For subscriptions which
+    were not successfully completed, Subscription Manager sends delete request to BTS and removes routes created for those. Restoring subscriptions from
+    db can be disable via submgr-config.yaml file by setting "readSubsFromDb": "false".
+
+Metrics
+-------
+ Subscription Manager adds following statistic counters:
+
+ Subscription create counters:
+               - SubReqFromXapp: The total number of SubscriptionRequest messages received from xApp
+               - SubRespToXapp: The total number of SubscriptionResponse messages sent to xApp
+               - SubFailToXapp: The total number of SubscriptionFailure messages sent to xApp
+               - SubReqToE2: The total number of SubscriptionRequest messages sent to E2Term
+               - SubReReqToE2: The total number of SubscriptionRequest messages resent to E2Term
+               - SubRespFromE2: The total number of SubscriptionResponse messages from E2Term
+               - SubFailFromE2: The total number of SubscriptionFailure messages from E2Term
+               - SubReqTimerExpiry: The total number of SubscriptionRequest timer expires
+               - RouteCreateFail: The total number of subscription route create failure
+               - RouteCreateUpdateFail: The total number of subscription route create update failure
+               - MergedSubscriptions: The total number of merged Subscriptions
+
+ Subscription delete counters:
+               - SubDelReqFromXapp: The total number of SubscriptionDeleteResponse messages received from xApp
+               - SubDelRespToXapp: The total number of SubscriptionDeleteResponse messages sent to xApp
+               - SubDelReqToE2: The total number of SubscriptionDeleteRequest messages sent to E2Term
+               - SubDelReReqToE2: The total number of SubscriptionDeleteRequest messages resent to E2Term
+               - SubDelRespFromE2: The total number of SubscriptionDeleteResponse messages from E2Term
+               - SubDelFailFromE2: The total number of SubscriptionDeleteFailure messages from E2Term
+               - SubDelReqTimerExpiry: The total number of SubscriptionDeleteRequest timer expires
+               - RouteDeleteFail: The total number of subscription route delete failure
+               - RouteDeleteUpdateFail: The total number of subscription route delete update failure
+               - UnmergedSubscriptions: The total number of unmerged Subscriptions
+
+ SDL failure counters:
+               - SDLWriteFailure: The total number of SDL write failures
+               - SDLReadFailure: The total number of SDL read failures
+               - SDLRemoveFailure: The total number of SDL read failures
+
+Configurable parameters
+-----------------------
+ Subscription Manager has following configurable parameters.
+   - Retry timeout for RIC Subscription Request message
+      - e2tSubReqTimeout_ms: 2000 is the default value
+
+   - Retry timeout for RIC Subscription Delete Request message
+      - e2tSubDelReqTime_ms: 2000 is the default value
+
+   - Waiting time for RIC Subscription Response and RIC Subscription Delete Response messages
+      - e2tRecvMsgTimeout_ms: 2000 is the default value
+
+   - Try count for RIC Subscription Request message   
+      - e2tMaxSubReqTryCount: 2 is the default value
+
+   - Try count for RIC Subscription Delete Request message   
+      - e2tMaxSubDelReqTryCount: 2 is the default value
+   
+   - Are subscriptions read from database in Subscription Manager startup
+      - readSubsFromDb: "true"  is the default value
+ The parameters can be changed on the fly via Kubernetes Configmap. Default parameters values are defined in Helm chart
+
+ Use following command to open Subscription Manager's Configmap in Nano editor. Firts change parameter and then store the
+ change by pressing first Ctrl + o. Close editor by pressing the Ctrl + x. The change is visible in Subscription Manager's
+ log after some 20 - 30 seconds.
+ .. code-block:: none
+
+  KUBE_EDITOR="nano" kubectl edit cm configmap-ricplt-submgr-submgrcfg -n ricplt
+
+REST interface for debugging and testing
+----------------------------------------
+ Give following commands to get Subscription Manager pod's IP address
+
+ .. code-block:: none
+
+  kubectl get pods -A | grep submgr
+  
+  ricplt        submgr-75bccb84b6-n9vnt          1/1     Running             0          81m
+
+  Syntax: kubectl exec -t -n ricplt <add-submgr-pod-name> -- cat /etc/hosts | grep submgr | awk '{print $1}'
+  
+  Example: kubectl exec -t -n ricplt submgr-75bccb84b6-n9vnt -- cat /etc/hosts | grep submgr | awk '{print $1}'
+
+  10.244.0.181
+
+ Get metrics
+
+ .. code-block:: none
+
+  Example: curl -s GET "http://10.244.0.181:8080/ric/v1/metrics"
+
+ Get subscriptions
+
+ .. code-block:: none
+
+  Example: curl -X GET "http://10.244.0.181:8088/ric/v1/subscriptions"
+
+ Delete single subscription from db
+
+ .. code-block:: none
+
+  Syntax: curl -X POST "http://10.244.0.181:8080/ric/v1/test/deletesubid={SubscriptionId}"
+  
+  Example: curl -X POST "http://10.244.0.181:8080/ric/v1/test/deletesubid=1"
+
+ Remove all subscriptions from db
+
+ .. code-block:: none
+
+  Example: curl -X POST "http://10.244.0.181:8080/ric/v1/test/emptydb"
+
+ Make Subscription Manager restart
+
+ .. code-block:: none
+
+  Example: curl -X POST "http://10.244.0.181:8080/ric/v1/test/restart"
+
+ Use this command to get Subscription Manager's log writings
+
+ .. code-block:: none
+
+   Example: kubectl logs -n ricplt submgr-75bccb84b6-n9vnt
+
+ Logger level in configmap.yaml file in Helm chart is by default 2. It means that only info logs are printed.
+ To see debug log writings it has to be changed to 4.
+
+ .. code-block:: none
+
+    "logger":
+      "level": 4
+
+RAN services explained
+----------------------
+  RIC hosted xApps may use the following RAN services from a RAN node:
+
+  *  REPORT: RIC requests that RAN sends a REPORT message to RIC and continues further call processing in RAN after each occurrence of a defined SUBSCRIPTION
+  *  INSERT: RIC requests that RAN sends an INSERT message to RIC and suspends further call processing in RAN after each occurrence of a defined SUBSCRIPTION
+  *  CONTROL: RIC sends a Control message to RAN to initiate or resume call processing in RAN
+  *  POLICY: RIC requests that RAN executes a specific POLICY during call processing in RAN after each occurrence of a defined SUBSCRIPTION
+
+Supported E2 procedures and RAN services
+----------------------------------------
+    * RIC Subscription procedure with following RIC action types:
+
+      - REPORT
+      - POLICY
+      - INSERT
+
+    * RIC Subscription Delete procedure
+
+    * Merge and delete of equal REPORT type subscriptions.
+
+Recommendations for xApps
+-------------------------
+
+   * Recommended retry delay in xApp
+
+     Recommended retry delay for xApp is >= 5 seconds. Length of supervising timers in Subscription Manager for the requests it sends to BTS is by default 2
+     seconds. Subscription Manager makes one retry by default. There can be only one ongoing request towards per RAN other requests are queued in Subscription
+     Manager.