Modifying fake cni plugin

Signed-off-by: abhi <abhi@docker.com>
This commit is contained in:
abhi
2018-03-14 20:05:46 -07:00
parent 92110e1d74
commit 003bbd4292
5 changed files with 26 additions and 150 deletions

View File

@@ -17,166 +17,33 @@ limitations under the License.
package testing
import (
"fmt"
"math/rand"
"strconv"
"sync"
"time"
"github.com/containernetworking/cni/pkg/types"
"github.com/cri-o/ocicni/pkg/ocicni"
cni "github.com/containerd/go-cni"
)
// CalledDetail is the struct contains called function name and arguments.
type CalledDetail struct {
// Name of the function called.
Name string
// Argument of the function called.
Argument interface{}
}
// FakeCNIPlugin is a fake plugin used for test.
type FakeCNIPlugin struct {
sync.Mutex
called []CalledDetail
errors map[string]error
IPMap map[string]string
}
// getError get error for call
func (f *FakeCNIPlugin) getError(op string) error {
err, ok := f.errors[op]
if ok {
delete(f.errors, op)
return err
}
return nil
}
// InjectError inject error for call
func (f *FakeCNIPlugin) InjectError(fn string, err error) {
f.Lock()
defer f.Unlock()
f.errors[fn] = err
}
// InjectErrors inject errors for calls
func (f *FakeCNIPlugin) InjectErrors(errs map[string]error) {
f.Lock()
defer f.Unlock()
for fn, err := range errs {
f.errors[fn] = err
}
}
// ClearErrors clear errors for call
func (f *FakeCNIPlugin) ClearErrors() {
f.Lock()
defer f.Unlock()
f.errors = make(map[string]error)
}
func (f *FakeCNIPlugin) appendCalled(name string, argument interface{}) {
call := CalledDetail{Name: name, Argument: argument}
f.called = append(f.called, call)
}
// GetCalledNames get names of call
func (f *FakeCNIPlugin) GetCalledNames() []string {
f.Lock()
defer f.Unlock()
names := []string{}
for _, detail := range f.called {
names = append(names, detail.Name)
}
return names
}
// GetCalledDetails get detail of each call.
func (f *FakeCNIPlugin) GetCalledDetails() []CalledDetail {
f.Lock()
defer f.Unlock()
// Copy the list and return.
return append([]CalledDetail{}, f.called...)
}
// SetFakePodNetwork sets the given IP for given arguments.
func (f *FakeCNIPlugin) SetFakePodNetwork(podNetwork ocicni.PodNetwork, ip string) {
f.Lock()
defer f.Unlock()
f.IPMap[podNetwork.NetNS] = ip
}
type FakeCNIPlugin struct{}
// NewFakeCNIPlugin create a FakeCNIPlugin.
func NewFakeCNIPlugin() ocicni.CNIPlugin {
return &FakeCNIPlugin{
errors: make(map[string]error),
IPMap: make(map[string]string),
}
func NewFakeCNIPlugin() *FakeCNIPlugin {
return &FakeCNIPlugin{}
}
// Name return the name of fake CNI plugin.
func (f *FakeCNIPlugin) Name() string {
return "fake-CNI-plugin"
}
// SetUpPod setup the network of PodSandbox.
func (f *FakeCNIPlugin) SetUpPod(podNetwork ocicni.PodNetwork) (types.Result, error) {
f.Lock()
defer f.Unlock()
f.appendCalled("SetUpPod", podNetwork)
if err := f.getError("SetUpPod"); err != nil {
return nil, err
}
f.IPMap[podNetwork.NetNS] = generateIP()
// types.Result is unused.
// Setup setups the network of PodSandbox.
func (f *FakeCNIPlugin) Setup(id, path string, opts ...cni.NamespaceOpts) (*cni.CNIResult, error) {
return nil, nil
}
// TearDownPod teardown the network of PodSandbox.
func (f *FakeCNIPlugin) TearDownPod(podNetwork ocicni.PodNetwork) error {
f.Lock()
defer f.Unlock()
f.appendCalled("TearDownPod", podNetwork)
if err := f.getError("TearDownPod"); err != nil {
return err
}
_, ok := f.IPMap[podNetwork.NetNS]
if !ok {
return fmt.Errorf("failed to find the IP")
}
delete(f.IPMap, podNetwork.NetNS)
// Remove teardown the network of PodSandbox.
func (f *FakeCNIPlugin) Remove(id, path string, opts ...cni.NamespaceOpts) error {
return nil
}
// GetPodNetworkStatus get the status of network.
func (f *FakeCNIPlugin) GetPodNetworkStatus(podNetwork ocicni.PodNetwork) (string, error) {
f.Lock()
defer f.Unlock()
f.appendCalled("GetPodNetworkStatus", podNetwork)
if err := f.getError("GetPodNetworkStatus"); err != nil {
return "", err
}
ip, ok := f.IPMap[podNetwork.NetNS]
if !ok {
return "", fmt.Errorf("failed to find the IP")
}
return ip, nil
}
// Status get the status of the plugin.
func (f *FakeCNIPlugin) Status() error {
f.Lock()
defer f.Unlock()
f.appendCalled("Status", nil)
return f.getError("Status")
return nil
}
func generateIP() string {
rand.Seed(time.Now().Unix())
p1 := strconv.Itoa(rand.Intn(266))
p2 := strconv.Itoa(rand.Intn(266))
p3 := strconv.Itoa(rand.Intn(266))
p4 := strconv.Itoa(rand.Intn(266))
return p1 + "." + p2 + "." + p3 + "." + p4
// Load loads the network config.
func (f *FakeCNIPlugin) Load(opts ...cni.LoadOption) error {
return nil
}