RMR handler for A1 policy query 79/9879/9
authornaman.gupta <naman.gupta@samsung.com>
Wed, 30 Nov 2022 17:33:35 +0000 (23:03 +0530)
committernaman.gupta <naman.gupta@samsung.com>
Mon, 5 Dec 2022 14:21:12 +0000 (19:51 +0530)
RMR handler for A1 policy query(messagetype 20012) to xapp

Signed-off-by: naman.gupta <naman.gupta@samsung.com>
Change-Id: I7b2a031cf19d8a140f294c4c42647a4582ba0133

a1-go/pkg/policy/policyManager.go
a1-go/pkg/policy/types.go
a1-go/pkg/rmr/messages.go
a1-go/pkg/rmr/rmr.go

index bcf7a1a..15f325b 100644 (file)
 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
+}
index 9386ead..a5f09fe 100644 (file)
@@ -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)
 }
index 36771ef..da38c2f 100644 (file)
@@ -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 {
index 2e158f8..993e90c 100644 (file)
@@ -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)
        }