From 4b231c68551246efd8137940d7b6f5946db10288 Mon Sep 17 00:00:00 2001 From: Tomofumi Hayashi Date: Mon, 15 Oct 2018 16:32:15 +0900 Subject: [PATCH] Add unit tests for clusterNetwork/defaultNetworks --- k8sclient/k8sclient.go | 17 +++--- k8sclient/k8sclient_test.go | 105 ++++++++++++++++++++++++++++++++++-- types/conf.go | 2 +- 3 files changed, 109 insertions(+), 15 deletions(-) diff --git a/k8sclient/k8sclient.go b/k8sclient/k8sclient.go index c5c93c146..09ef4bded 100644 --- a/k8sclient/k8sclient.go +++ b/k8sclient/k8sclient.go @@ -255,7 +255,7 @@ func getCNIConfigFromFile(name string, confdir string) ([]byte, error) { return nil, logging.Errorf("Error loading CNI conflist file %s: %v", confFile, err) } - if confList.Name == name { + if confList.Name == name || name == "" { return confList.Bytes, nil } @@ -265,7 +265,7 @@ func getCNIConfigFromFile(name string, confdir string) ([]byte, error) { return nil, logging.Errorf("Error loading CNI config file %s: %v", confFile, err) } - if conf.Network.Name == name { + if conf.Network.Name == name || name == "" { // Ensure the config has a "type" so we know what plugin to run. // Also catches the case where somebody put a conflist into a conf file. if conf.Network.Type == "" { @@ -523,8 +523,7 @@ func getDefaultNetDelegateCRD(client KubeClient, net string, confdir string) (*t rawPath := fmt.Sprintf("/apis/k8s.cni.cncf.io/v1/namespaces/%s/network-attachment-definitions/%s", "default", net) netData, err := client.GetRawWithPath(rawPath) if err != nil { - logging.Debugf("getDefaultNetDelegate: failed to get network resource, refer Multus README.md for the usage guide: %v", err) - return nil, nil + return nil, logging.Errorf("getDefaultNetDelegate: failed to get network resource, refer Multus README.md for the usage guide: %v", err) } customResource := &types.NetworkAttachmentDefinition{} @@ -569,9 +568,9 @@ func getNetDelegate(client KubeClient, netname string, confdir string) (*types.D if err == nil { if fInfo.IsDir() { files, err := libcni.ConfFiles(netname, []string{".conf", ".conflist"}) - if len(files) > 1 { + if len(files) > 0 { var configBytes []byte - configBytes, err = getCNIConfigFromFile(files[0], netname) + configBytes, err = getCNIConfigFromFile("", netname) if err == nil { delegate, err := types.LoadDelegateNetConf(configBytes, "") if err != nil { @@ -579,6 +578,7 @@ func getNetDelegate(client KubeClient, netname string, confdir string) (*types.D } return delegate, nil } + return nil, err } } } @@ -602,8 +602,6 @@ func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient return nil } - //setKubeClientInfo(clientInfo, kubeClient, k8sArgs) XXX - delegate, err := getNetDelegate(kubeClient, conf.ClusterNetwork, conf.ConfDir) if err != nil { return err @@ -611,9 +609,6 @@ func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient delegate.MasterPlugin = true delegates = append(delegates, delegate) - // First delegate is always the master plugin - conf.Delegates[0].MasterPlugin = true - //need to revisit for _, netname := range conf.DefaultNetworks { delegate, err := getNetDelegate(kubeClient, netname, conf.ConfDir) diff --git a/k8sclient/k8sclient_test.go b/k8sclient/k8sclient_test.go index 335d5d3bc..1adf10803 100644 --- a/k8sclient/k8sclient_test.go +++ b/k8sclient/k8sclient_test.go @@ -24,6 +24,7 @@ import ( testutils "github.com/intel/multus-cni/testing" + "github.com/intel/multus-cni/types" "github.com/containernetworking/cni/pkg/skel" . "github.com/onsi/ginkgo" @@ -278,12 +279,13 @@ var _ = Describe("k8sclient operations", func() { }) It("retrieves cluster network from CRD", func() { + fakePod := testutils.NewFakePod("testpod", "") conf := `{ "name":"node-cni-network", "type":"multus", "clusterNetwork": "myCRD1", "kubeconfig":"/etc/kubernetes/node-kubeconfig.yaml" - }` // XXX: is confDir required? + }` netConf, err := types.LoadNetConf([]byte(conf)) Expect(err).NotTo(HaveOccurred()) @@ -292,13 +294,110 @@ var _ = Describe("k8sclient operations", func() { } fKubeClient := testutils.NewFakeKubeClient() - fKubeClient.AddNetConfig(fakePod.ObjectMeta.Namespace, "myCRD1", "{\"type\": \"mynet\"}") + fKubeClient.AddNetConfig("default", "myCRD1", "{\"type\": \"mynet\"}") kubeClient, err := GetK8sClient("", fKubeClient) Expect(err).NotTo(HaveOccurred()) k8sArgs, err := GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err := GetDefaultNetworks(k8sArgs, netConf, kubeClient) + err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) Expect(err).NotTo(HaveOccurred()) + Expect(len(netConf.Delegates)).To(Equal(1)) + Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) + Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) + }) + + It("retrieves cluster network from file", func() { + fakePod := testutils.NewFakePod("testpod", "") + conf := `{ + "name":"node-cni-network", + "type":"multus", + "clusterNetwork": "myFile1", + "kubeconfig":"/etc/kubernetes/node-kubeconfig.yaml" + }` + netConf, err := types.LoadNetConf([]byte(conf)) + netConf.ConfDir = tmpDir + Expect(err).NotTo(HaveOccurred()) + + args := &skel.CmdArgs{ + Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + } + + fKubeClient := testutils.NewFakeKubeClient() + net1Name := filepath.Join(tmpDir, "10-net1.conf") + fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "net1", net1Name, `{ + "name": "myFile1", + "type": "mynet", + "cniVersion": "0.2.0" +}`) + kubeClient, err := GetK8sClient("", fKubeClient) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) + Expect(err).NotTo(HaveOccurred()) + + err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + Expect(err).NotTo(HaveOccurred()) + Expect(len(netConf.Delegates)).To(Equal(1)) + Expect(netConf.Delegates[0].Conf.Name).To(Equal("myFile1")) + Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) + }) + + It("retrieves cluster network from path", func() { + fakePod := testutils.NewFakePod("testpod", "") + conf := fmt.Sprintf(`{ + "name":"node-cni-network", + "type":"multus", + "clusterNetwork": "%s", + "kubeconfig":"/etc/kubernetes/node-kubeconfig.yaml" + }`, tmpDir) + netConf, err := types.LoadNetConf([]byte(conf)) + Expect(err).NotTo(HaveOccurred()) + + args := &skel.CmdArgs{ + Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + } + + fKubeClient := testutils.NewFakeKubeClient() + net1Name := filepath.Join(tmpDir, "10-net1.conf") + fKubeClient.AddNetFile(fakePod.ObjectMeta.Namespace, "10-net1", net1Name, `{ + "name": "net1", + "type": "mynet", + "cniVersion": "0.2.0" +}`) + kubeClient, err := GetK8sClient("", fKubeClient) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) + Expect(err).NotTo(HaveOccurred()) + + err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + Expect(err).NotTo(HaveOccurred()) + Expect(len(netConf.Delegates)).To(Equal(1)) + Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) + Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) + }) + + It("Error in case of CRD not found", func() { + fakePod := testutils.NewFakePod("testpod", "") + conf := `{ + "name":"node-cni-network", + "type":"multus", + "clusterNetwork": "myCRD1", + "kubeconfig":"/etc/kubernetes/node-kubeconfig.yaml" + }` + netConf, err := types.LoadNetConf([]byte(conf)) + Expect(err).NotTo(HaveOccurred()) + + args := &skel.CmdArgs{ + Args: fmt.Sprintf("K8S_POD_NAME=%s;K8S_POD_NAMESPACE=%s", fakePod.ObjectMeta.Name, fakePod.ObjectMeta.Namespace), + } + + fKubeClient := testutils.NewFakeKubeClient() + kubeClient, err := GetK8sClient("", fKubeClient) + Expect(err).NotTo(HaveOccurred()) + k8sArgs, err := GetK8sArgs(args) + Expect(err).NotTo(HaveOccurred()) + + err = GetDefaultNetworks(k8sArgs, netConf, kubeClient) + Expect(err).To(HaveOccurred()) }) }) diff --git a/types/conf.go b/types/conf.go index 7968a9dbf..2e276d1ae 100644 --- a/types/conf.go +++ b/types/conf.go @@ -206,7 +206,7 @@ func LoadNetConf(bytes []byte) (*NetConf, error) { } // get RawDelegates and put delegates field - if len(netconf.DefaultNetworks) == 0 { + if netconf.ClusterNetwork == "" { // for Delegates if len(netconf.RawDelegates) == 0 { return nil, logging.Errorf("at least one delegate must be specified")