diff --git a/common/Makefile b/common/Makefile index 3d7991d44b..a31f0b978e 100644 --- a/common/Makefile +++ b/common/Makefile @@ -97,7 +97,7 @@ install: test: test-unit .PHONY: test-unit -test-unit: +test-unit: netavark-testplugin go test --tags $(BUILDTAGS) -v ./libimage go test --tags $(BUILDTAGS) -v ./libnetwork/... go test --tags $(BUILDTAGS) -v ./pkg/... diff --git a/common/libnetwork/netavark/netavark_suite_test.go b/common/libnetwork/netavark/netavark_suite_test.go index a5dfce7121..548dd8bb77 100644 --- a/common/libnetwork/netavark/netavark_suite_test.go +++ b/common/libnetwork/netavark/netavark_suite_test.go @@ -40,6 +40,15 @@ func getNetworkInterface(confDir string) (types.ContainerNetwork, error) { }) } +func getNetworkInterfaceWithPlugins(confDir string, pluginDirs []string) (types.ContainerNetwork, error) { + return netavark.NewNetworkInterface(&netavark.InitConfig{ + NetworkConfigDir: confDir, + NetavarkBinary: netavarkBinary, + NetworkRunDir: confDir, + PluginDirs: pluginDirs, + }) +} + // EqualSubnet is a custom GomegaMatcher to match a subnet // This makes sure to not use the 16 bytes ip representation. func EqualSubnet(subnet *net.IPNet) gomegaTypes.GomegaMatcher { diff --git a/common/libnetwork/netavark/plugin_test.go b/common/libnetwork/netavark/plugin_test.go new file mode 100644 index 0000000000..7406ed1af3 --- /dev/null +++ b/common/libnetwork/netavark/plugin_test.go @@ -0,0 +1,106 @@ +//go:build linux +// +build linux + +package netavark_test + +import ( + "bytes" + "os" + "path/filepath" + + "github.com/containers/common/libnetwork/types" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/sirupsen/logrus" +) + +const pluginName = "netavark-testplugin" + +var _ = Describe("Plugins", func() { + var ( + libpodNet types.ContainerNetwork + networkConfDir string + logBuffer bytes.Buffer + ) + + BeforeEach(func() { + var err error + networkConfDir, err = os.MkdirTemp("", "podman_netavark_test") + if err != nil { + Fail("Failed to create tmpdir") + } + logBuffer = bytes.Buffer{} + logrus.SetOutput(&logBuffer) + }) + + JustBeforeEach(func() { + var err error + libpodNet, err = getNetworkInterfaceWithPlugins(networkConfDir, []string{"../../bin"}) + if err != nil { + Fail("Failed to create NewNetworkInterface") + } + }) + + AfterEach(func() { + os.RemoveAll(networkConfDir) + }) + + It("create plugin network", func() { + network := types.Network{Driver: pluginName} + network1, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(BeNil()) + Expect(network1.Name).ToNot(BeEmpty()) + Expect(network1.ID).ToNot(BeEmpty()) + Expect(filepath.Join(networkConfDir, network1.Name+".json")).To(BeARegularFile()) + }) + + It("create plugin network with name", func() { + name := "test123" + network := types.Network{Driver: pluginName, Name: name} + network1, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(BeNil()) + Expect(network1.Name).To(Equal(name)) + Expect(network1.ID).ToNot(BeEmpty()) + Expect(filepath.Join(networkConfDir, network1.Name+".json")).To(BeARegularFile()) + }) + + It("create plugin error", func() { + network := types.Network{ + Driver: pluginName, + Options: map[string]string{"error": "my custom error"}, + } + _, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(Equal("plugin ../../bin/netavark-testplugin failed: netavark (exit code 1): my custom error")) + }) + + It("create plugin change name error", func() { + network := types.Network{ + Driver: pluginName, + Options: map[string]string{"name": "newName"}, + } + _, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(Equal("invalid plugin result: changed network name")) + }) + + It("create plugin change id error", func() { + network := types.Network{ + Driver: pluginName, + Options: map[string]string{"id": "newID"}, + } + _, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(Equal("invalid plugin result: changed network ID")) + }) + + It("create plugin change driver error", func() { + network := types.Network{ + Driver: pluginName, + Options: map[string]string{"driver": "newDriver"}, + } + _, err := libpodNet.NetworkCreate(network, nil) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(Equal("invalid plugin result: changed network driver")) + }) +})