pkg/brownfield/redirects.go (97 lines of code) (raw):

// ------------------------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // -------------------------------------------------------------------------------------------- package brownfield import ( "strings" n "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2021-03-01/network" "k8s.io/klog/v2" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/utils" ) type redirectName string type redirectsByName map[redirectName]n.ApplicationGatewayRedirectConfiguration // GetBlacklistedRedirects removes the managed redirects from the given list of redirects; resulting in a list of redirects not managed by AGIC. func (er ExistingResources) GetBlacklistedRedirects() ([]n.ApplicationGatewayRedirectConfiguration, []n.ApplicationGatewayRedirectConfiguration) { blacklisted := er.getBlacklistedRedirectsSet() var blacklistedRedirects []n.ApplicationGatewayRedirectConfiguration var nonBlacklistedRedirects []n.ApplicationGatewayRedirectConfiguration for _, redirect := range er.Redirects { if _, isBlacklisted := blacklisted[redirectName(*redirect.Name)]; isBlacklisted { blacklistedRedirects = append(blacklistedRedirects, redirect) klog.V(3).Infof("[brownfield] Redirect %s is blacklisted", *redirect.Name) continue } klog.V(3).Infof("[brownfield] Redirect %s is not blacklisted", *redirect.Name) nonBlacklistedRedirects = append(nonBlacklistedRedirects, redirect) } return blacklistedRedirects, nonBlacklistedRedirects } // LogRedirects emits a few log lines detailing what Redirects are created, blacklisted, and removed from ARM. func LogRedirects(existingBlacklisted []n.ApplicationGatewayRedirectConfiguration, existingNonBlacklisted []n.ApplicationGatewayRedirectConfiguration, managedRedirects []n.ApplicationGatewayRedirectConfiguration) { var garbage []n.ApplicationGatewayRedirectConfiguration blacklistedSet := indexRedirectsByName(existingBlacklisted) managedSet := indexRedirectsByName(managedRedirects) for redirectName, redirect := range indexRedirectsByName(existingNonBlacklisted) { _, existsInBlacklist := blacklistedSet[redirectName] _, existsInNewRedirects := managedSet[redirectName] if !existsInBlacklist && !existsInNewRedirects { garbage = append(garbage, redirect) } } klog.V(3).Info("[brownfield] Redirects AGIC created: ", getRedirectNames(managedRedirects)) klog.V(3).Info("[brownfield] Existing Blacklisted Redirects AGIC will retain: ", getRedirectNames(existingBlacklisted)) klog.V(3).Info("[brownfield] Existing Redirects AGIC will remove: ", getRedirectNames(garbage)) } // MergeRedirects merges list of lists of redirects into a single list, maintaining uniqueness. func MergeRedirects(redirectBuckets ...[]n.ApplicationGatewayRedirectConfiguration) []n.ApplicationGatewayRedirectConfiguration { uniqRedirects := make(redirectsByName) for _, bucket := range redirectBuckets { for _, redirect := range bucket { uniqRedirects[redirectName(*redirect.Name)] = redirect } } var merged []n.ApplicationGatewayRedirectConfiguration for _, redirect := range uniqRedirects { merged = append(merged, redirect) } return merged } func getRedirectNames(redirects []n.ApplicationGatewayRedirectConfiguration) string { var names []string for _, redirect := range redirects { names = append(names, *redirect.Name) } if len(names) == 0 { return "n/a" } return strings.Join(names, ", ") } func indexRedirectsByName(redirects []n.ApplicationGatewayRedirectConfiguration) redirectsByName { indexed := make(redirectsByName) for _, redirect := range redirects { indexed[redirectName(*redirect.Name)] = redirect } return indexed } func (er ExistingResources) getBlacklistedRedirectsSet() map[redirectName]interface{} { blacklistedRoutingRules, _ := er.GetBlacklistedRoutingRules() blacklisted := make(map[redirectName]interface{}) for _, rule := range blacklistedRoutingRules { if rule.RedirectConfiguration != nil && rule.RedirectConfiguration.ID != nil { redirectName := redirectName(utils.GetLastChunkOfSlashed(*rule.RedirectConfiguration.ID)) blacklisted[redirectName] = nil } } blacklistedPathMaps, _ := er.GetBlacklistedPathMaps() for _, pathMap := range blacklistedPathMaps { if pathMap.DefaultRedirectConfiguration != nil && pathMap.DefaultRedirectConfiguration.ID != nil { redirectName := redirectName(utils.GetLastChunkOfSlashed(*pathMap.DefaultRedirectConfiguration.ID)) blacklisted[redirectName] = nil } if pathMap.PathRules == nil { klog.Errorf("PathMap %s does not have PathRules", *pathMap.Name) continue } for _, rule := range *pathMap.PathRules { if rule.RedirectConfiguration != nil && rule.RedirectConfiguration.ID != nil { redirectName := redirectName(utils.GetLastChunkOfSlashed(*rule.RedirectConfiguration.ID)) blacklisted[redirectName] = nil } } } return blacklisted }