github.com/openshift/dpu-operator@v0.0.0-20240502153209-3af840d137c2/dpu-cni/pkgs/cniserver/cniserver_test.go (about) 1 package cniserver_test 2 3 import ( 4 "net" 5 "os" 6 "path/filepath" 7 8 "github.com/containernetworking/cni/pkg/skel" 9 g "github.com/onsi/ginkgo/v2" 10 o "github.com/onsi/gomega" 11 "github.com/openshift/dpu-operator/dpu-cni/pkgs/cni" 12 "github.com/openshift/dpu-operator/dpu-cni/pkgs/cniserver" 13 "github.com/openshift/dpu-operator/dpu-cni/pkgs/cnitypes" 14 15 current "github.com/containernetworking/cni/pkg/types/100" 16 utilwait "k8s.io/apimachinery/pkg/util/wait" 17 utiltesting "k8s.io/client-go/util/testing" 18 ) 19 20 func PrepArgs(cniVersion string, command string) *skel.CmdArgs { 21 cniConfig := "{\"cniVersion\": \"" + cniVersion + "\",\"name\": \"dpucni\",\"type\": \"dpucni\", \"Mac\": \"00:11:22:33:44:55\"}" 22 cmdArgs := &skel.CmdArgs{ 23 ContainerID: "fakecontainerid", 24 Netns: "fakenetns", 25 IfName: "fakeeth0", 26 Args: "", 27 Path: "fakepath", 28 StdinData: []byte(cniConfig), 29 } 30 os.Clearenv() 31 os.Setenv("CNI_COMMAND", command) 32 os.Setenv("CNI_ARGS", "K8S_POD_NAMESPACE=x;K8S_POD_NAME=y;K8S_POD_UID=z") 33 os.Setenv("CNI_CONTAINERID", cmdArgs.ContainerID) 34 os.Setenv("CNI_NETNS", cmdArgs.Netns) 35 os.Setenv("CNI_IFNAME", cmdArgs.IfName) 36 os.Setenv("CNI_PATH", cmdArgs.Path) 37 38 return cmdArgs 39 } 40 41 var _ = g.Describe("Cniserver", func() { 42 var ( 43 tmpDir string 44 plugin *cni.Plugin 45 cniServer *cniserver.Server 46 serverSocketPath string 47 listener net.Listener 48 addHandlerCalled bool 49 delHandlerCalled bool 50 ) 51 52 g.Context("CNI Server APIs", func() { 53 g.BeforeEach(func() { 54 var err error 55 // Create a tmp directory in the test container 56 tmpDir, err = utiltesting.MkTmpdir("cniserver") 57 o.Expect(err).NotTo(o.HaveOccurred()) 58 59 serverSocketPath = filepath.Join(tmpDir, filepath.Base(cnitypes.ServerSocketPath)) 60 addHandlerCalled = false 61 delHandlerCalled = false 62 addHandler := func(request *cnitypes.PodRequest) (*current.Result, error) { 63 result := ¤t.Result{ 64 CNIVersion: request.CNIConf.CNIVersion, 65 } 66 67 addHandlerCalled = true 68 69 return result, nil 70 } 71 72 delHandler := func(request *cnitypes.PodRequest) (*current.Result, error) { 73 result := ¤t.Result{ 74 CNIVersion: request.CNIConf.CNIVersion, 75 } 76 77 delHandlerCalled = true 78 return result, nil 79 } 80 81 cniServer = cniserver.NewCNIServer(addHandler, delHandler, 82 cniserver.WithSocketPath(serverSocketPath)) 83 listener, err = cniServer.Listen() 84 o.Expect(err).NotTo(o.HaveOccurred()) 85 go utilwait.Forever(func() { 86 cniServer.Serve(listener) 87 }, 0) 88 89 plugin = &cni.Plugin{SocketPath: serverSocketPath} 90 }) 91 92 g.AfterEach(func() { 93 listener.Close() 94 os.RemoveAll(tmpDir) 95 }) 96 97 g.Context("CNI Server APIs", func() { 98 g.When("Normal ADD request", func() { 99 cniVersion := "0.4.0" 100 g.It("should call add handler when passing in ADD", func() { 101 addHandlerCalled = false 102 delHandlerCalled = false 103 plugin.PostRequest(PrepArgs(cniVersion, cnitypes.CNIAdd)) 104 o.Expect(addHandlerCalled).To(o.Equal(true)) 105 o.Expect(delHandlerCalled).To(o.Equal(false)) 106 }) 107 g.It("should call add handler when passing in DEL", func() { 108 addHandlerCalled = false 109 delHandlerCalled = false 110 plugin.PostRequest(PrepArgs(cniVersion, cnitypes.CNIDel)) 111 o.Expect(addHandlerCalled).To(o.Equal(false)) 112 o.Expect(delHandlerCalled).To(o.Equal(true)) 113 }) 114 115 }) 116 }) 117 }) 118 })