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 := &current.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 := &current.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  })