diff --git a/cmd/multus/main.go b/cmd/multus/main.go index 777d62e3a..5e9b6440e 100644 --- a/cmd/multus/main.go +++ b/cmd/multus/main.go @@ -45,7 +45,7 @@ func main() { skel.PluginMain( func(args *skel.CmdArgs) error { - result, err := multus.CmdAdd(args, nil, nil, nil) + result, err := multus.CmdAdd(args, nil, nil) if err != nil { return err } @@ -54,6 +54,6 @@ func main() { func(args *skel.CmdArgs) error { return multus.CmdCheck(args, nil, nil) }, - func(args *skel.CmdArgs) error { return multus.CmdDel(args, nil, nil, nil) }, + func(args *skel.CmdArgs) error { return multus.CmdDel(args, nil, nil) }, cniversion.All, "meta-plugin that delegates to other CNI plugins") } diff --git a/go.mod b/go.mod index 190b4aa49..e90b4e13b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/containernetworking/plugins v1.1.0 github.com/fsnotify/fsnotify v1.6.0 github.com/go-logr/logr v1.3.0 // indirect - github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 + github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 github.com/onsi/ginkgo/v2 v2.13.0 github.com/onsi/gomega v1.29.0 github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index 31eb56740..22abedaca 100644 --- a/go.sum +++ b/go.sum @@ -868,6 +868,8 @@ github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 h1:VzM3TYHDgqPkettiP6I6q2jOeQFL4nrJM+UcAc4f6Fs= github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0/go.mod h1:nqCI7aelBJU61wiBeeZWJ6oi4bJy5nrjkM6lWIMA4j0= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 h1:V58W9SkSqAoKdYYH6q2aa3uDBE/I/KZ5Pe4Nj6M6oH4= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0/go.mod h1:wxt2YWRVItDtaQmVSmaN5ubE2L1c9CiNoHQwSJnM8Ko= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= diff --git a/pkg/k8sclient/k8sclient.go b/pkg/k8sclient/k8sclient.go index 77ccc9fab..9c7005fda 100644 --- a/pkg/k8sclient/k8sclient.go +++ b/pkg/k8sclient/k8sclient.go @@ -28,13 +28,16 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" + listers "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" "github.com/containernetworking/cni/libcni" "github.com/containernetworking/cni/pkg/skel" cnitypes "github.com/containernetworking/cni/pkg/types" nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" - netclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1" + netclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + netlister "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1" netutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/kubeletclient" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/logging" @@ -55,9 +58,13 @@ type NoK8sNetworkError struct { // ClientInfo contains information given from k8s client type ClientInfo struct { Client kubernetes.Interface - NetClient netclient.K8sCniCncfIoV1Interface + NetClient netclient.Interface EventBroadcaster record.EventBroadcaster EventRecorder record.EventRecorder + + // multus-thick uses these informer + PodInformer cache.SharedIndexInformer + NetDefInformer cache.SharedIndexInformer } // AddPod adds pod into kubernetes @@ -67,6 +74,10 @@ func (c *ClientInfo) AddPod(pod *v1.Pod) (*v1.Pod, error) { // GetPod gets pod from kubernetes func (c *ClientInfo) GetPod(namespace, name string) (*v1.Pod, error) { + if c.PodInformer != nil { + logging.Debugf("GetPod for [%s/%s] will use informer cache", namespace, name) + return listers.NewPodLister(c.PodInformer.GetIndexer()).Pods(namespace).Get(name) + } return c.Client.CoreV1().Pods(namespace).Get(context.TODO(), name, metav1.GetOptions{}) } @@ -77,7 +88,16 @@ func (c *ClientInfo) DeletePod(namespace, name string) error { // AddNetAttachDef adds net-attach-def into kubernetes func (c *ClientInfo) AddNetAttachDef(netattach *nettypes.NetworkAttachmentDefinition) (*nettypes.NetworkAttachmentDefinition, error) { - return c.NetClient.NetworkAttachmentDefinitions(netattach.ObjectMeta.Namespace).Create(context.TODO(), netattach, metav1.CreateOptions{}) + return c.NetClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(netattach.ObjectMeta.Namespace).Create(context.TODO(), netattach, metav1.CreateOptions{}) +} + +// GetNetAttachDef get net-attach-def from kubernetes +func (c *ClientInfo) GetNetAttachDef(namespace, name string) (*nettypes.NetworkAttachmentDefinition, error) { + if c.NetDefInformer != nil { + logging.Debugf("GetNetAttachDef for [%s/%s] will use informer cache", namespace, name) + return netlister.NewNetworkAttachmentDefinitionLister(c.NetDefInformer.GetIndexer()).NetworkAttachmentDefinitions(namespace).Get(name) + } + return c.NetClient.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespace).Get(context.TODO(), name, metav1.GetOptions{}) } // Eventf puts event into kubernetes events @@ -107,7 +127,7 @@ func SetPodNetworkStatusAnnotation(client *ClientInfo, podName string, podNamesp if err != nil { return logging.Errorf("SetNetworkStatus: %v", err) } - if client == nil || client.Client == nil { + if client == nil { if len(conf.Delegates) == 0 { // No available kube client and no delegates, we can't do anything return logging.Errorf("SetNetworkStatus: must have either Kubernetes config or delegates") @@ -248,7 +268,8 @@ func parsePodNetworkAnnotation(podNetworks, defaultNamespace string) ([]*types.N func getKubernetesDelegate(client *ClientInfo, net *types.NetworkSelectionElement, confdir string, pod *v1.Pod, resourceMap map[string]*types.ResourceInfo) (*types.DelegateNetConf, map[string]*types.ResourceInfo, error) { logging.Debugf("getKubernetesDelegate: %v, %v, %s, %v, %v", client, net, confdir, pod, resourceMap) - customResource, err := client.NetClient.NetworkAttachmentDefinitions(net.Namespace).Get(context.TODO(), net.Name, metav1.GetOptions{}) + + customResource, err := client.GetNetAttachDef(net.Namespace, net.Name) if err != nil { errMsg := fmt.Sprintf("cannot find a network-attachment-definition (%s) in namespace (%s): %v", net.Name, net.Namespace, err) if client != nil { diff --git a/pkg/k8sclient/k8sclient_test.go b/pkg/k8sclient/k8sclient_test.go index a4b379aec..2a1684654 100644 --- a/pkg/k8sclient/k8sclient_test.go +++ b/pkg/k8sclient/k8sclient_test.go @@ -48,7 +48,7 @@ func TestK8sClient(t *testing.T) { func NewFakeClientInfo() *ClientInfo { return &ClientInfo{ Client: fake.NewSimpleClientset(), - NetClient: netfake.NewSimpleClientset().K8sCniCncfIoV1(), + NetClient: netfake.NewSimpleClientset(), } } diff --git a/pkg/k8sclient/kubeconfig.go b/pkg/k8sclient/kubeconfig.go index 79ab61ae5..b9ca1b402 100644 --- a/pkg/k8sclient/kubeconfig.go +++ b/pkg/k8sclient/kubeconfig.go @@ -33,13 +33,14 @@ import ( "k8s.io/client-go/kubernetes/scheme" v1core "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" "k8s.io/client-go/transport" "k8s.io/client-go/util/certificate" "k8s.io/klog" - netclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1" + netclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/logging" ) @@ -171,6 +172,12 @@ func InClusterK8sClient() (*ClientInfo, error) { return clientInfo, err } +// SetK8sClientInformers adds informer structure to ClientInfo to utilize in thick daemon +func (c *ClientInfo) SetK8sClientInformers(podInformer, netDefInformer cache.SharedIndexInformer) { + c.PodInformer = podInformer + c.NetDefInformer = netDefInformer +} + // GetK8sClient gets client info from kubeconfig func GetK8sClient(kubeconfig string, kubeClient *ClientInfo) (*ClientInfo, error) { logging.Debugf("GetK8sClient: %s, %v", kubeconfig, kubeClient) diff --git a/pkg/multus/multus.go b/pkg/multus/multus.go index 77541fb56..e9ecc1ed1 100644 --- a/pkg/multus/multus.go +++ b/pkg/multus/multus.go @@ -38,8 +38,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" k8snet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/wait" - listers "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/tools/cache" k8s "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/k8sclient" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/logging" @@ -509,7 +507,7 @@ func isCriticalRequestRetriable(err error) bool { // GetPod retrieves Kubernetes Pod object from given namespace/name in k8sArgs (i.e. cni args) // GetPod also get pod UID, but it is not used to retrieve, but it is used for double check -func GetPod(kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer, k8sArgs *types.K8sArgs, isDel bool) (*v1.Pod, error) { +func GetPod(kubeClient *k8s.ClientInfo, k8sArgs *types.K8sArgs, isDel bool) (*v1.Pod, error) { if kubeClient == nil { return nil, nil } @@ -525,22 +523,14 @@ func GetPod(kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer, k logging.Debugf("GetPod for [%s/%s] took %v", podNamespace, podName, time.Since(start)) }() - // Standard getter grabs pod directly from the apiserver - podGetter := func(ns, name string) (*v1.Pod, error) { - return kubeClient.GetPod(ns, name) - } // Use a fairly long 0.25 sec interval so we don't hammer the apiserver pollDuration := shortPollDuration retryOnNotFound := func(error) bool { return false } - if podInformer != nil { + if kubeClient.PodInformer != nil { logging.Debugf("GetPod for [%s/%s] will use informer cache", podNamespace, podName) - // If we have an informer get the pod from the informer cache - podGetter = func(ns, name string) (*v1.Pod, error) { - return listers.NewPodLister(podInformer.GetIndexer()).Pods(ns).Get(name) - } // Use short retry intervals with the informer since it's a local cache pollDuration = informerPollDuration // Retry NotFound on ADD since the cache may be a bit behind the apiserver @@ -552,7 +542,7 @@ func GetPod(kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer, k var pod *v1.Pod if err := wait.PollImmediate(pollDuration, shortPollTimeout, func() (bool, error) { var getErr error - pod, getErr = podGetter(podNamespace, podName) + pod, getErr = kubeClient.GetPod(podNamespace, podName) if isCriticalRequestRetriable(getErr) || retryOnNotFound(getErr) { return false, nil } @@ -587,7 +577,7 @@ func GetPod(kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer, k } // CmdAdd ... -func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer) (cnitypes.Result, error) { +func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (cnitypes.Result, error) { n, err := types.LoadNetConf(args.StdinData) logging.Debugf("CmdAdd: %v, %v, %v", args, exec, kubeClient) if err != nil { @@ -610,7 +600,7 @@ func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo, po } } - pod, err := GetPod(kubeClient, podInformer, k8sArgs, false) + pod, err := GetPod(kubeClient, k8sArgs, false) if err != nil { return nil, err } @@ -807,7 +797,7 @@ func CmdCheck(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) } // CmdDel ... -func CmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo, podInformer cache.SharedIndexInformer) error { +func CmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) error { in, err := types.LoadNetConf(args.StdinData) logging.Debugf("CmdDel: %v, %v, %v", args, exec, kubeClient) if err != nil { @@ -835,7 +825,7 @@ func CmdDel(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo, po return cmdErr(nil, "error getting k8s client: %v", err) } - pod, err := GetPod(kubeClient, podInformer, k8sArgs, true) + pod, err := GetPod(kubeClient, k8sArgs, true) if err != nil { // GetPod may be failed but just do print error in its log and continue to delete logging.Errorf("Multus: GetPod failed: %v, but continue to delete", err) diff --git a/pkg/multus/multus_cni020_test.go b/pkg/multus/multus_cni020_test.go index 6340506c9..6b5d60268 100644 --- a/pkg/multus/multus_cni020_test.go +++ b/pkg/multus/multus_cni020_test.go @@ -144,14 +144,14 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { }` fExec.addPlugin020(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -205,14 +205,14 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { }` fExec.addPlugin020(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -267,7 +267,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { }` fExec.addPlugin020(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(MatchError("[//:weave1]: error adding container to network \"weave1\": DelegateAdd: cannot set \"weave-net\" interface name to \"eth0\": validateIfName: no net namespace fsdadfad found: failed to Statfs \"fsdadfad\": no such file or directory")) }) @@ -321,10 +321,10 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { }` fExec.addPlugin020(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).To(HaveOccurred()) }) @@ -365,7 +365,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { err := fmt.Errorf("expected plugin failure") fExec.addPlugin020(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(2)) Expect(fExec.delIndex).To(Equal(2)) Expect(err).To(MatchError("[//:other1]: error adding container to network \"other1\": expected plugin failure")) @@ -411,7 +411,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { err := fmt.Errorf("expected plugin failure") fExec.addPlugin020(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(1)) Expect(fExec.delIndex).To(Equal(2)) Expect(err).To(HaveOccurred()) @@ -493,7 +493,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) @@ -559,7 +559,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) @@ -570,7 +570,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { err = fKubeClient.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -611,13 +611,13 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { _, err := fKubeClient.AddNetAttachDef(testhelpers.NewFakeNetAttachDef("kube-system", "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -676,7 +676,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) @@ -689,7 +689,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check net count is not incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -748,7 +748,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*types020.Result) @@ -764,7 +764,7 @@ var _ = Describe("multus operations cniVersion 0.2.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check pod/net count is incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) diff --git a/pkg/multus/multus_cni040_test.go b/pkg/multus/multus_cni040_test.go index 9fb54739e..27549b1ac 100644 --- a/pkg/multus/multus_cni040_test.go +++ b/pkg/multus/multus_cni040_test.go @@ -123,14 +123,14 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -241,7 +241,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) @@ -298,14 +298,14 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) // plugin 1 is the masterplugin Expect(reflect.DeepEqual(r, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -344,7 +344,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - _, err = CmdAdd(args, newFakeExec(), clientInfo, nil) + _, err = CmdAdd(args, newFakeExec(), clientInfo) Expect(err.Error()).To(ContainSubstring("expected pod UID \"foobar\" but got %q from Kube API", fakePod.UID)) }) @@ -408,7 +408,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) @@ -460,7 +460,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { context.TODO(), fakePod, metav1.CreateOptions{}) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) @@ -512,7 +512,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { context.TODO(), fakePod, metav1.CreateOptions{}) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) @@ -559,7 +559,7 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { } }` fExec.addPlugin040(nil, "eth0", expectedConf1, nil, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) }) @@ -602,9 +602,9 @@ var _ = Describe("multus operations cniVersion 0.3.1 config", func() { } }` fExec.addPlugin040(nil, "eth0", expectedConf1, nil, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) }) }) @@ -698,7 +698,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) @@ -708,7 +708,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { err = CmdCheck(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -765,7 +765,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(MatchError("[//:weave1]: error adding container to network \"weave1\": DelegateAdd: cannot set \"weave-net\" interface name to \"eth0\": validateIfName: no net namespace fsdadfad found: failed to Statfs \"fsdadfad\": no such file or directory")) }) @@ -830,7 +830,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) @@ -840,7 +840,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { err = CmdCheck(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -897,10 +897,10 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { }` fExec.addPlugin040(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).To(HaveOccurred()) }) @@ -942,7 +942,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { err := fmt.Errorf("expected plugin failure") fExec.addPlugin040(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(2)) Expect(fExec.delIndex).To(Equal(2)) Expect(err).To(MatchError("[//:other1]: error adding container to network \"other1\": expected plugin failure")) @@ -988,7 +988,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { err := fmt.Errorf("missing network name") fExec.addPlugin040(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(1)) Expect(fExec.delIndex).To(Equal(1)) Expect(err).To(HaveOccurred()) @@ -1100,7 +1100,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni040.Result) @@ -1188,7 +1188,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1249,7 +1249,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1258,7 +1258,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { // set fKubeClient to nil to emulate no pod info err = clientInfo.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, clientInfo, nil) + err = CmdDel(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -1302,7 +1302,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { } }` fExec.addPlugin040(nil, "eth0", expectedConf1, nil, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) }) @@ -1343,12 +1343,12 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { _, err := fKubeClient.AddNetAttachDef(testhelpers.NewFakeNetAttachDef("kube-system", "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) Expect(reflect.DeepEqual(result, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -1409,7 +1409,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1421,7 +1421,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check net count is not incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -1482,7 +1482,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1497,7 +1497,7 @@ var _ = Describe("multus operations cniVersion 0.4.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check pod/net count is incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) diff --git a/pkg/multus/multus_cni100_test.go b/pkg/multus/multus_cni100_test.go index e1ee52645..3c78fbee4 100644 --- a/pkg/multus/multus_cni100_test.go +++ b/pkg/multus/multus_cni100_test.go @@ -41,6 +41,11 @@ import ( v1coreinformers "k8s.io/client-go/informers/core/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" + + netdefv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + netdefclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + netdefinformer "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions" + netdefinformerv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1" ) func newPodInformer(ctx context.Context, kclient kubernetes.Interface) cache.SharedIndexInformer { @@ -66,6 +71,28 @@ func newPodInformer(ctx context.Context, kclient kubernetes.Interface) cache.Sha return podInformer } +func newNetDefInformer(ctx context.Context, client netdefclient.Interface) cache.SharedIndexInformer { + informerFactory := netdefinformer.NewSharedInformerFactory(client, 0*time.Second) + + netdefInformer := informerFactory.InformerFor(&netdefv1.NetworkAttachmentDefinition{}, func(client netdefclient.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return netdefinformerv1.NewNetworkAttachmentDefinitionInformer( + client, + kapi.NamespaceAll, + resyncPeriod, + cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) + }) + + informerFactory.Start(ctx.Done()) + + waitCtx, waitCancel := context.WithTimeout(ctx, 20*time.Second) + if !cache.WaitForCacheSync(waitCtx.Done(), netdefInformer.HasSynced) { + logging.Errorf("failed to sync pod informer cache") + } + waitCancel() + + return netdefInformer +} + var _ = Describe("multus operations cniVersion 1.0.0 config", func() { var testNS ns.NetNS var tmpDir string @@ -160,7 +187,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }` fExec.addPlugin100(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) @@ -170,7 +197,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { err = CmdCheck(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -227,7 +254,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }` fExec.addPlugin100(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(MatchError("[//:weave1]: error adding container to network \"weave1\": DelegateAdd: cannot set \"weave-net\" interface name to \"eth0\": validateIfName: no net namespace fsdadfad found: failed to Statfs \"fsdadfad\": no such file or directory")) }) @@ -281,7 +308,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }` fExec.addPlugin100(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) @@ -291,7 +318,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { err = CmdCheck(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -357,7 +384,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }` fExec.addPlugin100(nil, "net1", expectedConf2, expectedResult2, nil) - result, err := CmdAdd(args, fExec, nil, nil) + result, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) @@ -367,7 +394,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { err = CmdCheck(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -424,10 +451,10 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }` fExec.addPlugin100(nil, "net1", expectedConf2, expectedResult2, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).To(HaveOccurred()) - err = CmdDel(args, fExec, nil, nil) + err = CmdDel(args, fExec, nil) Expect(err).To(HaveOccurred()) }) @@ -469,7 +496,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { err := fmt.Errorf("expected plugin failure") fExec.addPlugin100(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(2)) Expect(fExec.delIndex).To(Equal(2)) Expect(err).To(MatchError("[//:other1]: error adding container to network \"other1\": expected plugin failure")) @@ -515,7 +542,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { err := fmt.Errorf("missing network name") fExec.addPlugin100(nil, "net1", expectedConf2, nil, err) - _, err = CmdAdd(args, fExec, nil, nil) + _, err = CmdAdd(args, fExec, nil) Expect(fExec.addIndex).To(Equal(1)) Expect(fExec.delIndex).To(Equal(1)) Expect(err).To(HaveOccurred()) @@ -626,7 +653,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) r := result.(*cni100.Result) @@ -713,7 +740,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net3", net3)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -774,7 +801,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, clientInfo, nil) + result, err := CmdAdd(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -782,7 +809,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { // set fKubeClient to nil to emulate no pod info clientInfo.DeletePod(fakePod.ObjectMeta.Namespace, fakePod.ObjectMeta.Name) - err = CmdDel(args, fExec, clientInfo, nil) + err = CmdDel(args, fExec, clientInfo) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -826,7 +853,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { } }` fExec.addPlugin100(nil, "eth0", expectedConf1, nil, nil) - _, err := CmdAdd(args, fExec, nil, nil) + _, err := CmdAdd(args, fExec, nil) Expect(err).NotTo(HaveOccurred()) }) @@ -867,12 +894,12 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { _, err := fKubeClient.AddNetAttachDef(testhelpers.NewFakeNetAttachDef("kube-system", "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) Expect(reflect.DeepEqual(result, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -915,13 +942,15 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { Expect(err).NotTo(HaveOccurred()) podInformer := newPodInformer(ctx, fKubeClient.Client) + netdefInformer := newNetDefInformer(ctx, fKubeClient.NetClient) + fKubeClient.SetK8sClientInformers(podInformer, netdefInformer) - result, err := CmdAdd(args, fExec, fKubeClient, podInformer) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) Expect(reflect.DeepEqual(result, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, fKubeClient, podInformer) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -963,6 +992,8 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { Expect(err).NotTo(HaveOccurred()) podInformer := newPodInformer(ctx, fKubeClient.Client) + netdefInformer := newNetDefInformer(ctx, fKubeClient.NetClient) + fKubeClient.SetK8sClientInformers(podInformer, netdefInformer) wg := sync.WaitGroup{} wg.Add(1) @@ -973,12 +1004,12 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { }() wg.Wait() - result, err := CmdAdd(args, fExec, fKubeClient, podInformer) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) Expect(reflect.DeepEqual(result, expectedResult1)).To(BeTrue()) - err = CmdDel(args, fExec, fKubeClient, podInformer) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -1039,7 +1070,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1051,7 +1082,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check net count is not incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) @@ -1112,7 +1143,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { _, err = fKubeClient.AddNetAttachDef( testhelpers.NewFakeNetAttachDef(fakePod.ObjectMeta.Namespace, "net1", net1)) Expect(err).NotTo(HaveOccurred()) - result, err := CmdAdd(args, fExec, fKubeClient, nil) + result, err := CmdAdd(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.addIndex).To(Equal(len(fExec.plugins))) // plugin 1 is the masterplugin @@ -1127,7 +1158,7 @@ var _ = Describe("multus operations cniVersion 1.0.0 config", func() { Expect(err).NotTo(HaveOccurred()) By("Delete and check pod/net count is incremented") - err = CmdDel(args, fExec, fKubeClient, nil) + err = CmdDel(args, fExec, fKubeClient) Expect(err).NotTo(HaveOccurred()) Expect(fExec.delIndex).To(Equal(len(fExec.plugins))) }) diff --git a/pkg/multus/multus_suite_test.go b/pkg/multus/multus_suite_test.go index f92b6e7da..a9ad866f2 100644 --- a/pkg/multus/multus_suite_test.go +++ b/pkg/multus/multus_suite_test.go @@ -226,7 +226,7 @@ func (f *fakeExec) FindInPath(plugin string, paths []string) (string, error) { func NewFakeClientInfo() *k8sclient.ClientInfo { return &k8sclient.ClientInfo{ Client: fake.NewSimpleClientset(), - NetClient: netfake.NewSimpleClientset().K8sCniCncfIoV1(), + NetClient: netfake.NewSimpleClientset(), EventRecorder: record.NewFakeRecorder(10), } } diff --git a/pkg/server/server.go b/pkg/server/server.go index bc5c4a403..e534e91bb 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -40,6 +40,11 @@ import ( "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/server/config" "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/types" + netdefv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + netdefclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + netdefinformer "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions" + netdefinformerv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1" + kapi "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -161,6 +166,21 @@ func informerObjectTrim(obj interface{}) (interface{}, error) { return obj, nil } +func newNetDefInformer(netdefClient netdefclient.Interface) (netdefinformer.SharedInformerFactory, cache.SharedIndexInformer) { + const resyncInterval time.Duration = 1 * time.Second + + informerFactory := netdefinformer.NewSharedInformerFactoryWithOptions(netdefClient, resyncInterval) + netdefInformer := informerFactory.InformerFor(&netdefv1.NetworkAttachmentDefinition{}, func(client netdefclient.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return netdefinformerv1.NewNetworkAttachmentDefinitionInformer( + client, + kapi.NamespaceAll, + resyncPeriod, + cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) + }) + + return informerFactory, netdefInformer +} + func newPodInformer(kubeClient kubernetes.Interface, nodeName string) (internalinterfaces.SharedInformerFactory, cache.SharedIndexInformer) { var tweakFunc internalinterfaces.TweakListOptionsFunc if nodeName != "" { @@ -171,9 +191,7 @@ func newPodInformer(kubeClient kubernetes.Interface, nodeName string) (internali } } - // Multus only watches pods so there's no possibility of race conditions - // between multiple resources that might require a resync to resolve - const resyncInterval time.Duration = 0 * time.Second + const resyncInterval time.Duration = 1 * time.Second informerFactory := informerfactory.NewSharedInformerFactoryWithOptions(kubeClient, resyncInterval, informerfactory.WithTransform(informerObjectTrim)) podInformer := informerFactory.InformerFor(&kapi.Pod{}, func(c kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { @@ -246,6 +264,8 @@ func NewCNIServer(daemonConfig *ControllerNetConf, serverConfig []byte, ignoreRe func newCNIServer(rundir string, kubeClient *k8s.ClientInfo, exec invoke.Exec, servConfig []byte, ignoreReadinessIndicator bool) (*Server, error) { informerFactory, podInformer := newPodInformer(kubeClient.Client, os.Getenv("MULTUS_NODE_NAME")) + netdefInformerFactory, netdefInformer := newNetDefInformer(kubeClient.NetClient) + kubeClient.SetK8sClientInformers(podInformer, netdefInformer) router := http.NewServeMux() s := &Server{ @@ -267,6 +287,8 @@ func newCNIServer(rundir string, kubeClient *k8s.ClientInfo, exec invoke.Exec, s }, informerFactory: informerFactory, podInformer: podInformer, + netdefInformerFactory: netdefInformerFactory, + netdefInformer: netdefInformer, ignoreReadinessIndicator: ignoreReadinessIndicator, } s.SetKeepAlivesEnabled(false) @@ -343,6 +365,7 @@ func newCNIServer(rundir string, kubeClient *k8s.ClientInfo, exec invoke.Exec, s // Start starts the server and begins serving on the given listener func (s *Server) Start(ctx context.Context, l net.Listener) { s.informerFactory.Start(ctx.Done()) + s.netdefInformerFactory.Start(ctx.Done()) // Give the initial sync some time to complete in large clusters, but // don't wait forever @@ -352,6 +375,14 @@ func (s *Server) Start(ctx context.Context, l net.Listener) { } waitCancel() + // Give the initial sync some time to complete in large clusters, but + // don't wait forever + waitCtx, waitCancel = context.WithTimeout(ctx, 20*time.Second) + if !cache.WaitForCacheSync(waitCtx.Done(), s.netdefInformer.HasSynced) { + logging.Errorf("failed to sync net-attach-def informer cache") + } + waitCancel() + go func() { utilwait.UntilWithContext(ctx, func(_ context.Context) { logging.Debugf("open for business") @@ -562,7 +593,7 @@ func (s *Server) cmdAdd(cmdArgs *skel.CmdArgs, k8sArgs *types.K8sArgs) ([]byte, } logging.Debugf("CmdAdd for [%s/%s]. CNI conf: %+v", namespace, podName, *cmdArgs) - result, err := multus.CmdAdd(cmdArgs, s.exec, s.kubeclient, s.podInformer) + result, err := multus.CmdAdd(cmdArgs, s.exec, s.kubeclient) if err != nil { return nil, fmt.Errorf("error configuring pod [%s/%s] networking: %v", namespace, podName, err) } @@ -577,7 +608,7 @@ func (s *Server) cmdDel(cmdArgs *skel.CmdArgs, k8sArgs *types.K8sArgs) error { } logging.Debugf("CmdDel for [%s/%s]. CNI conf: %+v", namespace, podName, *cmdArgs) - return multus.CmdDel(cmdArgs, s.exec, s.kubeclient, s.podInformer) + return multus.CmdDel(cmdArgs, s.exec, s.kubeclient) } func (s *Server) cmdCheck(cmdArgs *skel.CmdArgs, k8sArgs *types.K8sArgs) error { @@ -611,7 +642,7 @@ func (s *Server) cmdDelegateAdd(cmdArgs *skel.CmdArgs, k8sArgs *types.K8sArgs, m if namespace == "" || podName == "" { return nil, fmt.Errorf("required CNI variable missing. pod name: %s; pod namespace: %s", podName, namespace) } - pod, err := multus.GetPod(s.kubeclient, s.podInformer, k8sArgs, false) + pod, err := multus.GetPod(s.kubeclient, k8sArgs, false) if err != nil { return nil, err } @@ -665,7 +696,7 @@ func (s *Server) cmdDelegateDel(cmdArgs *skel.CmdArgs, k8sArgs *types.K8sArgs, m if namespace == "" || podName == "" { return fmt.Errorf("required CNI variable missing. pod name: %s; pod namespace: %s", podName, namespace) } - pod, err := multus.GetPod(s.kubeclient, s.podInformer, k8sArgs, false) + pod, err := multus.GetPod(s.kubeclient, k8sArgs, false) if err != nil { return err } diff --git a/pkg/server/thick_cni_test.go b/pkg/server/thick_cni_test.go index 3661c9f27..3a8fc62eb 100644 --- a/pkg/server/thick_cni_test.go +++ b/pkg/server/thick_cni_test.go @@ -210,7 +210,7 @@ func fakeK8sClient() *k8s.ClientInfo { const magicNumber = 10 return &k8s.ClientInfo{ Client: fake.NewSimpleClientset(), - NetClient: netfake.NewSimpleClientset().K8sCniCncfIoV1(), + NetClient: netfake.NewSimpleClientset(), EventRecorder: record.NewFakeRecorder(magicNumber), } } diff --git a/pkg/server/types.go b/pkg/server/types.go index aaadf081a..81d4d6819 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -24,6 +24,7 @@ import ( "gopkg.in/k8snetworkplumbingwg/multus-cni.v4/pkg/k8sclient" + netdefinformer "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions" "k8s.io/client-go/informers/internalinterfaces" "k8s.io/client-go/tools/cache" ) @@ -48,13 +49,15 @@ type Metrics struct { // the CNI shim requests issued when a pod is added / removed. type Server struct { http.Server - rundir string - kubeclient *k8sclient.ClientInfo - exec invoke.Exec - serverConfig []byte - metrics *Metrics - informerFactory internalinterfaces.SharedInformerFactory - podInformer cache.SharedIndexInformer + rundir string + kubeclient *k8sclient.ClientInfo + exec invoke.Exec + serverConfig []byte + metrics *Metrics + informerFactory internalinterfaces.SharedInformerFactory + podInformer cache.SharedIndexInformer + netdefInformerFactory netdefinformer.SharedInformerFactory + netdefInformer cache.SharedIndexInformer ignoreReadinessIndicator bool } diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/NOTICE b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/NOTICE new file mode 100644 index 000000000..3e2901b3a --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/NOTICE @@ -0,0 +1 @@ +Copyright 2018 Kubernetes Network Plumbing Working Group diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/factory.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/factory.go new file mode 100644 index 000000000..2476f9fe6 --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/factory.go @@ -0,0 +1,180 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package externalversions + +import ( + reflect "reflect" + sync "sync" + time "time" + + versioned "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + internalinterfaces "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces" + k8scnicncfio "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" +) + +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + +type sharedInformerFactory struct { + client versioned.Interface + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc + lock sync.Mutex + defaultResync time.Duration + customResync map[reflect.Type]time.Duration + + informers map[reflect.Type]cache.SharedIndexInformer + // startedInformers is used for tracking which informers have been started. + // This allows Start() to be called multiple times safely. + startedInformers map[reflect.Type]bool +} + +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. +func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { + return NewSharedInformerFactoryWithOptions(client, defaultResync) +} + +// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. +// Listers obtained via this SharedInformerFactory will be subject to the same filters +// as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead +func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ + client: client, + namespace: v1.NamespaceAll, + defaultResync: defaultResync, + informers: make(map[reflect.Type]cache.SharedIndexInformer), + startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), + } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory +} + +// Start initializes all requested informers. +func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { + f.lock.Lock() + defer f.lock.Unlock() + + for informerType, informer := range f.informers { + if !f.startedInformers[informerType] { + go informer.Run(stopCh) + f.startedInformers[informerType] = true + } + } +} + +// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { + informers := func() map[reflect.Type]cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informers := map[reflect.Type]cache.SharedIndexInformer{} + for informerType, informer := range f.informers { + if f.startedInformers[informerType] { + informers[informerType] = informer + } + } + return informers + }() + + res := map[reflect.Type]bool{} + for informType, informer := range informers { + res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced) + } + return res +} + +// InternalInformerFor returns the SharedIndexInformer for obj using an internal +// client. +func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informerType := reflect.TypeOf(obj) + informer, exists := f.informers[informerType] + if exists { + return informer + } + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) + f.informers[informerType] = informer + + return informer +} + +// SharedInformerFactory provides shared informers for resources in all known +// API group versions. +type SharedInformerFactory interface { + internalinterfaces.SharedInformerFactory + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + + K8sCniCncfIo() k8scnicncfio.Interface +} + +func (f *sharedInformerFactory) K8sCniCncfIo() k8scnicncfio.Interface { + return k8scnicncfio.New(f, f.namespace, f.tweakListOptions) +} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/generic.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/generic.go new file mode 100644 index 000000000..649781164 --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/generic.go @@ -0,0 +1,62 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package externalversions + +import ( + "fmt" + + v1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" +) + +// GenericInformer is type of SharedIndexInformer which will locate and delegate to other +// sharedInformers based on type +type GenericInformer interface { + Informer() cache.SharedIndexInformer + Lister() cache.GenericLister +} + +type genericInformer struct { + informer cache.SharedIndexInformer + resource schema.GroupResource +} + +// Informer returns the SharedIndexInformer. +func (f *genericInformer) Informer() cache.SharedIndexInformer { + return f.informer +} + +// Lister returns the GenericLister. +func (f *genericInformer) Lister() cache.GenericLister { + return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource) +} + +// ForResource gives generic access to a shared informer of the matching type +// TODO extend this to unknown resources with a client pool +func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { + switch resource { + // Group=k8s.cni.cncf.io, Version=v1 + case v1.SchemeGroupVersion.WithResource("network-attachment-definitions"): + return &genericInformer{resource: resource.GroupResource(), informer: f.K8sCniCncfIo().V1().NetworkAttachmentDefinitions().Informer()}, nil + + } + + return nil, fmt.Errorf("no informer found for %v", resource) +} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go new file mode 100644 index 000000000..edc84dd9b --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -0,0 +1,40 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package internalinterfaces + +import ( + time "time" + + versioned "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + cache "k8s.io/client-go/tools/cache" +) + +// NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer. +type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer + +// SharedInformerFactory a small interface to allow for adding an informer without an import cycle +type SharedInformerFactory interface { + Start(stopCh <-chan struct{}) + InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer +} + +// TweakListOptionsFunc is a function that transforms a v1.ListOptions. +type TweakListOptionsFunc func(*v1.ListOptions) diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/interface.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/interface.go new file mode 100644 index 000000000..f4d418cb0 --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/interface.go @@ -0,0 +1,46 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package k8s + +import ( + internalinterfaces "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces" + v1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface +} + +type group struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/interface.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/interface.go new file mode 100644 index 000000000..aa1b0762f --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + internalinterfaces "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // NetworkAttachmentDefinitions returns a NetworkAttachmentDefinitionInformer. + NetworkAttachmentDefinitions() NetworkAttachmentDefinitionInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// NetworkAttachmentDefinitions returns a NetworkAttachmentDefinitionInformer. +func (v *version) NetworkAttachmentDefinitions() NetworkAttachmentDefinitionInformer { + return &networkAttachmentDefinitionInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/networkattachmentdefinition.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/networkattachmentdefinition.go new file mode 100644 index 000000000..35f2f931d --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1/networkattachmentdefinition.go @@ -0,0 +1,90 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + k8scnicncfiov1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + versioned "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned" + internalinterfaces "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces" + v1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// NetworkAttachmentDefinitionInformer provides access to a shared informer and lister for +// NetworkAttachmentDefinitions. +type NetworkAttachmentDefinitionInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.NetworkAttachmentDefinitionLister +} + +type networkAttachmentDefinitionInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewNetworkAttachmentDefinitionInformer constructs a new informer for NetworkAttachmentDefinition type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewNetworkAttachmentDefinitionInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredNetworkAttachmentDefinitionInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredNetworkAttachmentDefinitionInformer constructs a new informer for NetworkAttachmentDefinition type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredNetworkAttachmentDefinitionInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.K8sCniCncfIoV1().NetworkAttachmentDefinitions(namespace).Watch(context.TODO(), options) + }, + }, + &k8scnicncfiov1.NetworkAttachmentDefinition{}, + resyncPeriod, + indexers, + ) +} + +func (f *networkAttachmentDefinitionInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredNetworkAttachmentDefinitionInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *networkAttachmentDefinitionInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&k8scnicncfiov1.NetworkAttachmentDefinition{}, f.defaultInformer) +} + +func (f *networkAttachmentDefinitionInformer) Lister() v1.NetworkAttachmentDefinitionLister { + return v1.NewNetworkAttachmentDefinitionLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/expansion_generated.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/expansion_generated.go new file mode 100644 index 000000000..cb9a39138 --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +// NetworkAttachmentDefinitionListerExpansion allows custom methods to be added to +// NetworkAttachmentDefinitionLister. +type NetworkAttachmentDefinitionListerExpansion interface{} + +// NetworkAttachmentDefinitionNamespaceListerExpansion allows custom methods to be added to +// NetworkAttachmentDefinitionNamespaceLister. +type NetworkAttachmentDefinitionNamespaceListerExpansion interface{} diff --git a/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/networkattachmentdefinition.go b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/networkattachmentdefinition.go new file mode 100644 index 000000000..fb9b666ed --- /dev/null +++ b/vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1/networkattachmentdefinition.go @@ -0,0 +1,94 @@ +/* +Copyright 2021 The Kubernetes Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// NetworkAttachmentDefinitionLister helps list NetworkAttachmentDefinitions. +type NetworkAttachmentDefinitionLister interface { + // List lists all NetworkAttachmentDefinitions in the indexer. + List(selector labels.Selector) (ret []*v1.NetworkAttachmentDefinition, err error) + // NetworkAttachmentDefinitions returns an object that can list and get NetworkAttachmentDefinitions. + NetworkAttachmentDefinitions(namespace string) NetworkAttachmentDefinitionNamespaceLister + NetworkAttachmentDefinitionListerExpansion +} + +// networkAttachmentDefinitionLister implements the NetworkAttachmentDefinitionLister interface. +type networkAttachmentDefinitionLister struct { + indexer cache.Indexer +} + +// NewNetworkAttachmentDefinitionLister returns a new NetworkAttachmentDefinitionLister. +func NewNetworkAttachmentDefinitionLister(indexer cache.Indexer) NetworkAttachmentDefinitionLister { + return &networkAttachmentDefinitionLister{indexer: indexer} +} + +// List lists all NetworkAttachmentDefinitions in the indexer. +func (s *networkAttachmentDefinitionLister) List(selector labels.Selector) (ret []*v1.NetworkAttachmentDefinition, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.NetworkAttachmentDefinition)) + }) + return ret, err +} + +// NetworkAttachmentDefinitions returns an object that can list and get NetworkAttachmentDefinitions. +func (s *networkAttachmentDefinitionLister) NetworkAttachmentDefinitions(namespace string) NetworkAttachmentDefinitionNamespaceLister { + return networkAttachmentDefinitionNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// NetworkAttachmentDefinitionNamespaceLister helps list and get NetworkAttachmentDefinitions. +type NetworkAttachmentDefinitionNamespaceLister interface { + // List lists all NetworkAttachmentDefinitions in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1.NetworkAttachmentDefinition, err error) + // Get retrieves the NetworkAttachmentDefinition from the indexer for a given namespace and name. + Get(name string) (*v1.NetworkAttachmentDefinition, error) + NetworkAttachmentDefinitionNamespaceListerExpansion +} + +// networkAttachmentDefinitionNamespaceLister implements the NetworkAttachmentDefinitionNamespaceLister +// interface. +type networkAttachmentDefinitionNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all NetworkAttachmentDefinitions in the indexer for a given namespace. +func (s networkAttachmentDefinitionNamespaceLister) List(selector labels.Selector) (ret []*v1.NetworkAttachmentDefinition, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.NetworkAttachmentDefinition)) + }) + return ret, err +} + +// Get retrieves the NetworkAttachmentDefinition from the indexer for a given namespace and name. +func (s networkAttachmentDefinitionNamespaceLister) Get(name string) (*v1.NetworkAttachmentDefinition, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("networkattachmentdefinition"), name) + } + return obj.(*v1.NetworkAttachmentDefinition), nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 2757f189e..437c31851 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -110,8 +110,8 @@ github.com/josharian/intern # github.com/json-iterator/go v1.1.12 ## explicit; go 1.12 github.com/json-iterator/go -# github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 -## explicit; go 1.17 +# github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 +## explicit; go 1.21 github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1 github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned @@ -119,6 +119,11 @@ github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/ github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/scheme github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1 github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1/fake +github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions +github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/internalinterfaces +github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io +github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/informers/externalversions/k8s.cni.cncf.io/v1 +github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/listers/k8s.cni.cncf.io/v1 github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils # github.com/mailru/easyjson v0.7.7 ## explicit; go 1.12