mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	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>
This commit is contained in:
		
							
								
								
									
										86
									
								
								plugin/forwardcrd/fakes_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								plugin/forwardcrd/fakes_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| 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 } | ||||
		Reference in New Issue
	
	Block a user