Delete Policy Instance API feature.
[ric-plt/a1.git] / a1-go / pkg / resthooks / resthooks.go
index 0c870f6..e0060f1 100644 (file)
@@ -51,6 +51,11 @@ 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")
+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
@@ -372,7 +377,7 @@ func (rh *Resthook) CreatePolicyInstance(policyTypeId models.PolicyTypeID, polic
                }
 
                message := rmr.Message{}
-               rmrMessage, err := message.PolicyMessage(strconv.FormatInt((int64(policyTypeId)), 10), string(policyInstanceID), httpBodyString, operation)
+               rmrMessage, err = message.PolicyMessage(strconv.FormatInt((int64(policyTypeId)), 10), string(policyInstanceID), httpBodyString, operation)
                if err != nil {
                        a1.Logger.Error("error : %v", err)
                        return err
@@ -575,3 +580,104 @@ func (rh *Resthook) GetPolicyInstanceStatus(policyTypeId models.PolicyTypeID, po
        }
        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, err = message.PolicyMessage(strconv.FormatInt((int64(policyTypeId)), 10), string(policyInstanceID), "", "DELETE")
+       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 {
+               //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
+}