"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/a1/pkg/restapi/operations/a1_mediator"
"gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/rmr"
"gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
"github.com/santhosh-tekuri/jsonschema/v5"
a1InstancePrefix = "a1.policy_instance."
a1InstanceMetadataPrefix = "a1.policy_inst_metadata."
a1HandlerPrefix = "a1.policy_handler."
+ a1PolicyRequest = 20010
+ a1EIDataDelivery = 20017
)
var typeAlreadyError = errors.New("Policy Type already exists")
var policyInstanceNotFoundError = errors.New("Policy Instance Not Found")
var policyTypeNotFoundError = errors.New("Policy Type Not Found")
var policyTypeCanNotBeDeletedError = errors.New("tried to delete a type that isn't empty")
+var policyInstanceCanNotBeDeletedError = errors.New("tried to delete a Instance that isn't empty")
+
+func (rh *Resthook) CanPolicyInstanceBeDeleted(err error) bool {
+ return err == policyInstanceCanNotBeDeletedError
+}
func (rh *Resthook) CanPolicyTypeBeDeleted(err error) bool {
return err == policyTypeCanNotBeDeletedError
return err == invalidJsonSchema
}
func NewResthook() *Resthook {
- return createResthook(sdlgo.NewSyncStorage(), rmr.NewRMRSender())
+ sdl := sdlgo.NewSyncStorage()
+ policyManager := policy.NewPolicyManager(sdl)
+ return createResthook(sdl, rmr.NewRMRSender(policyManager))
}
func createResthook(sdlInst iSdl, rmrSenderInst rmr.IRmrSender) *Resthook {
- return &Resthook{
+ rh := &Resthook{
db: sdlInst,
iRmrSenderInst: rmrSenderInst,
}
+
+ return rh
+}
+
+func (rh *Resthook) GetA1Health() bool {
+ data, _ := rh.db.GetAll(a1MediatorNs)
+ if data != nil {
+ a1.Logger.Debug("Database connected and A1 is healthy")
+ return true
+ }
+ return false
}
func (rh *Resthook) GetAllPolicyType() []models.PolicyTypeID {
a1.Logger.Error("error : %v", err)
return err
}
- isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage)
+ isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1PolicyRequest)
if isSent {
a1.Logger.Debug("rmrSendToXapp : message sent")
} else {
}
return &policyInstanceStatus, nil
}
+
+func (rh *Resthook) storeDeletedPolicyInstanceMetadata(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID, creation_timestamp string) error {
+ deleted_timestamp := time.Now()
+
+ instanceMetadataKey := a1InstanceMetadataPrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID)
+
+ a1.Logger.Debug("instanceMetadata Key : %+v", instanceMetadataKey)
+
+ var metadatajson interface{}
+ metadatajson = map[string]string{"created_at": creation_timestamp, "has_been_deleted": "True", "deleted_at": deleted_timestamp.Format("2006-01-02 15:04:05")}
+ a1.Logger.Debug("metadatajson to create : %+v", metadatajson)
+ deletedmetadata, err := json.Marshal(metadatajson)
+
+ a1.Logger.Debug("policyinstanceMetaData to create : %+v", string(deletedmetadata))
+
+ err = rh.db.Set(a1MediatorNs, instanceMetadataKey, string(deletedmetadata))
+ a1.Logger.Debug("deletemetadatacreated")
+ if err != nil {
+ a1.Logger.Error("error :%+v", err)
+ return err
+ }
+
+ a1.Logger.Error("Policy Instance Meta Data deleted at :%+v", creation_timestamp)
+
+ return nil
+}
+
+func (rh *Resthook) deleteInstancedata(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) error {
+ var keys [1]string
+ instancekey := a1InstancePrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID)
+ keys[0] = instancekey
+ err := rh.db.Remove(a1MediatorNs, keys[:])
+ if err != nil {
+ a1.Logger.Error("error in deleting policy type err: %v", err)
+ return err
+ }
+ return nil
+}
+
+func (rh *Resthook) deleteMetadata(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) error {
+ var keys [1]string
+ instanceMetadataKey := a1InstanceMetadataPrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID)
+
+ a1.Logger.Debug("instanceMetadata Key : %+v", instanceMetadataKey)
+ keys[0] = instanceMetadataKey
+ err := rh.db.Remove(a1MediatorNs, keys[:])
+ if err != nil {
+ a1.Logger.Error("error in deleting policy metadata err: %v", err)
+ return err
+ }
+ return nil
+}
+
+func (rh *Resthook) DeletePolicyInstance(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) error {
+ err := rh.instanceValidity(policyTypeId, policyInstanceID)
+ if err != nil {
+ a1.Logger.Error("policy instance error : %v", err)
+ if err == policyInstanceNotFoundError || err == policyTypeNotFoundError {
+ return err
+ }
+ }
+
+ createdmetadata, err := rh.getMetaData(policyTypeId, policyInstanceID)
+ if err != nil {
+ a1.Logger.Error("error : %v", err)
+ return err
+ }
+ a1.Logger.Debug(" created metadata %v", createdmetadata)
+ instanceMetadataKey := a1InstanceMetadataPrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID)
+ creation_metadata := createdmetadata[instanceMetadataKey]
+ var metadata map[string]interface{}
+ if err = json.Unmarshal([]byte(creation_metadata.(string)), &metadata); err != nil {
+ a1.Logger.Error("unmarshal error : %v", err)
+ return err
+ }
+
+ a1.Logger.Debug(" created metadata created_at %v", metadata["created_at"])
+ creation_timestamp := metadata["created_at"]
+
+ rh.deleteMetadata(policyTypeId, policyInstanceID)
+
+ rh.deleteInstancedata(policyTypeId, policyInstanceID)
+
+ rh.storeDeletedPolicyInstanceMetadata(policyTypeId, policyInstanceID, creation_timestamp.(string))
+
+ message := rmr.Message{}
+ rmrMessage, err1 := message.PolicyMessage(strconv.FormatInt((int64(policyTypeId)), 10), string(policyInstanceID), "", "DELETE")
+ if err1 != nil {
+ a1.Logger.Error("error : %v", err1)
+ return err1
+ }
+ isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1PolicyRequest)
+ if isSent {
+ a1.Logger.Debug("rmrSendToXapp : message sent")
+ } else {
+ //TODO:if message not sent need to return error or just log it or retry sending
+ a1.Logger.Error("rmrSendToXapp : message not sent")
+ }
+
+ return nil
+}
+
+func (rh *Resthook) DataDelivery(httpBody interface{}) error {
+ a1.Logger.Debug("httpbody : %+v", httpBody)
+ mymap := httpBody.(map[string]interface{})
+ message := rmr.Message{}
+ rmrMessage, err := message.A1EIMessage(mymap["job"].(string), mymap["payload"].(string))
+ if err != nil {
+ a1.Logger.Error("error : %v", err)
+ return err
+ }
+ a1.Logger.Debug("rmrSendToXapp :rmrMessage %+v", rmrMessage)
+ isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage, a1EIDataDelivery)
+ if isSent {
+ a1.Logger.Debug("rmrSendToXapp : message sent")
+ } else {
+ a1.Logger.Error("rmrSendToXapp : message not sent")
+ }
+ return nil
+}