Release image version 1.1.2
[ric-app/hw-go.git] / hwApp.go
index 52342b0..74f2df4 100755 (executable)
--- a/hwApp.go
+++ b/hwApp.go
    See the License for the specific language governing permissions and
    limitations under the License.
 
-   This source code is part of the near-RT RIC (RAN Intelligent Controller)
-   platform project (RICP).
 ==================================================================================
 */
 package main
 
 import (
+       "encoding/json"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/alarm-go.git/alarm"
+       "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel"
        "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
 )
 
 type HWApp struct {
+       stats map[string]xapp.Counter
 }
 
 var (
        A1_POLICY_QUERY      = 20013
        POLICY_QUERY_PAYLOAD = "{\"policy_type_id\":20000}"
+       reqId                = int64(1)
+       seqId                = int64(1)
+       funId                = int64(1)
+       actionId             = int64(1)
+       actionType           = "report"
+       subsequestActioType  = "continue"
+       timeToWait           = "w10ms"
+       direction            = int64(0)
+       procedureCode        = int64(27)
+       xappEventInstanceID  = int64(1234)
+       typeOfMessage        = int64(1)
+       subscriptionId       = ""
+       hPort                = int64(8080)
+       rPort                = int64(4560)
+       clientEndpoint       = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-rmr.ricxapp", HTTPPort: &hPort, RMRPort: &rPort}
 )
 
 func (e *HWApp) sendPolicyQuery() {
@@ -54,54 +72,116 @@ func (e *HWApp) ConfigChangeHandler(f string) {
        xapp.Logger.Info("Config file changed")
 }
 
-func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error){
-       enbs, err := xapp.Rnib.GetListEnbIds()
+func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error) {
+       enbs, err := xapp.Rnib.GetListEnbIds()
 
-       if err != nil {
-               xapp.Logger.Error("err: %s", err)
-               return nil, err
-       }
+       if err != nil {
+               xapp.Logger.Error("err: %s", err)
+               return nil, err
+       }
 
-       xapp.Logger.Info("List for connected eNBs :")
-       for index, enb := range enbs {
-               xapp.Logger.Info("%d. enbid: %s", index+1, enb.InventoryName)
-       }
-       return enbs, nil
+       xapp.Logger.Info("List for connected eNBs :")
+       for index, enb := range enbs {
+               xapp.Logger.Info("%d. enbid: %s", index+1, enb.InventoryName)
+       }
+       return enbs, nil
 }
 
 func (e *HWApp) getGnbList() ([]*xapp.RNIBNbIdentity, error) {
-       gnbs, err := xapp.Rnib.GetListGnbIds()
-
-       if err != nil {
-               xapp.Logger.Error("err: %s", err)
-               return nil, err
-       }
-
-       xapp.Logger.Info("List of connected gNBs :")
-       for index, gnb := range gnbs {
-               xapp.Logger.Info("%d. gnbid : %s", index+1, gnb.InventoryName)
-       }
-       return gnbs, nil
+       gnbs, err := xapp.Rnib.GetListGnbIds()
+
+       if err != nil {
+               xapp.Logger.Error("err: %s", err)
+               return nil, err
+       }
+
+       xapp.Logger.Info("List of connected gNBs :")
+       for index, gnb := range gnbs {
+               xapp.Logger.Info("%d. gnbid : %s", index+1, gnb.InventoryName)
+       }
+       return gnbs, nil
 }
 
-func (e *HWApp) getnbList() ([]*xapp.RNIBNbIdentity) {
-       nbs := []*xapp.RNIBNbIdentity{}
+func (e *HWApp) getnbList() []*xapp.RNIBNbIdentity {
+       nbs := []*xapp.RNIBNbIdentity{}
 
-       if enbs , err := e.getEnbList(); err == nil {
-              nbs = append(nbs, enbs...)
-       }
+       if enbs, err := e.getEnbList(); err == nil {
+               nbs = append(nbs, enbs...)
+       }
 
-       if gnbs, err := e.getGnbList(); err == nil {
-              nbs = append(nbs, gnbs...)
-       }
-       return nbs
+       if gnbs, err := e.getGnbList(); err == nil {
+               nbs = append(nbs, gnbs...)
+       }
+       return nbs
+}
+
+func (e *HWApp) sendSubscription(meid string) {
+
+       xapp.Logger.Info("sending subscription request for meid : %s", meid)
+
+       subscriptionParams := clientmodel.SubscriptionParams{
+               ClientEndpoint: &clientEndpoint,
+               Meid:           &meid,
+               RANFunctionID:  &funId,
+               SubscriptionDetails: clientmodel.SubscriptionDetailsList([]*clientmodel.SubscriptionDetail{
+                       {
+                               ActionToBeSetupList: clientmodel.ActionsToBeSetup{
+                                       &clientmodel.ActionToBeSetup{
+                                               ActionDefinition: clientmodel.ActionDefinition([]int64{1, 2, 3, 4}),
+                                               ActionID:         &actionId,
+                                               ActionType:       &actionType,
+                                               SubsequentAction: &clientmodel.SubsequentAction{
+                                                       SubsequentActionType: &subsequestActioType,
+                                                       TimeToWait:           &timeToWait,
+                                               },
+                                       },
+                               },
+                               EventTriggers:       clientmodel.EventTriggerDefinition([]int64{1, 2, 3, 4}),
+                               XappEventInstanceID: &xappEventInstanceID,
+                       },
+               }),
+       }
+
+       b, err := json.MarshalIndent(subscriptionParams, "", "  ")
+
+       if err != nil {
+               xapp.Logger.Error("Json marshaling failed : %s", err)
+               return
+       }
+
+       xapp.Logger.Info("*****body: %s ", string(b))
+
+       resp, err := xapp.Subscription.Subscribe(&subscriptionParams)
+
+       if err != nil {
+               xapp.Logger.Error("subscription failed (%s) with error: %s", meid, err)
+
+               // subscription failed, raise alarm
+               err := xapp.Alarm.Raise(8086, alarm.SeverityCritical, meid, "subscriptionFailed")
+               if err != nil {
+                       xapp.Logger.Error("Raising alarm failed with error %v", err)
+               }
+
+               return
+       }
+       xapp.Logger.Info("Successfully subcription done (%s), subscription id : %s", meid, *resp.SubscriptionID)
 }
 
 func (e *HWApp) xAppStartCB(d interface{}) {
        xapp.Logger.Info("xApp ready call back received")
 
-       // get the list of all NBs
-       e.getnbList()
+       // get the list of all NBs
+       nbList := e.getnbList()
+
+       // send subscription request to each of the NBs
+       for _, nb := range nbList {
+               e.sendSubscription(nb.InventoryName)
+       }
+}
+
+func (e *HWApp) handleRICIndication(ranName string, r *xapp.RMRParams) {
+       // update metrics for indication message
+       e.stats["RICIndicationRx"].Inc()
 }
 
 func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
@@ -118,6 +198,11 @@ func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
        case "RIC_HEALTH_CHECK_REQ":
                xapp.Logger.Info("Received health check request")
 
+       // RIC INDICATION message
+       case "RIC_INDICATION":
+               xapp.Logger.Info("Received RIC Indication message")
+               e.handleRICIndication(msg.Meid.RanName, msg)
+
        default:
                xapp.Logger.Info("Unknown message type '%d', discarding", msg.Mtype)
        }
@@ -149,6 +234,16 @@ func (e *HWApp) Run() {
 }
 
 func main() {
-       hw := HWApp{}
+       // Defind metrics counter that the xapp provides
+       metrics := []xapp.CounterOpts{
+               {
+                       Name: "RICIndicationRx",
+                       Help: "Total number of RIC Indication message received",
+               },
+       }
+
+       hw := HWApp{
+               stats: xapp.Metric.RegisterCounterGroup(metrics, "hw_go"), // register counter
+       }
        hw.Run()
 }