diff --git a/doc/configuration.md b/doc/configuration.md index 5bf3eaa8b..bcc5a91f8 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -53,7 +53,7 @@ User should chose following parameters combination (`clusterNetwork`+`defaultNet Multus will find network for clusterNetwork/defaultNetworks as following sequences: -1. CRD object for given network name +1. CRD object for given network name, in 'default' namespace 1. CNI json config file in `confDir`. Given name should be without extention, like .conf/.conflist. (e.g. "test" for "test.conf") 1. Directory for CNI json config file. Multus will find alphabetically first file for the network 1. Multus failed to find network. Multus raise error message diff --git a/k8sclient/k8sclient.go b/k8sclient/k8sclient.go index 9080f00b5..d2dde5f7e 100644 --- a/k8sclient/k8sclient.go +++ b/k8sclient/k8sclient.go @@ -621,13 +621,15 @@ func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient delegate.MasterPlugin = true delegates = append(delegates, delegate) - //need to revisit - for _, netname := range conf.DefaultNetworks { - delegate, err := getNetDelegate(kubeClient, netname, conf.ConfDir) - if err != nil { - return err + // Pod in kube-system namespace does not have default network for now. + if string(k8sArgs.K8S_POD_NAMESPACE) != "kube-system" { + for _, netname := range conf.DefaultNetworks { + delegate, err := getNetDelegate(kubeClient, netname, conf.ConfDir) + if err != nil { + return err + } + delegates = append(delegates, delegate) } - delegates = append(delegates, delegate) } if err = conf.AddDelegates(delegates); err != nil { diff --git a/k8sclient/k8sclient_test.go b/k8sclient/k8sclient_test.go index 24e20a673..153eb9d9a 100644 --- a/k8sclient/k8sclient_test.go +++ b/k8sclient/k8sclient_test.go @@ -308,6 +308,74 @@ var _ = Describe("k8sclient operations", func() { Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) }) + It("retrieves default networks from CRD", func() { + fakePod := testutils.NewFakePod("testpod", "", "") + conf := `{ + "name":"node-cni-network", + "type":"multus", + "clusterNetwork": "myCRD1", + "defaultNetworks": ["myCRD2"], + "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() + fKubeClient.AddPod(fakePod) + fKubeClient.AddNetConfig("default", "myCRD1", "{\"type\": \"mynet\"}") + fKubeClient.AddNetConfig("default", "myCRD2", "{\"type\": \"mynet2\"}") + 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(2)) + Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) + Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) + Expect(netConf.Delegates[1].Conf.Name).To(Equal("myCRD2")) + Expect(netConf.Delegates[1].Conf.Type).To(Equal("mynet2")) + }) + + It("ignore default networks from CRD in case of kube-system namespace", func() { + fakePod := testutils.NewFakePod("testpod", "", "") + // overwrite namespace + fakePod.ObjectMeta.Namespace = "kube-system" + conf := `{ + "name":"node-cni-network", + "type":"multus", + "clusterNetwork": "myCRD1", + "defaultNetworks": ["myCRD2"], + "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() + fKubeClient.AddPod(fakePod) + fKubeClient.AddNetConfig("default", "myCRD1", "{\"type\": \"mynet\"}") + fKubeClient.AddNetConfig("default", "myCRD2", "{\"type\": \"mynet2\"}") + 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("myCRD1")) + Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet")) + }) + It("retrieves cluster network from file", func() { fakePod := testutils.NewFakePod("testpod", "", "") conf := `{