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 xappEventInstanceID = int64(1234)
46 typeOfMessage = int64(1)
50 clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-rmr.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([]*clientmodel.SubscriptionDetail{
128 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
129 &clientmodel.ActionToBeSetup{
130 ActionDefinition: clientmodel.ActionDefinition([]int64{1, 2, 3, 4}),
132 ActionType: &actionType,
133 SubsequentAction: &clientmodel.SubsequentAction{
134 SubsequentActionType: &subsequestActioType,
135 TimeToWait: &timeToWait,
139 EventTriggers: clientmodel.EventTriggerDefinition([]int64{1, 2, 3, 4}),
140 XappEventInstanceID: &xappEventInstanceID,
145 b, err := json.MarshalIndent(subscriptionParams, "", " ")
148 xapp.Logger.Error("Json marshaling failed : %s", err)
152 xapp.Logger.Info("*****body: %s ", string(b))
154 resp, err := xapp.Subscription.Subscribe(&subscriptionParams)
157 xapp.Logger.Error("subscription failed (%s) with error: %s", meid, err)
159 // subscription failed, raise alarm
160 err := xapp.Alarm.Raise(8086, alarm.SeverityCritical, meid, "subscriptionFailed")
162 xapp.Logger.Error("Raising alarm failed with error %v", err)
167 xapp.Logger.Info("Successfully subcription done (%s), subscription id : %s", meid, *resp.SubscriptionID)
170 func (e *HWApp) xAppStartCB(d interface{}) {
171 xapp.Logger.Info("xApp ready call back received")
173 // get the list of all NBs
174 nbList := e.getnbList()
176 // send subscription request to each of the NBs
177 for _, nb := range nbList {
178 e.sendSubscription(nb.InventoryName)
182 func (e *HWApp) handleRICIndication(ranName string, r *xapp.RMRParams) {
183 // update metrics for indication message
184 e.stats["RICIndicationRx"].Inc()
187 func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
188 id := xapp.Rmr.GetRicMessageName(msg.Mtype)
190 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)
193 // policy request handler
194 case "A1_POLICY_REQUEST":
195 xapp.Logger.Info("Recived policy instance list")
197 // health check request
198 case "RIC_HEALTH_CHECK_REQ":
199 xapp.Logger.Info("Received health check request")
201 // RIC INDICATION message
202 case "RIC_INDICATION":
203 xapp.Logger.Info("Received RIC Indication message")
204 e.handleRICIndication(msg.Meid.RanName, msg)
207 xapp.Logger.Info("Unknown message type '%d', discarding", msg.Mtype)
211 xapp.Rmr.Free(msg.Mbuf)
217 func (e *HWApp) Run() {
220 xapp.Logger.SetMdc("HWApp", "0.0.1")
222 // set config change listener
223 xapp.AddConfigChangeListener(e.ConfigChangeHandler)
225 // register callback after xapp ready
226 xapp.SetReadyCB(e.xAppStartCB, true)
228 // reading configuration from config file
229 waitForSdl := xapp.Config.GetBool("db.waitForSdl")
232 xapp.RunWithParams(e, waitForSdl)
237 // Defind metrics counter that the xapp provides
238 metrics := []xapp.CounterOpts{
240 Name: "RICIndicationRx",
241 Help: "Total number of RIC Indication message received",
246 stats: xapp.Metric.RegisterCounterGroup(metrics, "hw_go"), // register counter