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 ==================================================================================
24 "gerrit.o-ran-sc.org/r/ric-plt/alarm-go.git/alarm"
25 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel"
26 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
30 stats map[string]xapp.Counter
34 A1_POLICY_QUERY = 20013
35 POLICY_QUERY_PAYLOAD = "{\"policy_type_id\":20000}"
41 subsequestActioType = "continue"
44 procedureCode = int64(27)
45 typeOfMessage = int64(1)
49 clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-http.ricxapp", HTTPPort: &hPort, RMRPort: &rPort}
52 func (e *HWApp) sendPolicyQuery() {
53 xapp.Logger.Info("Invoked method to send policy query message")
55 // prepare and send policy query message over RMR
56 rmrParams := new(xapp.RMRParams)
57 rmrParams.Mtype = A1_POLICY_QUERY // A1_POLICY_QUERY
58 rmrParams.Payload = []byte(POLICY_QUERY_PAYLOAD)
61 flg := xapp.Rmr.SendMsg(rmrParams)
64 xapp.Logger.Info("Successfully sent policy query message over RMR")
66 xapp.Logger.Info("Failed to send policy query message over RMR")
70 func (e *HWApp) ConfigChangeHandler(f string) {
71 xapp.Logger.Info("Config file changed")
74 func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error) {
75 enbs, err := xapp.Rnib.GetListEnbIds()
78 xapp.Logger.Error("err: %s", err)
82 xapp.Logger.Info("List for connected eNBs :")
83 for index, enb := range enbs {
84 xapp.Logger.Info("%d. enbid: %s", index+1, enb.InventoryName)
89 func (e *HWApp) getGnbList() ([]*xapp.RNIBNbIdentity, error) {
90 gnbs, err := xapp.Rnib.GetListGnbIds()
93 xapp.Logger.Error("err: %s", err)
97 xapp.Logger.Info("List of connected gNBs :")
98 for index, gnb := range gnbs {
99 xapp.Logger.Info("%d. gnbid : %s", index+1, gnb.InventoryName)
104 func (e *HWApp) getnbList() []*xapp.RNIBNbIdentity {
105 nbs := []*xapp.RNIBNbIdentity{}
107 if enbs, err := e.getEnbList(); err == nil {
108 nbs = append(nbs, enbs...)
111 if gnbs, err := e.getGnbList(); err == nil {
112 nbs = append(nbs, gnbs...)
117 func (e *HWApp) sendSubscription(meid string) {
119 xapp.Logger.Info("sending subscription request for meid : %s", meid)
121 subscriptionParams := clientmodel.SubscriptionParams{
122 ClientEndpoint: &clientEndpoint,
124 RANFunctionID: &funId,
125 SubscriptionDetails: clientmodel.SubscriptionDetailsList{
126 &clientmodel.SubscriptionDetail{
129 EventTriggers: &clientmodel.EventTriggerDefinition{
132 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
133 &clientmodel.ActionToBeSetup{
134 ActionDefinition: &clientmodel.ActionDefinition{
138 ActionType: &actionType,
139 SubsequentAction: &clientmodel.SubsequentAction{
140 SubsequentActionType: &subsequestActioType,
141 TimeToWait: &timeToWait,
149 b, err := json.MarshalIndent(subscriptionParams, "", " ")
152 xapp.Logger.Error("Json marshaling failed : %s", err)
156 xapp.Logger.Info("*****body: %s ", string(b))
158 resp, err := xapp.Subscription.Subscribe(&subscriptionParams)
161 xapp.Logger.Error("subscription failed (%s) with error: %s", meid, err)
163 // subscription failed, raise alarm
164 err := xapp.Alarm.Raise(8086, alarm.SeverityCritical, meid, "subscriptionFailed")
166 xapp.Logger.Error("Raising alarm failed with error %v", err)
171 xapp.Logger.Info("Successfully subcription done (%s), subscription id : %s", meid, *resp.SubscriptionID)
174 func (e *HWApp) xAppStartCB(d interface{}) {
175 xapp.Logger.Info("xApp ready call back received")
177 // get the list of all NBs
178 nbList := e.getnbList()
180 // send subscription request to each of the NBs
181 for _, nb := range nbList {
182 e.sendSubscription(nb.InventoryName)
186 func (e *HWApp) handleRICIndication(ranName string, r *xapp.RMRParams) {
187 // update metrics for indication message
188 e.stats["RICIndicationRx"].Inc()
191 func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
192 id := xapp.Rmr.GetRicMessageName(msg.Mtype)
194 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)
197 // policy request handler
198 case "A1_POLICY_REQUEST":
199 xapp.Logger.Info("Recived policy instance list")
201 // health check request
202 case "RIC_HEALTH_CHECK_REQ":
203 xapp.Logger.Info("Received health check request")
205 // RIC INDICATION message
206 case "RIC_INDICATION":
207 xapp.Logger.Info("Received RIC Indication message")
208 e.handleRICIndication(msg.Meid.RanName, msg)
211 xapp.Logger.Info("Unknown message type '%d', discarding", msg.Mtype)
215 xapp.Rmr.Free(msg.Mbuf)
221 func (e *HWApp) Run() {
224 xapp.Logger.SetMdc("HWApp", "0.0.1")
226 // set config change listener
227 xapp.AddConfigChangeListener(e.ConfigChangeHandler)
229 // register callback after xapp ready
230 xapp.SetReadyCB(e.xAppStartCB, true)
232 // reading configuration from config file
233 waitForSdl := xapp.Config.GetBool("db.waitForSdl")
236 xapp.RunWithParams(e, waitForSdl)
241 // Defind metrics counter that the xapp provides
242 metrics := []xapp.CounterOpts{
244 Name: "RICIndicationRx",
245 Help: "Total number of RIC Indication message received",
250 stats: xapp.Metric.RegisterCounterGroup(metrics, "hw_go"), // register counter