-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
sdn_cni_plugin_test.go
158 lines (140 loc) · 4.24 KB
/
sdn_cni_plugin_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// +build linux
package main
import (
"encoding/json"
"fmt"
"net"
"os"
"path/filepath"
"reflect"
"strings"
"testing"
cniskel "github.com/containernetworking/cni/pkg/skel"
cnitypes "github.com/containernetworking/cni/pkg/types"
cni020 "github.com/containernetworking/cni/pkg/types/020"
"github.com/openshift/origin/pkg/sdn/node/cniserver"
utiltesting "k8s.io/client-go/util/testing"
)
var expectedResult cnitypes.Result
var generateError bool
func serverHandleCNI(request *cniserver.PodRequest) ([]byte, error) {
if request.Command == cniserver.CNI_ADD {
return json.Marshal(&expectedResult)
} else if request.Command == cniserver.CNI_DEL {
return nil, nil
}
return nil, fmt.Errorf("unhandled CNI command %v", request.Command)
}
const (
CNI_COMMAND string = "CNI_COMMAND"
CNI_CONTAINERID string = "CNI_CONTAINERID"
CNI_NETNS string = "CNI_NETNS"
CNI_IFNAME string = "CNI_IFNAME"
CNI_ARGS string = "CNI_ARGS"
CNI_PATH string = "CNI_PATH"
)
func skelArgsToEnv(command cniserver.CNICommand, args *cniskel.CmdArgs) {
os.Setenv(CNI_COMMAND, fmt.Sprintf("%v", command))
os.Setenv(CNI_CONTAINERID, args.ContainerID)
os.Setenv(CNI_NETNS, args.Netns)
os.Setenv(CNI_IFNAME, args.IfName)
os.Setenv(CNI_ARGS, args.Args)
os.Setenv(CNI_PATH, args.Path)
}
func clearEnv() {
for _, ev := range []string{CNI_COMMAND, CNI_CONTAINERID, CNI_NETNS, CNI_IFNAME, CNI_ARGS, CNI_PATH} {
os.Unsetenv(ev)
}
}
func TestOpenshiftSdnCNIPlugin(t *testing.T) {
tmpDir, err := utiltesting.MkTmpdir("cniserver")
if err != nil {
t.Fatalf("failed to create temp directory: %v", err)
}
defer os.RemoveAll(tmpDir)
path := filepath.Join(tmpDir, "cni-server.sock")
server := cniserver.NewCNIServer(path)
if err := server.Start(serverHandleCNI); err != nil {
t.Fatalf("error starting CNI server: %v", err)
}
cniPlugin := NewCNIPlugin(path)
expectedIP, expectedNet, _ := net.ParseCIDR("10.0.0.2/24")
expectedResult = &cni020.Result{
IP4: &cni020.IPConfig{
IP: net.IPNet{
IP: expectedIP,
Mask: expectedNet.Mask,
},
},
}
type testcase struct {
name string
skelArgs *cniskel.CmdArgs
reqType cniserver.CNICommand
result cnitypes.Result
errorPrefix string
}
testcases := []testcase{
// Normal ADD request
{
name: "ADD",
reqType: cniserver.CNI_ADD,
skelArgs: &cniskel.CmdArgs{
ContainerID: "adsfadsfasfdasdfasf",
Netns: "/path/to/something",
IfName: "eth0",
Args: "K8S_POD_NAMESPACE=awesome-namespace;K8S_POD_NAME=awesome-name",
Path: "/some/path",
StdinData: []byte("{\"cniVersion\": \"0.1.0\",\"name\": \"openshift-sdn\",\"type\": \"openshift-sdn\"}"),
},
result: expectedResult,
},
// Normal DEL request
{
name: "DEL",
reqType: cniserver.CNI_DEL,
skelArgs: &cniskel.CmdArgs{
ContainerID: "adsfadsfasfdasdfasf",
Netns: "/path/to/something",
IfName: "eth0",
Args: "K8S_POD_NAMESPACE=awesome-namespace;K8S_POD_NAME=awesome-name",
Path: "/some/path",
StdinData: []byte("{\"cniVersion\": \"0.1.0\",\"name\": \"openshift-sdn\",\"type\": \"openshift-sdn\"}"),
},
},
// Missing args
{
name: "NO ARGS",
reqType: cniserver.CNI_ADD,
skelArgs: &cniskel.CmdArgs{
ContainerID: "adsfadsfasfdasdfasf",
Netns: "/path/to/something",
IfName: "eth0",
Path: "/some/path",
StdinData: []byte("{\"cniVersion\": \"0.1.0\",\"name\": \"openshift-sdn\",\"type\": \"openshift-sdn\"}"),
},
errorPrefix: "CNI request failed with status 400: 'invalid CNI_ARG",
},
}
for _, tc := range testcases {
var result cnitypes.Result
var err error
skelArgsToEnv(tc.reqType, tc.skelArgs)
switch tc.reqType {
case cniserver.CNI_ADD:
result, err = cniPlugin.CmdAdd(tc.skelArgs)
case cniserver.CNI_DEL:
err = cniPlugin.CmdDel(tc.skelArgs)
default:
t.Fatalf("[%s] unhandled CNI command type", tc.name)
}
clearEnv()
if tc.errorPrefix == "" {
if tc.result != nil && !reflect.DeepEqual(result, tc.result) {
t.Fatalf("[%s] expected result %v but got %v", tc.name, tc.result, result)
}
} else if !strings.HasPrefix(fmt.Sprintf("%v", err), tc.errorPrefix) {
t.Fatalf("[%s] unexpected error message '%v'", tc.name, err)
}
}
}