diff --git a/k8sclient/k8sclient.go b/k8sclient/k8sclient.go index 48f1c4a3a..586bfe031 100644 --- a/k8sclient/k8sclient.go +++ b/k8sclient/k8sclient.go @@ -301,33 +301,26 @@ func GetK8sArgs(args *skel.CmdArgs) (*types.K8sArgs, error) { // TryLoadPodDelegates attempts to load Kubernetes-defined delegates and add them to the Multus config. // Returns the number of Kubernetes-defined delegates added or an error. -func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, clientInfo *ClientInfo) (int, *v1.Pod, *ClientInfo, error) { +func TryLoadPodDelegates(pod *v1.Pod, conf *types.NetConf, clientInfo *ClientInfo, resourceMap map[string]*types.ResourceInfo) (int, *ClientInfo, error) { var err error - logging.Debugf("TryLoadPodDelegates: %v, %v, %v", k8sArgs, conf, clientInfo) + logging.Debugf("TryLoadPodDelegates: %v, %v, %v", pod, conf, clientInfo) clientInfo, err = GetK8sClient(conf.Kubeconfig, clientInfo) if err != nil { - return 0, nil, nil, err + return 0, nil, err } if clientInfo == nil { if len(conf.Delegates) == 0 { // No available kube client and no delegates, we can't do anything - return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: must have either Kubernetes config or delegates") + return 0, nil, logging.Errorf("TryLoadPodDelegates: must have either Kubernetes config or delegates") } - return 0, nil, nil, nil - } - - // Get the pod info. If cannot get it, we use cached delegates - pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) - if err != nil { - logging.Debugf("TryLoadPodDelegates: Err in loading K8s cluster default network from pod annotation: %v, use cached delegates", err) - return 0, nil, nil, nil + return 0, nil, nil } delegate, err := tryLoadK8sPodDefaultNetwork(clientInfo, pod, conf) if err != nil { - return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: error in loading K8s cluster default network from pod annotation: %v", err) + return 0, nil, logging.Errorf("TryLoadPodDelegates: error in loading K8s cluster default network from pod annotation: %v", err) } if delegate != nil { logging.Debugf("TryLoadPodDelegates: Overwrite the cluster default network with %v from pod annotations", delegate) @@ -337,17 +330,17 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, clientInfo networks, err := GetPodNetwork(pod) if networks != nil { - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, conf.ConfDir, conf.NamespaceIsolation) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, conf.ConfDir, conf.NamespaceIsolation, resourceMap) if err != nil { if _, ok := err.(*NoK8sNetworkError); ok { - return 0, nil, clientInfo, nil + return 0, clientInfo, nil } - return 0, nil, nil, logging.Errorf("TryLoadPodDelegates: error in getting k8s network for pod: %v", err) + return 0, nil, logging.Errorf("TryLoadPodDelegates: error in getting k8s network for pod: %v", err) } if err = conf.AddDelegates(delegates); err != nil { - return 0, nil, nil, err + return 0, nil, err } // Check gatewayRequest is configured in delegates @@ -364,10 +357,10 @@ func TryLoadPodDelegates(k8sArgs *types.K8sArgs, conf *types.NetConf, clientInfo types.CheckGatewayConfig(conf.Delegates) } - return len(delegates), pod, clientInfo, nil + return len(delegates), clientInfo, nil } - return 0, pod, clientInfo, nil + return 0, clientInfo, nil } // GetK8sClient gets client info from kubeconfig @@ -449,12 +442,8 @@ func GetPodNetwork(pod *v1.Pod) ([]*types.NetworkSelectionElement, error) { } // GetNetworkDelegates returns delegatenetconf from net-attach-def annotation in pod -func GetNetworkDelegates(k8sclient *ClientInfo, pod *v1.Pod, networks []*types.NetworkSelectionElement, confdir string, confnamespaceIsolation bool) ([]*types.DelegateNetConf, error) { - logging.Debugf("GetNetworkDelegates: %v, %v, %v, %v, %v", k8sclient, pod, networks, confdir, confnamespaceIsolation) - // resourceMap holds Pod device allocation information; only initizized if CRD contains 'resourceName' annotation. - // This will only be initialized once and all delegate objects can reference this to look up device info. - var resourceMap map[string]*types.ResourceInfo - +func GetNetworkDelegates(k8sclient *ClientInfo, pod *v1.Pod, networks []*types.NetworkSelectionElement, confdir string, confnamespaceIsolation bool, resourceMap map[string]*types.ResourceInfo) ([]*types.DelegateNetConf, error) { + logging.Debugf("GetNetworkDelegates: %v, %v, %v, %v, %v, %v", k8sclient, pod, networks, confdir, confnamespaceIsolation, resourceMap) // Read all network objects referenced by 'networks' var delegates []*types.DelegateNetConf defaultNamespace := pod.ObjectMeta.Namespace @@ -483,32 +472,16 @@ func GetNetworkDelegates(k8sclient *ClientInfo, pod *v1.Pod, networks []*types.N return delegates, nil } -func getDefaultNetDelegateCRD(client *ClientInfo, net, confdir, namespace string) (*types.DelegateNetConf, error) { - logging.Debugf("getDefaultNetDelegateCRD: %v, %v, %s, %s", client, net, confdir, namespace) - customResource, err := client.NetClient.NetworkAttachmentDefinitions(namespace).Get(net, metav1.GetOptions{}) - if err != nil { - return nil, logging.Errorf("getDefaultNetDelegateCRD: failed to get network resource: %v", err) - } - - configBytes, err := netutils.GetCNIConfig(customResource, confdir) - if err != nil { - return nil, err - } - - delegate, err := types.LoadDelegateNetConf(configBytes, nil, "") - if err != nil { - return nil, err - } - - return delegate, nil -} - -func getNetDelegate(client *ClientInfo, netname, confdir, namespace string) (*types.DelegateNetConf, error) { +func getNetDelegate(client *ClientInfo, pod *v1.Pod, netname, confdir, namespace string, resourceMap map[string]*types.ResourceInfo) (*types.DelegateNetConf, map[string]*types.ResourceInfo, error) { logging.Debugf("getNetDelegate: %v, %v, %v, %s", client, netname, confdir, namespace) // option1) search CRD object for the network - delegate, err := getDefaultNetDelegateCRD(client, netname, confdir, namespace) + net := &types.NetworkSelectionElement{ + Name: netname, + Namespace: namespace, + } + delegate, resourceMap, err := getKubernetesDelegate(client, net, confdir, pod, resourceMap) if err == nil { - return delegate, nil + return delegate, resourceMap, nil } // option2) search CNI json config file @@ -517,9 +490,9 @@ func getNetDelegate(client *ClientInfo, netname, confdir, namespace string) (*ty if err == nil { delegate, err := types.LoadDelegateNetConf(configBytes, nil, "") if err != nil { - return nil, err + return nil, resourceMap, err } - return delegate, nil + return delegate, resourceMap, nil } // option3) search directry @@ -528,7 +501,7 @@ func getNetDelegate(client *ClientInfo, netname, confdir, namespace string) (*ty if fInfo.IsDir() { files, err := libcni.ConfFiles(netname, []string{".conf", ".conflist"}) if err != nil { - return nil, err + return nil, resourceMap, err } if len(files) > 0 { var configBytes []byte @@ -536,57 +509,58 @@ func getNetDelegate(client *ClientInfo, netname, confdir, namespace string) (*ty if err == nil { delegate, err := types.LoadDelegateNetConf(configBytes, nil, "") if err != nil { - return nil, err + return nil, resourceMap, err } - return delegate, nil + return delegate, resourceMap, nil } - return nil, err + return nil, resourceMap, err } } } - return nil, logging.Errorf("getNetDelegate: cannot find network: %v", netname) + return nil, resourceMap, logging.Errorf("getNetDelegate: cannot find network: %v", netname) } // GetDefaultNetworks parses 'defaultNetwork' config, gets network json and put it into netconf.Delegates. -func GetDefaultNetworks(k8sArgs *types.K8sArgs, conf *types.NetConf, kubeClient *ClientInfo) error { - logging.Debugf("GetDefaultNetworks: %v, %v, %v", k8sArgs, conf, kubeClient) +func GetDefaultNetworks(pod *v1.Pod, conf *types.NetConf, kubeClient *ClientInfo, resourceMap map[string]*types.ResourceInfo) (map[string]*types.ResourceInfo, error) { + logging.Debugf("GetDefaultNetworks: %v, %v, %v, %v", pod, conf, kubeClient, resourceMap) var delegates []*types.DelegateNetConf kubeClient, err := GetK8sClient(conf.Kubeconfig, kubeClient) if err != nil { - return err + return resourceMap, err } if kubeClient == nil { if len(conf.Delegates) == 0 { // No available kube client and no delegates, we can't do anything - return logging.Errorf("GetDefaultNetworks: must have either Kubernetes config or delegates") + return resourceMap, logging.Errorf("GetDefaultNetworks: must have either Kubernetes config or delegates") } - return nil + return resourceMap, nil } - delegate, err := getNetDelegate(kubeClient, conf.ClusterNetwork, conf.ConfDir, conf.MultusNamespace) + delegate, resourceMap, err := getNetDelegate(kubeClient, pod, conf.ClusterNetwork, conf.ConfDir, conf.MultusNamespace, resourceMap) + if err != nil { - return err + return resourceMap, logging.Errorf("GetDefaultNetworks: failed to get clusterNetwork %s in namespace %s", conf.ClusterNetwork, conf.MultusNamespace) } delegate.MasterPlugin = true delegates = append(delegates, delegate) // Pod in kube-system namespace does not have default network for now. - if !types.CheckSystemNamespaces(string(k8sArgs.K8S_POD_NAMESPACE), conf.SystemNamespaces) { + if !types.CheckSystemNamespaces(pod.ObjectMeta.Namespace, conf.SystemNamespaces) { for _, netname := range conf.DefaultNetworks { - delegate, err := getNetDelegate(kubeClient, netname, conf.ConfDir, conf.MultusNamespace) + delegate, resourceMap, err := getNetDelegate(kubeClient, pod, netname, conf.ConfDir, conf.MultusNamespace, resourceMap) if err != nil { - return err + return resourceMap, err } delegates = append(delegates, delegate) } } if err = conf.AddDelegates(delegates); err != nil { - return err + return resourceMap, err } - return nil + return resourceMap, nil } // tryLoadK8sPodDefaultNetwork get pod default network from annotations diff --git a/k8sclient/k8sclient_test.go b/k8sclient/k8sclient_test.go index d0fc6d13a..005598015 100644 --- a/k8sclient/k8sclient_test.go +++ b/k8sclient/k8sclient_test.go @@ -104,7 +104,7 @@ var _ = Describe("k8sclient operations", func() { Expect(err).NotTo(HaveOccurred()) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(delegates)).To(Equal(2)) @@ -139,7 +139,7 @@ var _ = Describe("k8sclient operations", func() { Expect(err).NotTo(HaveOccurred()) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(len(delegates)).To(Equal(0)) Expect(err).To(MatchError("GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (net1) in namespace (test): network-attachment-definitions.k8s.cni.cncf.io \"net1\" not found")) }) @@ -188,7 +188,7 @@ var _ = Describe("k8sclient operations", func() { pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(delegates)).To(Equal(3)) @@ -262,7 +262,7 @@ var _ = Describe("k8sclient operations", func() { pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(delegates)).To(Equal(3)) @@ -306,7 +306,7 @@ var _ = Describe("k8sclient operations", func() { pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(delegates)).To(Equal(2)) @@ -333,7 +333,7 @@ var _ = Describe("k8sclient operations", func() { pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(delegates)).To(Equal(1)) @@ -368,7 +368,7 @@ var _ = Describe("k8sclient operations", func() { pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false) + delegates, err := GetNetworkDelegates(clientInfo, pod, networks, tmpDir, false, nil) Expect(len(delegates)).To(Equal(0)) Expect(err).To(MatchError(fmt.Sprintf("GetNetworkDelegates: failed getting the delegate: GetCNIConfig: err in GetCNIConfigFromFile: Error loading CNI config file %s: error parsing configuration: invalid character 'a' looking for beginning of value", net2Name))) }) @@ -395,10 +395,10 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "myCRD1", "{\"type\": \"mynet\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -431,10 +431,10 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "myCRD2", "{\"type\": \"mynet2\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(2)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -471,10 +471,10 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "myCRD2", "{\"type\": \"mynet2\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myCRD1")) @@ -510,10 +510,10 @@ var _ = Describe("k8sclient operations", func() { }`)) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("myFile1")) @@ -546,10 +546,10 @@ var _ = Describe("k8sclient operations", func() { "cniVersion": "0.2.0" }`)) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) @@ -575,10 +575,10 @@ var _ = Describe("k8sclient operations", func() { _, err = clientInfo.AddPod(fakePod) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).To(HaveOccurred()) }) @@ -608,18 +608,17 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "net2", "{\"type\": \"mynet2\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(len(netConf.Delegates)).To(Equal(1)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net2")) Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet2")) - numK8sDelegates, pod, _, err := TryLoadPodDelegates(k8sArgs, netConf, clientInfo) + numK8sDelegates, _, err := TryLoadPodDelegates(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) - Expect(pod).NotTo(BeNil()) Expect(numK8sDelegates).To(Equal(0)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) Expect(netConf.Delegates[0].Conf.Type).To(Equal("mynet1")) @@ -649,14 +648,14 @@ var _ = Describe("k8sclient operations", func() { _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net2", "")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).To(HaveOccurred()) netConf.ConfDir = "badfilepath" - _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, clientInfo) + _, _, err = TryLoadPodDelegates(fakePod, netConf, clientInfo, nil) Expect(err).To(HaveOccurred()) }) @@ -688,10 +687,10 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - numK8sDelegates, _, _, err := TryLoadPodDelegates(k8sArgs, netConf, clientInfo) + numK8sDelegates, _, err := TryLoadPodDelegates(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) Expect(numK8sDelegates).To(Equal(0)) Expect(netConf.Delegates[0].Conf.Name).To(Equal("net1")) @@ -725,10 +724,10 @@ var _ = Describe("k8sclient operations", func() { testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) + _, _, err = TryLoadPodDelegates(fakePod, netConf, nil, nil) Expect(err).To(HaveOccurred()) }) @@ -758,15 +757,15 @@ var _ = Describe("k8sclient operations", func() { _, err = clientInfo.AddNetAttachDef( testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) + _, _, err = TryLoadPodDelegates(fakePod, netConf, nil, nil) Expect(err).NotTo(HaveOccurred()) // additionally, we expect the test to fail with no delegates, as at least one is always required. netConf.Delegates = nil - _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) + _, _, err = TryLoadPodDelegates(fakePod, netConf, nil, nil) Expect(err).To(HaveOccurred()) }) @@ -822,10 +821,10 @@ users: _, err = clientInfo.AddNetAttachDef( testutils.NewFakeNetAttachDef("kube-system", "net1", "{\"type\": \"mynet1\"}")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) - _, _, _, err = TryLoadPodDelegates(k8sArgs, netConf, nil) + _, _, err = TryLoadPodDelegates(fakePod, netConf, clientInfo, nil) Expect(err).NotTo(HaveOccurred()) }) @@ -868,7 +867,7 @@ users: pod, err := clientInfo.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) networks, err := GetPodNetwork(pod) Expect(err).NotTo(HaveOccurred()) - _, err = GetNetworkDelegates(clientInfo, pod, networks, tmpDir, netConf.NamespaceIsolation) + _, err = GetNetworkDelegates(clientInfo, pod, networks, tmpDir, netConf.NamespaceIsolation, nil) Expect(err).To(HaveOccurred()) Expect(err).To(MatchError("GetNetworkDelegates: namespace isolation enabled, annotation violates permission, pod is in namespace test but refers to target namespace kube-system")) @@ -906,11 +905,11 @@ users: _, err = clientInfo.AddNetAttachDef(testutils.NewFakeNetAttachDef("kube-system", "net2", "")) Expect(err).NotTo(HaveOccurred()) - k8sArgs, err := GetK8sArgs(args) + _, err = GetK8sArgs(args) Expect(err).NotTo(HaveOccurred()) netConf.ConfDir = "garbage value" - err = GetDefaultNetworks(k8sArgs, netConf, clientInfo) + _, err = GetDefaultNetworks(fakePod, netConf, clientInfo, nil) Expect(err).To(HaveOccurred()) }) }) @@ -967,7 +966,7 @@ users: networks, err := GetPodNetwork(fakePod) Expect(err).NotTo(HaveOccurred()) - _, err = GetNetworkDelegates(clientInfo, fakePod, networks, tmpDir, false) + _, err = GetNetworkDelegates(clientInfo, fakePod, networks, tmpDir, false, nil) Expect(err).To(HaveOccurred()) }) }) diff --git a/multus/multus.go b/multus/multus.go index f8d626f5f..00a400eb2 100644 --- a/multus/multus.go +++ b/multus/multus.go @@ -45,6 +45,7 @@ import ( nadutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils" "github.com/vishvananda/netlink" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/util/wait" ) @@ -505,8 +506,22 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (c } } + pod := (*v1.Pod)(nil) + if kubeClient != nil { + pod, err = kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + if err != nil { + if !errors.IsNotFound(err) { + return nil, cmdErr(k8sArgs, "error getting pod: %v", err) + } + } + } + + // resourceMap holds Pod device allocation information; only initizized if CRD contains 'resourceName' annotation. + // This will only be initialized once and all delegate objects can reference this to look up device info. + var resourceMap map[string]*types.ResourceInfo + if n.ClusterNetwork != "" { - err = k8s.GetDefaultNetworks(k8sArgs, n, kubeClient) + resourceMap, err = k8s.GetDefaultNetworks(pod, n, kubeClient, resourceMap) if err != nil { return nil, cmdErr(k8sArgs, "failed to get clusterNetwork/defaultNetworks: %v", err) } @@ -514,7 +529,7 @@ func cmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (c n.Delegates[0].MasterPlugin = true } - _, pod, kc, err := k8s.TryLoadPodDelegates(k8sArgs, n, kubeClient) + _, kc, err := k8s.TryLoadPodDelegates(pod, n, kubeClient, resourceMap) if err != nil { return nil, cmdErr(k8sArgs, "error loading k8s delegates k8s args: %v", err) } @@ -672,13 +687,23 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) er } } + pod := (*v1.Pod)(nil) + if kubeClient != nil { + pod, err = kubeClient.GetPod(string(k8sArgs.K8S_POD_NAMESPACE), string(k8sArgs.K8S_POD_NAME)) + if err != nil { + if !errors.IsNotFound(err) { + return cmdErr(k8sArgs, "error getting pod: %v", err) + } + } + } + // Read the cache to get delegates json for the pod netconfBytes, path, err := consumeScratchNetConf(args.ContainerID, in.CNIDir) if err != nil { // Fetch delegates again if cache is not exist if os.IsNotExist(err) { if in.ClusterNetwork != "" { - err = k8s.GetDefaultNetworks(k8sArgs, in, kubeClient) + _, err = k8s.GetDefaultNetworks(pod, in, kubeClient, nil) if err != nil { return cmdErr(k8sArgs, "failed to get clusterNetwork/defaultNetworks: %v", err) } @@ -687,7 +712,7 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) er } // Get pod annotation and so on - _, _, _, err := k8s.TryLoadPodDelegates(k8sArgs, in, kubeClient) + _, _, err := k8s.TryLoadPodDelegates(pod, in, kubeClient, nil) if err != nil { if len(in.Delegates) == 0 { // No delegate available so send error @@ -737,14 +762,6 @@ func cmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) er } } - kubeClient, err = k8s.GetK8sClient(in.Kubeconfig, kubeClient) - var pod *v1.Pod - if kubeClient != nil { - podName := string(k8sArgs.K8S_POD_NAME) - podNamespace := string(k8sArgs.K8S_POD_NAMESPACE) - pod, _ = kubeClient.GetPod(podNamespace, podName) - } - rt := types.CreateCNIRuntimeConf(args, k8sArgs, "", in.RuntimeConfig) return delPlugins(exec, pod, args.IfName, in.Delegates, len(in.Delegates)-1, rt, in.BinDir) }