diff --git a/controllers/tags.go b/controllers/tags.go index 633dab96..f494d7b0 100644 --- a/controllers/tags.go +++ b/controllers/tags.go @@ -216,6 +216,11 @@ func deleteTag(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) return } + // check if active policy is using the tag + if logic.CheckIfTagAsActivePolicy(tag.ID, tag.Network) { + logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("tag is currently in use by an active policy"), "badrequest")) + return + } err = logic.DeleteTag(models.TagID(tagID), true) if err != nil { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) diff --git a/logic/acls.go b/logic/acls.go index 334e6f16..8863ce86 100644 --- a/logic/acls.go +++ b/logic/acls.go @@ -621,6 +621,25 @@ func UpdateDeviceTag(OldID, newID models.TagID, netID models.NetworkID) { } } +func CheckIfTagAsActivePolicy(tagID models.TagID, netID models.NetworkID) bool { + acls := listDevicePolicies(netID) + for _, acl := range acls { + for _, srcTagI := range acl.Src { + if srcTagI.ID == models.DeviceAclID { + if tagID.String() == srcTagI.Value { + return true + } + } + } + for _, dstTagI := range acl.Dst { + if dstTagI.ID == models.DeviceAclID { + return true + } + } + } + return false +} + // RemoveDeviceTagFromAclPolicies - remove device tag from acl policies func RemoveDeviceTagFromAclPolicies(tagID models.TagID, netID models.NetworkID) error { acls := listDevicePolicies(netID)