update corefile-migration library to 1.0.6

This commit is contained in:
Sandeep Rajan 2020-02-24 14:59:13 -05:00
parent a980cb7ead
commit cb12e8a059
8 changed files with 893 additions and 1509 deletions

4
go.mod
View File

@ -37,7 +37,7 @@ require (
github.com/containerd/containerd v1.0.2 // indirect
github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20 // indirect
github.com/containernetworking/cni v0.7.1
github.com/coredns/corefile-migration v1.0.4
github.com/coredns/corefile-migration v1.0.6
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e
github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea
github.com/cpuguy83/go-md2man v1.0.10
@ -232,7 +232,7 @@ replace (
github.com/containerd/containerd => github.com/containerd/containerd v1.0.2
github.com/containerd/typeurl => github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20
github.com/containernetworking/cni => github.com/containernetworking/cni v0.7.1
github.com/coredns/corefile-migration => github.com/coredns/corefile-migration v1.0.4
github.com/coredns/corefile-migration => github.com/coredns/corefile-migration v1.0.6
github.com/coreos/etcd => github.com/coreos/etcd v3.3.10+incompatible
github.com/coreos/go-etcd => github.com/coreos/go-etcd v2.0.0+incompatible
github.com/coreos/go-oidc => github.com/coreos/go-oidc v2.1.0+incompatible

4
go.sum
View File

@ -106,8 +106,8 @@ github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20 h1:14r0i3IeJj6z
github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
github.com/containernetworking/cni v0.7.1 h1:fE3r16wpSEyaqY4Z4oFrLMmIGfBYIKpPrHK31EJ9FzE=
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
github.com/coredns/corefile-migration v1.0.4 h1:GpAwsgzgLA9HOnt3+Z69xsMVLl0doNnyVfBX79d/P5A=
github.com/coredns/corefile-migration v1.0.4/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E=
github.com/coredns/corefile-migration v1.0.6 h1:hB6vclp2g/KeXe9n1oz/PafgieUahsOYeHMQA+RJ4Hg=
github.com/coredns/corefile-migration v1.0.6/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E=
github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=

View File

@ -5,6 +5,7 @@ go_library(
srcs = [
"migrate.go",
"notice.go",
"plugins.go",
"versions.go",
],
importmap = "k8s.io/kubernetes/vendor/github.com/coredns/corefile-migration/migration",

View File

@ -152,7 +152,7 @@ NextPlugin:
}
func (o *Option) FindMatch(def []*Option) (*Option, bool) {
NextPlugin:
NextOption:
for _, oDef := range def {
if oDef.Name != o.Name {
continue
@ -165,7 +165,7 @@ NextPlugin:
return oDef, true
}
if i >= len(o.Args) || arg != o.Args[i] {
continue NextPlugin
continue NextOption
}
}
if len(oDef.Args) != len(o.Args) {

View File

@ -7,6 +7,7 @@ package migration
import (
"fmt"
"regexp"
"sort"
"github.com/coredns/corefile-migration/migration/corefile"
@ -43,17 +44,14 @@ func getStatus(fromCoreDNSVersion, toCoreDNSVersion, corefileStr, status string)
for _, s := range cf.Servers {
for _, p := range s.Plugins {
vp, present := Versions[v].plugins[p.Name]
if status == unsupported {
if present {
continue
}
if status == unsupported && !present {
notices = append(notices, Notice{Plugin: p.Name, Severity: status, Version: v})
continue
}
if !present {
continue
}
if vp.status != "" && vp.status != newdefault {
if vp.status != "" && vp.status != newdefault && status != unsupported {
notices = append(notices, Notice{
Plugin: p.Name,
Severity: vp.status,
@ -64,18 +62,16 @@ func getStatus(fromCoreDNSVersion, toCoreDNSVersion, corefileStr, status string)
continue
}
for _, o := range p.Options {
vo, present := Versions[v].plugins[p.Name].options[o.Name]
vo, present := matchOption(o.Name, Versions[v].plugins[p.Name])
if status == unsupported {
if present {
continue
}
notices = append(notices, Notice{
Plugin: p.Name,
Option: o.Name,
Severity: status,
Version: v,
ReplacedBy: vo.replacedBy,
Additional: vo.additional,
Plugin: p.Name,
Option: o.Name,
Severity: status,
Version: v,
})
continue
}
@ -89,7 +85,7 @@ func getStatus(fromCoreDNSVersion, toCoreDNSVersion, corefileStr, status string)
}
if status != unsupported {
CheckForNewOptions:
for name, vo := range Versions[v].plugins[p.Name].options {
for name, vo := range Versions[v].plugins[p.Name].namedOptions {
if vo.status != newdefault {
continue
}
@ -156,19 +152,9 @@ func Migrate(fromCoreDNSVersion, toCoreDNSVersion, corefileStr string, deprecati
newPlugs = append(newPlugs, p)
continue
}
if vp.action != nil {
p, err := vp.action(p)
if err != nil {
return "", err
}
if p == nil {
// remove plugin, skip options processing
continue
}
}
newOpts := []*corefile.Option{}
for _, o := range p.Options {
vo, present := Versions[v].plugins[p.Name].options[o.Name]
vo, present := matchOption(o.Name, Versions[v].plugins[p.Name])
if !present {
newOpts = append(newOpts, o)
continue
@ -191,13 +177,23 @@ func Migrate(fromCoreDNSVersion, toCoreDNSVersion, corefileStr string, deprecati
}
newOpts = append(newOpts, o)
}
if vp.action != nil {
p, err := vp.action(p)
if err != nil {
return "", err
}
if p == nil {
// remove plugin, skip options processing
continue
}
}
newPlug := &corefile.Plugin{
Name: p.Name,
Args: p.Args,
Options: newOpts,
}
CheckForNewOptions:
for name, vo := range Versions[v].plugins[p.Name].options {
for name, vo := range Versions[v].plugins[p.Name].namedOptions {
if vo.status != newdefault {
continue
}
@ -294,7 +290,7 @@ func MigrateDown(fromCoreDNSVersion, toCoreDNSVersion, corefileStr string) (stri
newOpts := []*corefile.Option{}
for _, o := range p.Options {
vo, present := Versions[v].plugins[p.Name].options[o.Name]
vo, present := matchOption(o.Name, Versions[v].plugins[p.Name])
if !present {
newOpts = append(newOpts, o)
continue
@ -446,3 +442,22 @@ func validDownMigration(fromCoreDNSVersion, toCoreDNSVersion string) error {
}
return fmt.Errorf("cannot migrate down to '%v' from '%v'", toCoreDNSVersion, fromCoreDNSVersion)
}
func matchOption(oName string, p plugin) (*option, bool) {
o, exists := p.namedOptions[oName]
if exists {
o.name = oName
return &o, exists
}
for pattern, o := range p.patternOptions {
matched, err := regexp.MatchString(pattern, oName)
if err != nil {
continue
}
if matched {
o.name = oName
return &o, true
}
}
return nil, false
}

View File

@ -0,0 +1,499 @@
package migration
import (
"errors"
"github.com/coredns/corefile-migration/migration/corefile"
)
type plugin struct {
status string
replacedBy string
additional string
namedOptions map[string]option
patternOptions map[string]option
action pluginActionFn // action affecting this plugin only
add serverActionFn // action to add a new plugin to the server block
downAction pluginActionFn // downgrade action affecting this plugin only
}
type option struct {
name string
status string
replacedBy string
additional string
action optionActionFn // action affecting this option only
add pluginActionFn // action to add the option to the plugin
downAction optionActionFn // downgrade action affecting this option only
}
type corefileAction func(*corefile.Corefile) (*corefile.Corefile, error)
type serverActionFn func(*corefile.Server) (*corefile.Server, error)
type pluginActionFn func(*corefile.Plugin) (*corefile.Plugin, error)
type optionActionFn func(*corefile.Option) (*corefile.Option, error)
// plugins holds a map of plugin names and their migration rules per "version". "Version" here is meaningless outside
// of the context of this code. Each change in options or migration actions for a plugin requires a new "version"
// containing those new/removed options and migration actions. Plugins in CoreDNS are not versioned.
var plugins = map[string]map[string]plugin{
"kubernetes": {
"v1": plugin{
namedOptions: map[string]option{
"resyncperiod": {},
"endpoint": {},
"tls": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
"v2": plugin{
namedOptions: map[string]option{
"resyncperiod": {},
"endpoint": {},
"tls": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
"kubeconfig": {}, // new option
},
},
"v3": plugin{
namedOptions: map[string]option{
"resyncperiod": {},
"endpoint": { // new deprecation
status: deprecated,
action: useFirstArgumentOnly,
},
"tls": {},
"kubeconfig": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
"v4": plugin{
namedOptions: map[string]option{
"resyncperiod": {},
"endpoint": {
status: ignored,
action: useFirstArgumentOnly,
},
"tls": {},
"kubeconfig": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": { // new deprecation
status: deprecated,
action: removeOption,
},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
"v5": plugin{
namedOptions: map[string]option{
"resyncperiod": { // new deprecation
status: deprecated,
action: removeOption,
},
"endpoint": {
status: ignored,
action: useFirstArgumentOnly,
},
"tls": {},
"kubeconfig": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {
status: ignored,
action: removeOption,
},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
"v6": plugin{
namedOptions: map[string]option{
"resyncperiod": { // new removal
status: removed,
action: removeOption,
},
"endpoint": {
status: ignored,
action: useFirstArgumentOnly,
},
"tls": {},
"kubeconfig": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {
status: ignored,
action: removeOption,
},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
"v7": plugin{
namedOptions: map[string]option{
// resyncperiod removed
"endpoint": {
status: ignored,
action: useFirstArgumentOnly,
},
"tls": {},
"kubeconfig": {},
"namespaces": {},
"labels": {},
"pods": {},
"endpoint_pod_names": {},
"upstream": {
status: ignored,
action: removeOption,
},
"ttl": {},
"noendpoints": {},
"transfer": {},
"fallthrough": {},
"ignore": {},
},
},
},
"errors": {
"v1": plugin{},
"v2": plugin{
namedOptions: map[string]option{
"consolidate": {},
},
},
},
"health": {
"v1": plugin{
namedOptions: map[string]option{
"lameduck": {},
},
},
"v1 add lameduck": plugin{
namedOptions: map[string]option{
"lameduck": {
status: newdefault,
add: func(c *corefile.Plugin) (*corefile.Plugin, error) {
return addOptionToPlugin(c, &corefile.Option{Name: "lameduck 5s"})
},
downAction: removeOption,
},
},
},
},
"hosts": {
"v1": plugin{
namedOptions: map[string]option{
"ttl": {},
"no_reverse": {},
"reload": {},
"fallthrough": {},
},
patternOptions: map[string]option{
`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`: {}, // close enough
`[0-9A-Fa-f]{1,4}:[:0-9A-Fa-f]+:[0-9A-Fa-f]{1,4}`: {}, // less close, but still close enough
},
},
},
"rewrite": {
"v1": plugin{
namedOptions: map[string]option{
"type": {},
"class": {},
"name": {},
"answer name": {},
"edns0": {},
},
},
"v2": plugin{
namedOptions: map[string]option{
"type": {},
"class": {},
"name": {},
"answer name": {},
"edns0": {},
"ttl": {}, // new option
},
},
},
"log": {
"v1": plugin{
namedOptions: map[string]option{
"class": {},
},
},
},
"cache": {
"v1": plugin{
namedOptions: map[string]option{
"success": {},
"denial": {},
"prefetch": {},
},
},
"v2": plugin{
namedOptions: map[string]option{
"success": {},
"denial": {},
"prefetch": {},
"serve_stale": {}, // new option
},
},
},
"forward": {
"v1": plugin{
namedOptions: map[string]option{
"except": {},
"force_tcp": {},
"expire": {},
"max_fails": {},
"tls": {},
"tls_servername": {},
"policy": {},
"health_check": {},
},
},
"v2": plugin{
namedOptions: map[string]option{
"except": {},
"force_tcp": {},
"prefer_udp": {},
"expire": {},
"max_fails": {},
"tls": {},
"tls_servername": {},
"policy": {},
"health_check": {},
},
},
},
"k8s_external": {
"v1": plugin{
namedOptions: map[string]option{
"apex": {},
"ttl": {},
},
},
},
"proxy": {
"v1": plugin{
namedOptions: map[string]option{
"policy": {},
"fail_timeout": {},
"max_fails": {},
"health_check": {},
"except": {},
"spray": {},
"protocol": { // https_google option ignored
status: ignored,
action: proxyRemoveHttpsGoogleProtocol,
},
},
},
"v2": plugin{
namedOptions: map[string]option{
"policy": {},
"fail_timeout": {},
"max_fails": {},
"health_check": {},
"except": {},
"spray": {},
"protocol": { // https_google option removed
status: removed,
action: proxyRemoveHttpsGoogleProtocol,
},
},
},
"deprecation": plugin{ // proxy -> forward deprecation migration
status: deprecated,
replacedBy: "forward",
action: proxyToForwardPluginAction,
namedOptions: proxyToForwardOptionsMigrations,
},
"removal": plugin{ // proxy -> forward forced migration
status: removed,
replacedBy: "forward",
action: proxyToForwardPluginAction,
namedOptions: proxyToForwardOptionsMigrations,
},
},
}
func removePlugin(*corefile.Plugin) (*corefile.Plugin, error) { return nil, nil }
func removeOption(*corefile.Option) (*corefile.Option, error) { return nil, nil }
func renamePlugin(p *corefile.Plugin, to string) (*corefile.Plugin, error) {
p.Name = to
return p, nil
}
func addToServerBlockWithPlugins(sb *corefile.Server, newPlugin *corefile.Plugin, with []string) (*corefile.Server, error) {
if len(with) == 0 {
// add to all blocks
sb.Plugins = append(sb.Plugins, newPlugin)
return sb, nil
}
for _, p := range sb.Plugins {
for _, w := range with {
if w == p.Name {
// add to this block
sb.Plugins = append(sb.Plugins, newPlugin)
return sb, nil
}
}
}
return sb, nil
}
func addToKubernetesServerBlocks(sb *corefile.Server, newPlugin *corefile.Plugin) (*corefile.Server, error) {
return addToServerBlockWithPlugins(sb, newPlugin, []string{"kubernetes"})
}
func addToForwardingServerBlocks(sb *corefile.Server, newPlugin *corefile.Plugin) (*corefile.Server, error) {
return addToServerBlockWithPlugins(sb, newPlugin, []string{"forward", "proxy"})
}
func addToAllServerBlocks(sb *corefile.Server, newPlugin *corefile.Plugin) (*corefile.Server, error) {
return addToServerBlockWithPlugins(sb, newPlugin, []string{})
}
func addOptionToPlugin(pl *corefile.Plugin, newOption *corefile.Option) (*corefile.Plugin, error) {
pl.Options = append(pl.Options, newOption)
return pl, nil
}
var proxyToForwardOptionsMigrations = map[string]option{
"policy": {
action: func(o *corefile.Option) (*corefile.Option, error) {
if len(o.Args) == 1 && o.Args[0] == "least_conn" {
o.Name = "force_tcp"
o.Args = nil
}
return o, nil
},
},
"except": {},
"fail_timeout": {action: removeOption},
"max_fails": {action: removeOption},
"health_check": {action: removeOption},
"spray": {action: removeOption},
"protocol": {
action: func(o *corefile.Option) (*corefile.Option, error) {
if len(o.Args) >= 2 && o.Args[0] == "force_tcp" {
o.Name = "force_tcp"
o.Args = nil
return o, nil
}
return nil, nil
},
},
}
var proxyToForwardPluginAction = func(p *corefile.Plugin) (*corefile.Plugin, error) {
return renamePlugin(p, "forward")
}
var useFirstArgumentOnly = func(o *corefile.Option) (*corefile.Option, error) {
if len(o.Args) < 1 {
return o, nil
}
o.Args = o.Args[:1]
return o, nil
}
var proxyRemoveHttpsGoogleProtocol = func(o *corefile.Option) (*corefile.Option, error) {
if len(o.Args) > 0 && o.Args[0] == "https_google" {
return nil, nil
}
return o, nil
}
func breakForwardStubDomainsIntoServerBlocks(cf *corefile.Corefile) (*corefile.Corefile, error) {
for _, sb := range cf.Servers {
for j, fwd := range sb.Plugins {
if fwd.Name != "forward" {
continue
}
if len(fwd.Args) == 0 {
return nil, errors.New("found invalid forward plugin declaration")
}
if fwd.Args[0] == "." {
// dont move the default upstream
continue
}
if len(sb.DomPorts) != 1 {
return cf, errors.New("unhandled migration of multi-domain/port server block")
}
if sb.DomPorts[0] != "." && sb.DomPorts[0] != ".:53" {
return cf, errors.New("unhandled migration of non-default domain/port server block")
}
newSb := &corefile.Server{} // create a new server block
newSb.DomPorts = []string{fwd.Args[0]} // copy the forward zone to the server block domain
fwd.Args[0] = "." // the plugin's zone changes to "." for brevity
newSb.Plugins = append(newSb.Plugins, fwd) // add the plugin to its new server block
// Add appropriate addtl plugins to new server block
newSb.Plugins = append(newSb.Plugins, &corefile.Plugin{Name: "loop"})
newSb.Plugins = append(newSb.Plugins, &corefile.Plugin{Name: "errors"})
newSb.Plugins = append(newSb.Plugins, &corefile.Plugin{Name: "cache", Args: []string{"30"}})
//add new server block to corefile
cf.Servers = append(cf.Servers, newSb)
//remove the forward plugin from the original server block
sb.Plugins = append(sb.Plugins[:j], sb.Plugins[j+1:]...)
}
}
return cf, nil
}

File diff suppressed because it is too large Load Diff

2
vendor/modules.txt vendored
View File

@ -186,7 +186,7 @@ github.com/containernetworking/cni/pkg/types
github.com/containernetworking/cni/pkg/types/020
github.com/containernetworking/cni/pkg/types/current
github.com/containernetworking/cni/pkg/version
# github.com/coredns/corefile-migration v1.0.4 => github.com/coredns/corefile-migration v1.0.4
# github.com/coredns/corefile-migration v1.0.6 => github.com/coredns/corefile-migration v1.0.6
github.com/coredns/corefile-migration/migration
github.com/coredns/corefile-migration/migration/corefile
# github.com/coreos/go-oidc v2.1.0+incompatible => github.com/coreos/go-oidc v2.1.0+incompatible