in pilot/pkg/networking/core/v1alpha3/envoyfilter/listener_patch.go [244:346]
func patchNetworkFilters(patchContext networking.EnvoyFilter_PatchContext,
patches map[networking.EnvoyFilter_ApplyTo][]*model.EnvoyFilterConfigPatchWrapper,
listener *xdslistener.Listener, fc *xdslistener.FilterChain) {
for _, lp := range patches[networking.EnvoyFilter_NETWORK_FILTER] {
if !commonConditionMatch(patchContext, lp) ||
!listenerMatch(listener, lp) ||
!filterChainMatch(listener, fc, lp) {
IncrementEnvoyFilterMetric(lp.Key(), NetworkFilter, false)
continue
}
applied := false
if lp.Operation == networking.EnvoyFilter_Patch_ADD {
fc.Filters = append(fc.Filters, proto.Clone(lp.Value).(*xdslistener.Filter))
applied = true
} else if lp.Operation == networking.EnvoyFilter_Patch_INSERT_FIRST {
fc.Filters = append([]*xdslistener.Filter{proto.Clone(lp.Value).(*xdslistener.Filter)}, fc.Filters...)
applied = true
} else if lp.Operation == networking.EnvoyFilter_Patch_INSERT_AFTER {
// Insert after without a filter match is same as ADD in the end
if !hasNetworkFilterMatch(lp) {
fc.Filters = append(fc.Filters, proto.Clone(lp.Value).(*xdslistener.Filter))
continue
}
// find the matching filter first
insertPosition := -1
for i := 0; i < len(fc.Filters); i++ {
if networkFilterMatch(fc.Filters[i], lp) {
insertPosition = i + 1
break
}
}
if insertPosition == -1 {
continue
}
applied = true
clonedVal := proto.Clone(lp.Value).(*xdslistener.Filter)
fc.Filters = append(fc.Filters, clonedVal)
if insertPosition < len(fc.Filters)-1 {
copy(fc.Filters[insertPosition+1:], fc.Filters[insertPosition:])
fc.Filters[insertPosition] = clonedVal
}
} else if lp.Operation == networking.EnvoyFilter_Patch_INSERT_BEFORE {
// insert before without a filter match is same as insert in the beginning
if !hasNetworkFilterMatch(lp) {
fc.Filters = append([]*xdslistener.Filter{proto.Clone(lp.Value).(*xdslistener.Filter)}, fc.Filters...)
continue
}
// find the matching filter first
insertPosition := -1
for i := 0; i < len(fc.Filters); i++ {
if networkFilterMatch(fc.Filters[i], lp) {
insertPosition = i
break
}
}
// If matching filter is not found, then don't insert and continue.
if insertPosition == -1 {
continue
}
applied = true
clonedVal := proto.Clone(lp.Value).(*xdslistener.Filter)
fc.Filters = append(fc.Filters, clonedVal)
copy(fc.Filters[insertPosition+1:], fc.Filters[insertPosition:])
fc.Filters[insertPosition] = clonedVal
} else if lp.Operation == networking.EnvoyFilter_Patch_REPLACE {
if !hasNetworkFilterMatch(lp) {
continue
}
// find the matching filter first
replacePosition := -1
for i := 0; i < len(fc.Filters); i++ {
if networkFilterMatch(fc.Filters[i], lp) {
replacePosition = i
break
}
}
if replacePosition == -1 {
continue
}
applied = true
fc.Filters[replacePosition] = proto.Clone(lp.Value).(*xdslistener.Filter)
}
IncrementEnvoyFilterMetric(lp.Key(), NetworkFilter, applied)
}
removedFilters := sets.New()
for i, filter := range fc.Filters {
if patchNetworkFilter(patchContext, patches, listener, fc, fc.Filters[i]) {
removedFilters.Insert(filter.Name)
}
}
if len(removedFilters) > 0 {
tempArray := make([]*xdslistener.Filter, 0, len(fc.Filters)-len(removedFilters))
for _, filter := range fc.Filters {
if removedFilters.Contains(filter.Name) {
continue
}
tempArray = append(tempArray, filter)
}
fc.Filters = tempArray
}
}