2 ==================================================================================
3 Copyright (c) 2020 Samsung
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
9 http://www.apache.org/licenses/LICENSE-2.0
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
17 This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 platform project (RICP).
19 ==================================================================================
26 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel"
27 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
31 stats map[string]xapp.Counter
35 A1_POLICY_QUERY = 20013
36 POLICY_QUERY_PAYLOAD = "{\"policy_type_id\":20000}"
42 subsequestActioType = "continue"
45 procedureCode = int64(27)
46 typeOfMessage = int64(1)
50 clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-http.ricxapp", HTTPPort: &hPort, RMRPort: &rPort}
53 func (e *HWApp) sendPolicyQuery() {
54 xapp.Logger.Info("Invoked method to send policy query message")
56 // prepare and send policy query message over RMR
57 rmrParams := new(xapp.RMRParams)
58 rmrParams.Mtype = A1_POLICY_QUERY // A1_POLICY_QUERY
59 rmrParams.Payload = []byte(POLICY_QUERY_PAYLOAD)
62 flg := xapp.Rmr.SendMsg(rmrParams)
65 xapp.Logger.Info("Successfully sent policy query message over RMR")
67 xapp.Logger.Info("Failed to send policy query message over RMR")
71 func (e *HWApp) ConfigChangeHandler(f string) {
72 xapp.Logger.Info("Config file changed")
75 func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error) {
76 enbs, err := xapp.Rnib.GetListEnbIds()
79 xapp.Logger.Error("err: %s", err)
83 xapp.Logger.Info("List for connected eNBs :")
84 for index, enb := range enbs {
85 xapp.Logger.Info("%d. enbid: %s", index+1, enb.InventoryName)
90 func (e *HWApp) getGnbList() ([]*xapp.RNIBNbIdentity, error) {
91 gnbs, err := xapp.Rnib.GetListGnbIds()
94 xapp.Logger.Error("err: %s", err)
98 xapp.Logger.Info("List of connected gNBs :")
99 for index, gnb := range gnbs {
100 xapp.Logger.Info("%d. gnbid : %s", index+1, gnb.InventoryName)
105 func (e *HWApp) getnbList() []*xapp.RNIBNbIdentity {
106 nbs := []*xapp.RNIBNbIdentity{}
108 if enbs, err := e.getEnbList(); err == nil {
109 nbs = append(nbs, enbs...)
112 if gnbs, err := e.getGnbList(); err == nil {
113 nbs = append(nbs, gnbs...)
118 func (e *HWApp) sendSubscription(meid string) {
120 xapp.Logger.Info("sending subscription request for meid : %s", meid)
122 subscriptionParams := clientmodel.SubscriptionParams{
123 ClientEndpoint: &clientEndpoint,
125 RANFunctionID: &funId,
126 SubscriptionDetails: clientmodel.SubscriptionDetailsList{
127 &clientmodel.SubscriptionDetail{
130 EventTriggers: &clientmodel.EventTriggerDefinition{
133 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
134 &clientmodel.ActionToBeSetup{
135 ActionDefinition: &clientmodel.ActionDefinition{
139 ActionType: &actionType,
140 SubsequentAction: &clientmodel.SubsequentAction{
141 SubsequentActionType: &subsequestActioType,
142 TimeToWait: &timeToWait,
150 b, err := json.MarshalIndent(subscriptionParams, "", " ")
153 xapp.Logger.Error("Json marshaling failed : %s", err)
157 xapp.Logger.Info("*****body: %s ", string(b))
159 resp, err := xapp.Subscription.Subscribe(&subscriptionParams)
162 xapp.Logger.Error("subscription failed (%s) with error: %s", meid, err)
165 xapp.Logger.Info("Successfully subcription done (%s), subscription id : %s", meid, *resp.SubscriptionID)
168 func (e *HWApp) xAppStartCB(d interface{}) {
169 xapp.Logger.Info("xApp ready call back received")
171 // get the list of all NBs
172 nbList := e.getnbList()
174 // send subscription request to each of the NBs
175 for _, nb := range nbList {
176 e.sendSubscription(nb.InventoryName)
180 func (e *HWApp) handleRICIndication(ranName string, r *xapp.RMRParams) {
181 // update metrics for indication message
182 e.stats["RICIndicationRx"].Inc()
185 func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
186 id := xapp.Rmr.GetRicMessageName(msg.Mtype)
188 xapp.Logger.Info("Message received: name=%s meid=%s subId=%d txid=%s len=%d", id, msg.Meid.RanName, msg.SubId, msg.Xid, msg.PayloadLen)
191 // policy request handler
192 case "A1_POLICY_REQUEST":
193 xapp.Logger.Info("Recived policy instance list")
195 // health check request
196 case "RIC_HEALTH_CHECK_REQ":
197 xapp.Logger.Info("Received health check request")
199 // RIC INDICATION message
200 case "RIC_INDICATION":
201 xapp.Logger.Info("Received RIC Indication message")
202 e.handleRICIndication(msg.Meid.RanName, msg)
205 xapp.Logger.Info("Unknown message type '%d', discarding", msg.Mtype)
209 xapp.Rmr.Free(msg.Mbuf)
215 func (e *HWApp) Run() {
218 xapp.Logger.SetMdc("HWApp", "0.0.1")
220 // set config change listener
221 xapp.AddConfigChangeListener(e.ConfigChangeHandler)
223 // register callback after xapp ready
224 xapp.SetReadyCB(e.xAppStartCB, true)
226 // reading configuration from config file
227 waitForSdl := xapp.Config.GetBool("db.waitForSdl")
230 xapp.RunWithParams(e, waitForSdl)
235 // Defind metrics counter that the xapp provides
236 metrics := []xapp.CounterOpts{
238 Name: "RICIndicationRx",
239 Help: "Total number of RIC Indication message received",
244 stats: xapp.Metric.RegisterCounterGroup(metrics, "hw-go"), // register counter