pkg/brownfield/http_settings.go (94 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 settingName string type settingsByName map[settingName]n.ApplicationGatewayBackendHTTPSettings // GetBlacklistedHTTPSettings filters the given list of routing pathMaps to the list pathMaps that AGIC is allowed to manage. // HTTP Setting is blacklisted when it is associated with a Routing Rule that is blacklisted. func (er ExistingResources) GetBlacklistedHTTPSettings() ([]n.ApplicationGatewayBackendHTTPSettings, []n.ApplicationGatewayBackendHTTPSettings) { blacklistedSettingsSet := er.getBlacklistedSettingsSet() var blacklisted []n.ApplicationGatewayBackendHTTPSettings var nonBlacklisted []n.ApplicationGatewayBackendHTTPSettings for _, setting := range er.HTTPSettings { if _, isBlacklisted := blacklistedSettingsSet[settingName(*setting.Name)]; isBlacklisted { blacklisted = append(blacklisted, setting) klog.V(3).Infof("HTTP Setting %s is blacklisted", *setting.Name) continue } klog.V(3).Infof("HTTP Setting %s is NOT blacklisted", *setting.Name) nonBlacklisted = append(nonBlacklisted, setting) } return blacklisted, nonBlacklisted } // MergeHTTPSettings merges list of lists of HTTP Settings into a single list, maintaining uniqueness. func MergeHTTPSettings(settingBuckets ...[]n.ApplicationGatewayBackendHTTPSettings) []n.ApplicationGatewayBackendHTTPSettings { uniq := make(map[string]n.ApplicationGatewayBackendHTTPSettings) for _, bucket := range settingBuckets { for _, setting := range bucket { uniq[*setting.Name] = setting } } var merged []n.ApplicationGatewayBackendHTTPSettings for _, setting := range uniq { merged = append(merged, setting) } return merged } // LogHTTPSettings emits a few log lines detailing what settings are created, blacklisted, and removed from ARM. func LogHTTPSettings(logger Logger, existingBlacklisted []n.ApplicationGatewayBackendHTTPSettings, existingNonBlacklisted []n.ApplicationGatewayBackendHTTPSettings, managedSettings []n.ApplicationGatewayBackendHTTPSettings) { var garbage []n.ApplicationGatewayBackendHTTPSettings blacklistedSet := indexSettingsByName(existingBlacklisted) managedSet := indexSettingsByName(managedSettings) for settingName, setting := range indexSettingsByName(existingNonBlacklisted) { _, existsInBlacklist := blacklistedSet[settingName] _, existsInNewSettings := managedSet[settingName] if !existsInBlacklist && !existsInNewSettings { garbage = append(garbage, setting) } } logger.Info("[brownfield] HTTP Settings AGIC created: ", getSettingNames(managedSettings)) logger.Info("[brownfield] Existing Blacklisted HTTP Settings AGIC will retain: ", getSettingNames(existingBlacklisted)) logger.Info("[brownfield] Existing HTTP Settings AGIC will remove: ", getSettingNames(garbage)) } func indexSettingsByName(settings []n.ApplicationGatewayBackendHTTPSettings) settingsByName { settingsByName := make(settingsByName) for _, setting := range settings { settingsByName[settingName(*setting.Name)] = setting } return settingsByName } func getSettingNames(settings []n.ApplicationGatewayBackendHTTPSettings) string { var names []string for _, setting := range settings { names = append(names, *setting.Name) } return strings.Join(names, ", ") } func (er ExistingResources) getBlacklistedSettingsSet() map[settingName]interface{} { blacklistedRoutingRules, _ := er.GetBlacklistedRoutingRules() blacklistedSettingsSet := make(map[settingName]interface{}) for _, rule := range blacklistedRoutingRules { if rule.BackendHTTPSettings != nil && rule.BackendHTTPSettings.ID != nil { settingName := settingName(utils.GetLastChunkOfSlashed(*rule.BackendHTTPSettings.ID)) blacklistedSettingsSet[settingName] = nil } } blacklistedPathMaps, _ := er.GetBlacklistedPathMaps() for _, pathMap := range blacklistedPathMaps { if pathMap.DefaultBackendAddressPool != nil && pathMap.DefaultBackendAddressPool.ID != nil { settingName := settingName(utils.GetLastChunkOfSlashed(*pathMap.DefaultBackendHTTPSettings.ID)) blacklistedSettingsSet[settingName] = nil } if pathMap.PathRules == nil { klog.Errorf("PathMap %s does not have PathRules", *pathMap.Name) continue } for _, rule := range *pathMap.PathRules { if rule.BackendAddressPool != nil && rule.BackendAddressPool.ID != nil { settingName := settingName(utils.GetLastChunkOfSlashed(*rule.BackendHTTPSettings.ID)) blacklistedSettingsSet[settingName] = nil } } } return blacklistedSettingsSet }