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/alarm-go.git/alarm"
27 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel"
28 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
32 stats map[string]xapp.Counter
36 A1_POLICY_QUERY = 20013
37 POLICY_QUERY_PAYLOAD = "{\"policy_type_id\":20000}"
43 subsequestActioType = "continue"
46 procedureCode = int64(27)
47 typeOfMessage = int64(1)
51 clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "service-ricxapp-hw-go-http.ricxapp", HTTPPort: &hPort, RMRPort: &rPort}
54 func (e *HWApp) sendPolicyQuery() {
55 xapp.Logger.Info("Invoked method to send policy query message")
57 // prepare and send policy query message over RMR
58 rmrParams := new(xapp.RMRParams)
59 rmrParams.Mtype = A1_POLICY_QUERY // A1_POLICY_QUERY
60 rmrParams.Payload = []byte(POLICY_QUERY_PAYLOAD)
63 flg := xapp.Rmr.SendMsg(rmrParams)
66 xapp.Logger.Info("Successfully sent policy query message over RMR")
68 xapp.Logger.Info("Failed to send policy query message over RMR")
72 func (e *HWApp) ConfigChangeHandler(f string) {
73 xapp.Logger.Info("Config file changed")
76 func (e *HWApp) getEnbList() ([]*xapp.RNIBNbIdentity, error) {
77 enbs, err := xapp.Rnib.GetListEnbIds()
80 xapp.Logger.Error("err: %s", err)
84 xapp.Logger.Info("List for connected eNBs :")
85 for index, enb := range enbs {
86 xapp.Logger.Info("%d. enbid: %s", index+1, enb.InventoryName)
91 func (e *HWApp) getGnbList() ([]*xapp.RNIBNbIdentity, error) {
92 gnbs, err := xapp.Rnib.GetListGnbIds()
95 xapp.Logger.Error("err: %s", err)
99 xapp.Logger.Info("List of connected gNBs :")
100 for index, gnb := range gnbs {
101 xapp.Logger.Info("%d. gnbid : %s", index+1, gnb.InventoryName)
106 func (e *HWApp) getnbList() []*xapp.RNIBNbIdentity {
107 nbs := []*xapp.RNIBNbIdentity{}
109 if enbs, err := e.getEnbList(); err == nil {
110 nbs = append(nbs, enbs...)
113 if gnbs, err := e.getGnbList(); err == nil {
114 nbs = append(nbs, gnbs...)
119 func (e *HWApp) sendSubscription(meid string) {
121 xapp.Logger.Info("sending subscription request for meid : %s", meid)
123 subscriptionParams := clientmodel.SubscriptionParams{
124 ClientEndpoint: &clientEndpoint,
126 RANFunctionID: &funId,
127 SubscriptionDetails: clientmodel.SubscriptionDetailsList{
128 &clientmodel.SubscriptionDetail{
131 EventTriggers: &clientmodel.EventTriggerDefinition{
134 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
135 &clientmodel.ActionToBeSetup{
136 ActionDefinition: &clientmodel.ActionDefinition{
140 ActionType: &actionType,
141 SubsequentAction: &clientmodel.SubsequentAction{
142 SubsequentActionType: &subsequestActioType,
143 TimeToWait: &timeToWait,
151 b, err := json.MarshalIndent(subscriptionParams, "", " ")
154 xapp.Logger.Error("Json marshaling failed : %s", err)
158 xapp.Logger.Info("*****body: %s ", string(b))
160 resp, err := xapp.Subscription.Subscribe(&subscriptionParams)
163 xapp.Logger.Error("subscription failed (%s) with error: %s", meid, err)
165 // subscription failed, raise alarm
166 err := xapp.Alarm.Raise(8086, alarm.SeverityCritical, meid, "subscriptionFailed")
168 xapp.Logger.Error("Raising alarm failed with error %v", err)
173 xapp.Logger.Info("Successfully subcription done (%s), subscription id : %s", meid, *resp.SubscriptionID)
176 func (e *HWApp) xAppStartCB(d interface{}) {
177 xapp.Logger.Info("xApp ready call back received")
179 // get the list of all NBs
180 nbList := e.getnbList()
182 // send subscription request to each of the NBs
183 for _, nb := range nbList {
184 e.sendSubscription(nb.InventoryName)
188 func (e *HWApp) handleRICIndication(ranName string, r *xapp.RMRParams) {
189 // update metrics for indication message
190 e.stats["RICIndicationRx"].Inc()
193 func (e *HWApp) Consume(msg *xapp.RMRParams) (err error) {
194 id := xapp.Rmr.GetRicMessageName(msg.Mtype)
196 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)
199 // policy request handler
200 case "A1_POLICY_REQUEST":
201 xapp.Logger.Info("Recived policy instance list")
203 // health check request
204 case "RIC_HEALTH_CHECK_REQ":
205 xapp.Logger.Info("Received health check request")
207 // RIC INDICATION message
208 case "RIC_INDICATION":
209 xapp.Logger.Info("Received RIC Indication message")
210 e.handleRICIndication(msg.Meid.RanName, msg)
213 xapp.Logger.Info("Unknown message type '%d', discarding", msg.Mtype)
217 xapp.Rmr.Free(msg.Mbuf)
223 func (e *HWApp) Run() {
226 xapp.Logger.SetMdc("HWApp", "0.0.1")
228 // set config change listener
229 xapp.AddConfigChangeListener(e.ConfigChangeHandler)
231 // register callback after xapp ready
232 xapp.SetReadyCB(e.xAppStartCB, true)
234 // reading configuration from config file
235 waitForSdl := xapp.Config.GetBool("db.waitForSdl")
238 xapp.RunWithParams(e, waitForSdl)
243 // Defind metrics counter that the xapp provides
244 metrics := []xapp.CounterOpts{
246 Name: "RICIndicationRx",
247 Help: "Total number of RIC Indication message received",
252 stats: xapp.Metric.RegisterCounterGroup(metrics, "hw-go"), // register counter