fix: unlnk deleted networks and tags from enrollment keys (#3328)

This commit is contained in:
Aceix 2025-02-24 05:22:18 +00:00 committed by GitHub
parent f46030e40f
commit 2fcdd865c8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 58 additions and 1 deletions

View file

@ -464,6 +464,7 @@ func deleteNetwork(w http.ResponseWriter, r *http.Request) {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, errtype))
return
}
go logic.UnlinkNetworkAndTagsFromEnrollmentKeys(network, true)
go logic.DeleteNetworkRoles(network)
go logic.DeleteDefaultNetworkPolicies(models.NetworkID(network))
//delete network from allocated ip map

View file

@ -5,6 +5,7 @@ import (
"encoding/json"
"errors"
"fmt"
"strings"
"sync"
"time"
@ -120,7 +121,6 @@ func UpdateEnrollmentKey(keyId string, relayId uuid.UUID, groups []models.TagID)
}
// GetAllEnrollmentKeys - fetches all enrollment keys from DB
// TODO drop double pointer
func GetAllEnrollmentKeys() ([]models.EnrollmentKey, error) {
currentKeys, err := getEnrollmentKeysMap()
if err != nil {
@ -335,3 +335,59 @@ func RemoveTagFromEnrollmentKeys(deletedTagID models.TagID) {
}
}
func UnlinkNetworkAndTagsFromEnrollmentKeys(network string, delete bool) error {
keys, err := GetAllEnrollmentKeys()
if err != nil {
return fmt.Errorf("failed to retrieve keys: %w", err)
}
var errs []error
for _, key := range keys {
newNetworks := []string{}
newTags := []models.TagID{}
update := false
// Check and update networks
for _, net := range key.Networks {
if net == network {
update = true
continue
}
newNetworks = append(newNetworks, net)
}
// Check and update tags
for _, tag := range key.Groups {
tagParts := strings.Split(tag.String(), ".")
if len(tagParts) == 0 {
continue
}
tagNetwork := tagParts[0]
if tagNetwork == network {
update = true
continue
}
newTags = append(newTags, tag)
}
if update && len(newNetworks) == 0 && delete {
if err := DeleteEnrollmentKey(key.Value, true); err != nil {
errs = append(errs, fmt.Errorf("failed to delete key %s: %w", key.Value, err))
}
continue
}
if update {
key.Networks = newNetworks
key.Groups = newTags
if err := upsertEnrollmentKey(&key); err != nil {
errs = append(errs, fmt.Errorf("failed to update key %s: %w", key.Value, err))
}
}
}
if len(errs) > 0 {
return fmt.Errorf("errors unlinking network/tags from keys: %v", errs)
}
return nil
}