Message creation based on different operation
[ric-plt/a1.git] / a1-go / pkg / resthooks / resthooks.go
index 79dba93..0c870f6 100644 (file)
@@ -30,8 +30,8 @@ import (
 
        "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/rmr"
        "gerrit.o-ran-sc.org/r/ric-plt/sdlgo"
-       "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
        "github.com/santhosh-tekuri/jsonschema/v5"
        "gopkg.in/yaml.v2"
 )
@@ -50,6 +50,11 @@ var typeMismatchError = errors.New("Policytype Mismatch")
 var invalidJsonSchema = errors.New("Invalid Json ")
 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")
+
+func (rh *Resthook) CanPolicyTypeBeDeleted(err error) bool {
+       return err == policyTypeCanNotBeDeletedError
+}
 
 func (rh *Resthook) IsPolicyTypePresent(err error) bool {
        return err == policyTypeNotFoundError
@@ -365,7 +370,14 @@ func (rh *Resthook) CreatePolicyInstance(policyTypeId models.PolicyTypeID, polic
                if iscreated {
                        a1.Logger.Debug("policy instance metadata created")
                }
-               isSent := rh.iRmrSenderInst.RmrSendToXapp(httpBodyString)
+
+               message := rmr.Message{}
+               rmrMessage, err := message.PolicyMessage(strconv.FormatInt((int64(policyTypeId)), 10), string(policyInstanceID), httpBodyString, operation)
+               if err != nil {
+                       a1.Logger.Error("error : %v", err)
+                       return err
+               }
+               isSent := rh.iRmrSenderInst.RmrSendToXapp(rmrMessage)
                if isSent {
                        a1.Logger.Debug("rmrSendToXapp : message sent")
                } else {
@@ -454,3 +466,112 @@ func (rh *Resthook) GetAllPolicyInstance(policyTypeId models.PolicyTypeID) ([]mo
        a1.Logger.Debug("return : %+v", policyTypeInstances)
        return policyTypeInstances, nil
 }
+
+func (rh *Resthook) DeletePolicyType(policyTypeId models.PolicyTypeID) error {
+       a1.Logger.Debug("DeletePolicyType")
+
+       policyinstances, err := rh.GetAllPolicyInstance(policyTypeId)
+       if err != nil {
+               a1.Logger.Error("error in retrieving policy. err: %v", err)
+               return err
+       }
+
+       var keys [1]string
+       key := a1PolicyPrefix + strconv.FormatInt((int64(policyTypeId)), 10)
+       keys[0] = key
+       if len(policyinstances) == 0 {
+               err := rh.db.Remove(a1MediatorNs, keys[:])
+               if err != nil {
+                       a1.Logger.Error("error in deleting policy type err: %v", err)
+                       return err
+               }
+       } else {
+               a1.Logger.Error("tried to delete a type that isn't empty")
+               return policyTypeCanNotBeDeletedError
+       }
+       return nil
+}
+
+func (rh *Resthook) typeValidity(policyTypeId models.PolicyTypeID) error {
+       var keys [1]string
+
+       typekey := a1PolicyPrefix + strconv.FormatInt((int64(policyTypeId)), 10)
+       keys[0] = typekey
+
+       a1.Logger.Debug("key1 : %+v", typekey)
+       valmap, err := rh.db.Get(a1MediatorNs, keys[:])
+       if err != nil {
+               a1.Logger.Error("error in retrieving policytype err: %v", err)
+               return err
+       }
+       if len(valmap) == 0 {
+               a1.Logger.Error("policy type Not Present for policyid : %v", policyTypeId)
+               return policyTypeNotFoundError
+       }
+}
+
+func (rh *Resthook) instanceValidity(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) error {
+       err := rh.typeValidity(policyTypeId)
+       if err != nil {
+               return err
+       }
+       policyTypeInstances, err := rh.GetPolicyInstance(policyTypeId, policyInstanceID)
+       if err != nil {
+               a1.Logger.Error("policy instance error : %v", err)
+               return err
+       }
+       if len(policyTypeInstances.(string)) == 0 {
+               a1.Logger.Debug("policy instance Not Present  ")
+               return policyInstanceNotFoundError
+       }
+}
+
+func (rh *Resthook) getMetaData(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) (map[string]interface{}, error) {
+       instanceMetadataKey := a1InstanceMetadataPrefix + strconv.FormatInt((int64(policyTypeId)), 10) + "." + string(policyInstanceID)
+       a1.Logger.Debug("instanceMetadata key : %+v", instanceMetadataKey)
+       var keys [1]string
+       keys[0] = instanceMetadataKey
+       instanceMetadataMap, err := rh.db.Get(a1MediatorNs, keys[:])
+       if err != nil {
+               a1.Logger.Error("policy instance error : %v", err)
+       }
+       a1.Logger.Debug("instanceMetadata map : %+v", instanceMetadataMap)
+       if instanceMetadataMap[instanceMetadataKey] == nil {
+               a1.Logger.Error("policy instance Not Present for policyinstaneid : %v", policyInstanceID)
+               return map[string]interface{}{}, policyInstanceNotFoundError
+       }
+       return instanceMetadataMap, nil
+}
+
+func (rh *Resthook) GetPolicyInstanceStatus(policyTypeId models.PolicyTypeID, policyInstanceID models.PolicyInstanceID) (*a1_mediator.A1ControllerGetPolicyInstanceStatusOKBody, error) {
+       err := rh.instanceValidity(policyTypeId, policyInstanceID)
+       if err != nil && err == policyInstanceNotFoundError || err == policyTypeNotFoundError {
+               policyInstanceStatus.InstanceStatus = "NOT IN EFFECT"
+               return &policyInstanceStatus, err
+       }
+       policyInstanceStatus := a1_mediator.A1ControllerGetPolicyInstanceStatusOKBody{}
+       metadata, err := rh.getMetaData(policyTypeId, policyInstanceID)
+       a1.Logger.Debug(" metadata %v", metadata)
+       if err != nil {
+               a1.Logger.Error("policy instance error : %v", err)
+               policyInstanceStatus.InstanceStatus = "NOT IN EFFECT"
+               return &policyInstanceStatus, err
+       }
+       jsonbody, err := json.Marshal(metadata)
+       if err != nil {
+               a1.Logger.Error("marshal error : %v", err)
+               return &policyInstanceStatus, err
+       }
+
+       if err := json.Unmarshal(jsonbody, &policyInstanceStatus); err != nil {
+               a1.Logger.Error("unmarshal error : %v", err)
+               //this error maps to 503 error but can be mapped to 500: internal error
+               return &policyInstanceStatus, err
+       }
+       if policyInstanceStatus.HasBeenDeleted == false {
+               policyInstanceStatus.InstanceStatus = "IN EFFECT"
+       } else {
+               policyInstanceStatus.InstanceStatus = "NOT IN EFFECT"
+       }
+       return &policyInstanceStatus, nil
+}