Files
coredns/plugin/forwardcrd/fakes_test.go
Christian Ang 2e6953c7db Initial implementation of ForwardCRD plugin (#4512)
* Add forwardcrd plugin README.md

Co-authored-by: Aidan Obley <aobley@vmware.com>

Signed-off-by: Christian Ang <angc@vmware.com>

* Create forwardcrd plugin

- Place forwardcrd before forward plugin in plugin list. This will avoid
forward from preventing the forwardcrd plugin from handling any queries
in the case of having a default upstream forwarder in a server block (as
is the case in the default kubernetes Corefile).

Co-authored-by: Aidan Obley <aobley@vmware.com>

Signed-off-by: Christian Ang <angc@vmware.com>

* Add Forward CRD

Signed-off-by: Christian Ang <angc@vmware.com>

* Add NewWithConfig to forward plugin

- allows external packages to instanciate forward plugins

Co-authored-by: Aidan Obley <aobley@vmware.com>

Signed-off-by: Christian Ang <angc@vmware.com>

* ForwardCRD plugin handles requests for Forward CRs

- add a Kubernetes controller that can read Forward CRs
- instances of the forward plugin are created based on Forward CRs from
the Kubernetes controller
- DNS requests are handled by calling matching Forward plugin instances
based on zone name
- Defaults to the kube-system namespace to align with Corefile RBAC

Signed-off-by: Christian Ang <angc@vmware.com>

Use klog v2 in forwardcrd plugin

* Refactor forward setup to use NewWithConfig

Co-authored-by: Christian Ang <angc@vmware.com>

Signed-off-by: Edwin Xie <exie@vmware.com>

* Use ParseInt instead of Atoi

- to ensure that the bitsize is 32 for later casting to uint32

Signed-off-by: Christian Ang <angc@vmware.com>

* Add @christianang to CODEOWNERS for forwardcrd

Signed-off-by: Christian Ang <angc@vmware.com>

Co-authored-by: Edwin Xie <exie@vmware.com>
2021-11-12 11:22:34 -05:00

87 lines
1.9 KiB
Go

package forwardcrd
import (
"context"
"sync"
"github.com/coredns/coredns/plugin/forward"
"github.com/miekg/dns"
)
type TestPluginHandler struct {
mutex sync.Mutex
ReceivedConfig forward.ForwardConfig
onStartupCallCount int
onShutdownCallCount int
}
func (t *TestPluginHandler) ServeDNS(context.Context, dns.ResponseWriter, *dns.Msg) (int, error) {
return 0, nil
}
func (t *TestPluginHandler) Name() string { return "" }
func (t *TestPluginHandler) OnStartup() error {
t.mutex.Lock()
defer t.mutex.Unlock()
t.onStartupCallCount++
return nil
}
func (t *TestPluginHandler) OnShutdown() error {
t.mutex.Lock()
defer t.mutex.Unlock()
t.onShutdownCallCount++
return nil
}
func (t *TestPluginHandler) OnStartupCallCount() int {
t.mutex.Lock()
defer t.mutex.Unlock()
return t.onStartupCallCount
}
func (t *TestPluginHandler) OnShutdownCallCount() int {
t.mutex.Lock()
defer t.mutex.Unlock()
return t.onShutdownCallCount
}
type TestPluginInstancer struct {
mutex sync.Mutex
testPluginHandlers []*TestPluginHandler
}
func (t *TestPluginInstancer) NewWithConfig(config forward.ForwardConfig) (lifecyclePluginHandler, error) {
t.mutex.Lock()
defer t.mutex.Unlock()
testPluginHandler := &TestPluginHandler{
ReceivedConfig: config,
}
t.testPluginHandlers = append(t.testPluginHandlers, testPluginHandler)
return testPluginHandler, nil
}
func (t *TestPluginInstancer) NewWithConfigArgsForCall(index int) *TestPluginHandler {
t.mutex.Lock()
defer t.mutex.Unlock()
return t.testPluginHandlers[index]
}
func (t *TestPluginInstancer) NewWithConfigCallCount() int {
t.mutex.Lock()
defer t.mutex.Unlock()
return len(t.testPluginHandlers)
}
type TestController struct {
}
func (t *TestController) Run(threads int) {}
func (t *TestController) HasSynced() bool { return true }
func (t *TestController) Stop() error { return nil }