mw/kubernetes: remove subzones (#878)
Only use was in k8s middleware; no tests other than subzone_test.go existed; not exercised: remove.
This commit is contained in:
parent
4d0dae8deb
commit
10681c6bf0
3 changed files with 7 additions and 85 deletions
|
@ -68,13 +68,15 @@ func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) {
|
||||||
if c.Val() == "kubernetes" {
|
if c.Val() == "kubernetes" {
|
||||||
zones := c.RemainingArgs()
|
zones := c.RemainingArgs()
|
||||||
|
|
||||||
if len(zones) == 0 {
|
if len(zones) != 0 {
|
||||||
k8s.Zones = make([]string, len(c.ServerBlockKeys))
|
k8s.Zones = zones
|
||||||
copy(k8s.Zones, c.ServerBlockKeys)
|
|
||||||
}
|
|
||||||
|
|
||||||
k8s.Zones = NormalizeZoneList(zones)
|
|
||||||
middleware.Zones(k8s.Zones).Normalize()
|
middleware.Zones(k8s.Zones).Normalize()
|
||||||
|
} else {
|
||||||
|
k8s.Zones = make([]string, len(c.ServerBlockKeys))
|
||||||
|
for i := 0; i < len(c.ServerBlockKeys); i++ {
|
||||||
|
k8s.Zones[i] = middleware.Host(c.ServerBlockKeys[i]).Normalize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if k8s.Zones == nil || len(k8s.Zones) < 1 {
|
if k8s.Zones == nil || len(k8s.Zones) < 1 {
|
||||||
return nil, errors.New("zone name must be provided for kubernetes middleware")
|
return nil, errors.New("zone name must be provided for kubernetes middleware")
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
package kubernetes
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NormalizeZoneList filters the zones argument to remove
|
|
||||||
// array items that conflict with other items in zones.
|
|
||||||
// For example, providing the following zones array:
|
|
||||||
// [ "a.b.c", "b.c", "a", "e.d.f", "a.b" ]
|
|
||||||
// Returns:
|
|
||||||
// [ "a.b.c", "a", "e.d.f", "a.b" ]
|
|
||||||
// Zones filted out:
|
|
||||||
// - "b.c" because "a.b.c" and "b.c" share the common top
|
|
||||||
// level "b.c". First listed zone wins if there is a conflict.
|
|
||||||
//
|
|
||||||
// Note: This may prove to be too restrictive in practice.
|
|
||||||
// Need to find counter-example use-cases.
|
|
||||||
func NormalizeZoneList(zones []string) []string {
|
|
||||||
filteredZones := []string{}
|
|
||||||
|
|
||||||
for _, z := range zones {
|
|
||||||
zoneConflict, _ := subzoneConflict(filteredZones, z)
|
|
||||||
if zoneConflict {
|
|
||||||
log.Printf("[WARN] new zone '%v' from Corefile conflicts with existing zones: %v\n Ignoring zone '%v'\n", z, filteredZones, z)
|
|
||||||
} else {
|
|
||||||
filteredZones = append(filteredZones, z)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return filteredZones
|
|
||||||
}
|
|
||||||
|
|
||||||
// subzoneConflict returns true if name is a child or parent zone of
|
|
||||||
// any element in zones. If conflicts exist, return the conflicting zones.
|
|
||||||
func subzoneConflict(zones []string, name string) (bool, []string) {
|
|
||||||
conflicts := []string{}
|
|
||||||
|
|
||||||
for _, z := range zones {
|
|
||||||
if dns.IsSubDomain(z, name) || dns.IsSubDomain(name, z) {
|
|
||||||
conflicts = append(conflicts, z)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (len(conflicts) != 0), conflicts
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package kubernetes
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
// List of configured zones to test against
|
|
||||||
var confZones = []string{
|
|
||||||
"a.b.c",
|
|
||||||
"d",
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map of zonename :: expected boolean result
|
|
||||||
var examplesSubzoneConflict = map[string]bool{
|
|
||||||
"a.b.c": true, // conflicts with zone "a.b.c"
|
|
||||||
"b.c": true, // conflicts with zone "a.b.c"
|
|
||||||
"c": true, // conflicts with zone "a.b.c"
|
|
||||||
"e": false, // no conflict
|
|
||||||
"a.b.c.e": false, // no conflict
|
|
||||||
"a.b.c.d": true, // conflicts with zone "d"
|
|
||||||
"": false,
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSubzoneConflict(t *testing.T) {
|
|
||||||
for z, expected := range examplesSubzoneConflict {
|
|
||||||
actual, conflicts := subzoneConflict(confZones, z)
|
|
||||||
|
|
||||||
if actual != expected {
|
|
||||||
t.Errorf("Expected conflict result '%v' for example '%v'. Instead got '%v'. Conflicting zones are: %v", expected, z, actual, conflicts)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue