Create relesae v1.1.1
[ric-app/hw-go.git] / hwApp.go
index 2f82210..14dd4f6 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)
+       typeOfMessage        = int64(1)
+       subscriptionId       = ""
+       hPort                = int64(8080)
+       rPort                = int64(4560)
+       clientEndpoint       = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-http.ricxapp", HTTPPort: &hPort, RMRPort: &rPort}
+)
+
+func (e *HWApp) sendPolicyQuery() {
+       xapp.Logger.Info("Invoked method to send  policy query message")
+
+       // prepare and send policy query message over RMR
+       rmrParams := new(xapp.RMRParams)
+       rmrParams.Mtype = A1_POLICY_QUERY // A1_POLICY_QUERY
+       rmrParams.Payload = []byte(POLICY_QUERY_PAYLOAD)
+
+       // send rmr message
+       flg := xapp.Rmr.SendMsg(rmrParams)
+
+       if flg {
+               xapp.Logger.Info("Successfully sent policy query message over RMR")
+       } else {
+               xapp.Logger.Info("Failed to send policy query message over RMR")
+       }
 }
 
 func (e *HWApp) ConfigChangeHandler(f string) {
        xapp.Logger.Info("Config file changed")
 }
 
+func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error) {
+       enbs, err := xapp.Rnib.GetListEnbIds()
+
+       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
+}
+
+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
+}
+
+func (e *HWApp) getnbList() []*xapp.RNIBNbIdentity {
+       nbs := []*xapp.RNIBNbIdentity{}
+
+       if enbs, err := e.getEnbList(); err == nil {
+               nbs = append(nbs, enbs...)
+       }
+
+       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{
+                               RequestorID: &reqId,
+                               InstanceID:  &seqId,
+                               EventTriggers: &clientmodel.EventTriggerDefinition{
+                                       OctetString: "1234",
+                               },
+                               ActionToBeSetupList: clientmodel.ActionsToBeSetup{
+                                       &clientmodel.ActionToBeSetup{
+                                               ActionDefinition: &clientmodel.ActionDefinition{
+                                                       OctetString: "5678",
+                                               },
+                                               ActionID:   &actionId,
+                                               ActionType: &actionType,
+                                               SubsequentAction: &clientmodel.SubsequentAction{
+                                                       SubsequentActionType: &subsequestActioType,
+                                                       TimeToWait:           &timeToWait,
+                                               },
+                                       },
+                               },
+                       },
+               },
+       }
+
+       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
+       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) {
@@ -49,6 +202,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)
        }
@@ -80,6 +238,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()
 }