// Start the CNI server and start processing requests from it func (m *podManager) Start(socketPath string) error { go m.processCNIRequests() m.cniServer = cniserver.NewCNIServer(socketPath) return m.cniServer.Start(m.handleCNIRequest) }
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 = cnitypes.Result{ IP4: &cnitypes.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) } } }