pkg/appgw/cleanup.go (129 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 appgw import ( "fmt" "strings" n "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2021-03-01/network" ) // CleanUpPathRulesAddedByAGIC removes path rules that are created by AGIC func (c *appGwConfigBuilder) CleanUpPathRulesAddedByAGIC() { pathRuleNamePrefix := fmt.Sprintf("%s%s-", agPrefix, prefixPathRule) // Remove path rules that are created by AGIC for _, pathMap := range *c.appGw.URLPathMaps { var pathRulesAddedManually []n.ApplicationGatewayPathRule for _, pathRule := range *pathMap.PathRules { if !strings.HasPrefix(*pathRule.Name, pathRuleNamePrefix) { pathRulesAddedManually = append(pathRulesAddedManually, pathRule) } } pathMap.PathRules = &pathRulesAddedManually } } // CleanUpUnusedDefaults removes the default backend and default http settings if they are not used by any ingress func (c *appGwConfigBuilder) CleanUpUnusedDefaults() { if !c.isPoolUsed(DefaultBackendAddressPoolName) { c.removePool(DefaultBackendAddressPoolName) } if !c.isBackendSettingsUsed(DefaultBackendHTTPSettingsName) { c.removeBackendSettings(DefaultBackendHTTPSettingsName) } if !c.isProbeUsed(defaultProbeName(n.ApplicationGatewayProtocolHTTP)) { c.removeProbe(defaultProbeName(n.ApplicationGatewayProtocolHTTP)) } if !c.isProbeUsed(defaultProbeName(n.ApplicationGatewayProtocolHTTPS)) { c.removeProbe(defaultProbeName(n.ApplicationGatewayProtocolHTTPS)) } } func (c *appGwConfigBuilder) isPoolUsed(name string) bool { isDefaultRef := func(ref *n.SubResource) bool { return ref != nil && ref.ID != nil && resourceIDHasResourceName(*ref.ID, name) } for _, i := range *c.appGw.RequestRoutingRules { if isDefaultRef(i.BackendAddressPool) { return true } } for _, i := range *c.appGw.URLPathMaps { if isDefaultRef(i.DefaultBackendAddressPool) { return true } for _, p := range *i.PathRules { if isDefaultRef(p.BackendAddressPool) { return true } } } return false } func (c *appGwConfigBuilder) removePool(name string) { pools := *c.appGw.BackendAddressPools for bIdx, i := range pools { if resourceIDHasResourceName(*i.ID, name) { pools = append(pools[:bIdx], pools[bIdx+1:]...) break } } c.appGw.BackendAddressPools = &pools } func (c *appGwConfigBuilder) isBackendSettingsUsed(name string) bool { isDefaultRef := func(ref *n.SubResource) bool { return ref != nil && ref.ID != nil && resourceIDHasResourceName(*ref.ID, name) } for _, i := range *c.appGw.RequestRoutingRules { if isDefaultRef(i.BackendHTTPSettings) { return true } } for _, i := range *c.appGw.URLPathMaps { if isDefaultRef(i.DefaultBackendHTTPSettings) { return true } for _, p := range *i.PathRules { if isDefaultRef(p.BackendHTTPSettings) { return true } } } return false } func (c *appGwConfigBuilder) removeBackendSettings(name string) { settings := *c.appGw.BackendHTTPSettingsCollection for bIdx, i := range settings { if resourceIDHasResourceName(*i.ID, name) { settings = append(settings[:bIdx], settings[bIdx+1:]...) break } } c.appGw.BackendHTTPSettingsCollection = &settings } func (c *appGwConfigBuilder) isProbeUsed(name string) bool { isDefaultRef := func(ref *n.SubResource) bool { return ref != nil && ref.ID != nil && resourceIDHasResourceName(*ref.ID, name) } for _, i := range *c.appGw.BackendHTTPSettingsCollection { if isDefaultRef(i.Probe) { return true } } return false } func (c *appGwConfigBuilder) removeProbe(name string) { probes := *c.appGw.Probes for bIdx, i := range probes { if resourceIDHasResourceName(*i.ID, name) { probes = append(probes[:bIdx], probes[bIdx+1:]...) break } } c.appGw.Probes = &probes } func resourceIDHasResourceName(resourceID string, resourceNameToMatch string) bool { splits := strings.Split(resourceID, "/") if len(splits) == 0 { return false } resourceName := splits[len(splits)-1] return strings.EqualFold(resourceName, resourceNameToMatch) }