From: naman.gupta Date: Wed, 30 Nov 2022 17:33:35 +0000 (+0530) Subject: RMR handler for A1 policy query X-Git-Tag: 3.0.0~16 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=857a953ebb2d8a487ea5b2ee99087871103c8a99;p=ric-plt%2Fa1.git RMR handler for A1 policy query RMR handler for A1 policy query(messagetype 20012) to xapp Signed-off-by: naman.gupta Change-Id: I7b2a031cf19d8a140f294c4c42647a4582ba0133 --- diff --git a/a1-go/pkg/policy/policyManager.go b/a1-go/pkg/policy/policyManager.go index bcf7a1a..15f325b 100644 --- a/a1-go/pkg/policy/policyManager.go +++ b/a1-go/pkg/policy/policyManager.go @@ -22,15 +22,24 @@ package policy import ( + "errors" + "fmt" "strconv" + "strings" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/a1" + "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models" "gerrit.o-ran-sc.org/r/ric-plt/sdlgo" ) +var policyTypeNotFoundError = errors.New("Policy Type Not Found") +var policyInstanceNotFoundError = errors.New("Policy Instance Not Found") + const ( - a1HandlerPrefix = "a1.policy_handler." - a1MediatorNs = "A1m_ns" + a1HandlerPrefix = "a1.policy_handler." + a1PolicyPrefix = "a1.policy_type." + a1MediatorNs = "A1m_ns" + a1InstancePrefix = "a1.policy_instance." ) func NewPolicyManager(sdl *sdlgo.SyncStorage) *PolicyManager { @@ -53,3 +62,80 @@ func (pm *PolicyManager) SetPolicyInstanceStatus(policyTypeId int, policyInstanc } return nil } + +func (im *PolicyManager) GetAllPolicyInstance(policyTypeId int) ([]models.PolicyInstanceID, error) { + a1.Logger.Debug("GetAllPolicyInstance") + var policyTypeInstances = []models.PolicyInstanceID{} + + keys, err := im.db.GetAll("A1m_ns") + + if err != nil { + a1.Logger.Error("error in retrieving policy. err: %v", err) + return policyTypeInstances, err + } + a1.Logger.Debug("keys : %+v", keys) + typekey := a1InstancePrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + + for _, key := range keys { + if strings.HasPrefix(strings.TrimLeft(key, " "), typekey) { + pti := strings.Split(strings.Trim(key, " "), typekey)[1] + a1.Logger.Debug("pti %+v", pti) + policyTypeInstances = append(policyTypeInstances, models.PolicyInstanceID(pti)) + } + } + + if len(policyTypeInstances) == 0 { + a1.Logger.Debug("policy instance Not Present ") + return policyTypeInstances, policyInstanceNotFoundError + } + + a1.Logger.Debug("return : %+v", policyTypeInstances) + return policyTypeInstances, nil +} + +func (im *PolicyManager) GetPolicyInstance(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) (interface{}, error) { + a1.Logger.Debug("GetPolicyInstance1") + + var keys [1]string + + typekey := a1PolicyPrefix + strconv.FormatInt((int64(policyTypeId)), 10) + keys[0] = typekey + + a1.Logger.Debug("key1 : %+v", typekey) + + valmap, err := im.db.Get(a1MediatorNs, keys[:]) + if len(valmap) == 0 { + a1.Logger.Debug("policy type Not Present for policyid : %v", policyTypeId) + return nil, policyTypeNotFoundError + } + + if err != nil { + a1.Logger.Error("error in retrieving policy type. err: %v", err) + return nil, err + } + + if valmap[typekey] == nil { + a1.Logger.Debug("policy type Not Present for policyid : %v", policyTypeId) + return nil, policyTypeNotFoundError + } + + a1.Logger.Debug("keysmap : %+v", valmap[typekey]) + + instancekey := a1InstancePrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID) + a1.Logger.Debug("key2 : %+v", instancekey) + keys[0] = instancekey + instanceMap, err := im.db.Get(a1MediatorNs, keys[:]) + if err != nil { + a1.Logger.Error("policy instance error : %v", err) + return nil, err + } + a1.Logger.Debug("policyinstancetype map : %+v", instanceMap) + + if instanceMap[instancekey] == nil { + a1.Logger.Debug("policy instance Not Present for policyinstaneid : %v", policyInstanceID) + return nil, policyInstanceNotFoundError + } + + valStr := fmt.Sprint(instanceMap[instancekey]) + return valStr, nil +} diff --git a/a1-go/pkg/policy/types.go b/a1-go/pkg/policy/types.go index 9386ead..a5f09fe 100644 --- a/a1-go/pkg/policy/types.go +++ b/a1-go/pkg/policy/types.go @@ -26,4 +26,6 @@ type PolicyManager struct { } type iSdl interface { Set(ns string, pairs ...interface{}) error + GetAll(string) ([]string, error) + Get(string, []string) (map[string]interface{}, error) } diff --git a/a1-go/pkg/rmr/messages.go b/a1-go/pkg/rmr/messages.go index 36771ef..da38c2f 100644 --- a/a1-go/pkg/rmr/messages.go +++ b/a1-go/pkg/rmr/messages.go @@ -22,9 +22,8 @@ package rmr import ( "encoding/json" - "strconv" - "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models" + "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/a1" ) type Message struct { diff --git a/a1-go/pkg/rmr/rmr.go b/a1-go/pkg/rmr/rmr.go index 2e158f8..993e90c 100644 --- a/a1-go/pkg/rmr/rmr.go +++ b/a1-go/pkg/rmr/rmr.go @@ -23,8 +23,10 @@ package rmr import ( "encoding/json" + "strconv" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/a1" + "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models" "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/policy" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" ) @@ -102,6 +104,42 @@ func (rmr *RmrSender) Consume(msg *xapp.RMRParams) (err error) { } a1.Logger.Debug("message recieved for %d and %d with status : %s", result["policy_type_id"], result["policy_instance_id"], result["status"]) rmr.policyManager.SetPolicyInstanceStatus(int(result["policy_type_id"].(float64)), int(result["policy_instance_id"].(float64)), result["status"].(string)) + case "A1_POLICY_QUERY": + a1.Logger.Debug("Recived policy query") + a1.Logger.Debug("message recieved ", msg.Payload) + payload := msg.Payload + var result map[string]interface{} + json.Unmarshal([]byte(payload), &result) + a1.Logger.Debug("message recieved : %s for %d and %d", result, result["policy_type_id"], result["policy_instance_id"]) + policytypeid := (result["policy_type_id"].(float64)) + instanceList, err1 := rmr.policyManager.GetAllPolicyInstance(int(policytypeid)) + if err1 != nil { + a1.Logger.Error("Error : %+v", err1) + return err1 + } + a1.Logger.Debug("instanceList ", instanceList) + a1.Logger.Debug("Received a query for a known policy type: %d", policytypeid) + for _, policyinstanceid := range instanceList { + policyinstance, err2 := rmr.policyManager.GetPolicyInstance(models.PolicyTypeID(policytypeid), policyinstanceid) + if err2 != nil { + a1.Logger.Error("Error : %+v", err2) + return err2 + } + a1.Logger.Debug("policyinstance ", policyinstance.(string)) + message := Message{} + rmrMessage, err1 := message.PolicyMessage(strconv.FormatInt((int64(policytypeid)), 10), string(policyinstanceid), policyinstance.(string), "CREATE") + if err1 != nil { + a1.Logger.Error("error : %v", err1) + return err1 + } + a1.Logger.Debug("rmrMessage ", rmrMessage) + isSent := rmr.RmrSendToXapp(rmrMessage, a1PolicyRequest) + if isSent { + a1.Logger.Debug("rmrSendToXapp : message sent") + } else { + a1.Logger.Error("rmrSendToXapp : message not sent") + } + } default: xapp.Logger.Error("Unknown message type '%d', discarding", msg.Mtype) }