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 {
}
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
+}
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"
)
}
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)
}