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) {
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)
}
}
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()
}