From 2339c11a154c2bdc46659ee41127c8c5e2227773 Mon Sep 17 00:00:00 2001 From: Tomofumi Hayashi Date: Sat, 22 May 2021 03:39:43 +0900 Subject: [PATCH] Remove global variables from kubletclient Fixes #673 --- pkg/k8sclient/k8sclient.go | 2 +- pkg/kubeletclient/kubeletclient.go | 28 ++++++------ pkg/kubeletclient/kubeletclient_test.go | 60 ++++++------------------- 3 files changed, 29 insertions(+), 61 deletions(-) diff --git a/pkg/k8sclient/k8sclient.go b/pkg/k8sclient/k8sclient.go index 4e78ea5f9..0e0c2585c 100644 --- a/pkg/k8sclient/k8sclient.go +++ b/pkg/k8sclient/k8sclient.go @@ -259,7 +259,7 @@ func getKubernetesDelegate(client *ClientInfo, net *types.NetworkSelectionElemen logging.Debugf("getKubernetesDelegate: found resourceName annotation : %s", resourceName) if resourceMap == nil { - ck, err := kubeletclient.GetResourceClient() + ck, err := kubeletclient.GetResourceClient("") if err != nil { return nil, resourceMap, logging.Errorf("getKubernetesDelegate: failed to get a ResourceClient instance: %v", err) } diff --git a/pkg/kubeletclient/kubeletclient.go b/pkg/kubeletclient/kubeletclient.go index f7200c611..8910bddf5 100644 --- a/pkg/kubeletclient/kubeletclient.go +++ b/pkg/kubeletclient/kubeletclient.go @@ -1,8 +1,8 @@ package kubeletclient import ( + "net/url" "os" - "path/filepath" "time" "golang.org/x/net/context" @@ -18,27 +18,26 @@ import ( const ( defaultKubeletSocketFile = "kubelet.sock" defaultPodResourcesMaxSize = 1024 * 1024 * 16 // 16 Mb -) - -var ( - kubeletSocket string - defaultPodResourcesPath = "/var/lib/kubelet/pod-resources" + defaultPodResourcesPath = "/var/lib/kubelet/pod-resources" ) // GetResourceClient returns an instance of ResourceClient interface initialized with Pod resource information -func GetResourceClient() (types.ResourceClient, error) { +func GetResourceClient(kubeletSocket string) (types.ResourceClient, error) { // If Kubelet resource API endpoint exist use that by default // Or else fallback with checkpoint file - if hasKubeletAPIEndpoint() { + if kubeletSocket == "" { + kubeletSocket = util.LocalEndpoint(defaultPodResourcesPath, podresources.Socket) + } + if hasKubeletAPIEndpoint(kubeletSocket) { logging.Debugf("GetResourceClient: using Kubelet resource API endpoint") - return getKubeletClient() + return getKubeletClient(kubeletSocket) } logging.Debugf("GetResourceClient: using Kubelet device plugin checkpoint") return checkpoint.GetCheckpoint() } -func getKubeletClient() (types.ResourceClient, error) { +func getKubeletClient(kubeletSocket string) (types.ResourceClient, error) { newClient := &kubeletClient{} if kubeletSocket == "" { kubeletSocket = util.LocalEndpoint(defaultPodResourcesPath, podresources.Socket) @@ -102,10 +101,13 @@ func (rc *kubeletClient) GetPodResourceMap(pod *v1.Pod) (map[string]*types.Resou return resourceMap, nil } -func hasKubeletAPIEndpoint() bool { +func hasKubeletAPIEndpoint(endpoint string) bool { + u, err := url.Parse(endpoint) + if err != nil { + return false + } // Check for kubelet resource API socket file - kubeletAPISocket := filepath.Join(defaultPodResourcesPath, defaultKubeletSocketFile) - if _, err := os.Stat(kubeletAPISocket); err != nil { + if _, err := os.Stat(u.Path); err != nil { logging.Debugf("hasKubeletAPIEndpoint: error looking up kubelet resource api socket file: %q", err) return false } diff --git a/pkg/kubeletclient/kubeletclient_test.go b/pkg/kubeletclient/kubeletclient_test.go index b573f4624..cc3477534 100644 --- a/pkg/kubeletclient/kubeletclient_test.go +++ b/pkg/kubeletclient/kubeletclient_test.go @@ -63,25 +63,27 @@ func TestKubeletclient(t *testing.T) { RunSpecs(t, "Kubeletclient Suite") } +var testKubeletSocket string func setUp() error { tempSocketDir, err := ioutil.TempDir("", "kubelet-resource-client") if err != nil { return err } - defaultPodResourcesPath = filepath.Join(tempSocketDir, defaultPodResourcesPath) + testingPodResourcesPath := filepath.Join(tempSocketDir, defaultPodResourcesPath) - if err := os.MkdirAll(defaultPodResourcesPath, os.ModeDir); err != nil { + if err := os.MkdirAll(testingPodResourcesPath, os.ModeDir); err != nil { return err } - socketDir = defaultPodResourcesPath + socketDir = testingPodResourcesPath socketName = filepath.Join(socketDir, "kubelet.sock") + testKubeletSocket = socketName fakeServer = &fakeResourceServer{server: grpc.NewServer()} podresourcesapi.RegisterPodResourcesListerServer(fakeServer.server, fakeServer) lis, err := util.CreateListener(socketName) if err != nil { - return nil + return err } go fakeServer.server.Serve(lis) return nil @@ -109,14 +111,12 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { Context("GetResourceClient()", func() { It("should return no error", func() { - kubeletSocket = socketName - _, err := GetResourceClient() + _, err := GetResourceClient(testKubeletSocket) Expect(err).NotTo(HaveOccurred()) }) It("should fail with missing file", func() { - kubeletSocket = "sampleSocketString" - _, err := GetResourceClient() + _, err := GetResourceClient("sampleSocketString") Expect(err).To(HaveOccurred()) }) }) @@ -138,37 +138,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { }, }, } - kubeletSocket = socketName - client, err := getKubeletClient() - Expect(err).NotTo(HaveOccurred()) - - outputRMap := map[string]*mtypes.ResourceInfo{ - "resource": &mtypes.ResourceInfo{DeviceIDs: []string{"dev0", "dev1"}}, - } - resourceMap, err := client.GetPodResourceMap(fakePod) - Expect(err).NotTo(HaveOccurred()) - Expect(resourceMap).ShouldNot(BeNil()) - Expect(resourceMap).To(Equal(outputRMap)) - }) - - It("should return no error with empty socket", func() { - podUID := k8sTypes.UID("970a395d-bb3b-11e8-89df-408d5c537d23") - fakePod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-name", - Namespace: "pod-namespace", - UID: podUID, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "container-name", - }, - }, - }, - } - kubeletSocket = "" - client, err := getKubeletClient() + client, err := getKubeletClient(testKubeletSocket) Expect(err).NotTo(HaveOccurred()) outputRMap := map[string]*mtypes.ResourceInfo{ @@ -181,8 +151,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { }) It("should return an error with garbage socket value", func() { - kubeletSocket = "/badfilepath!?//" - _, err := getKubeletClient() + _, err := getKubeletClient("/badfilepath!?//") Expect(err).To(HaveOccurred()) }) }) @@ -197,8 +166,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { UID: podUID, }, } - kubeletSocket = socketName - client, err := getKubeletClient() + client, err := getKubeletClient(testKubeletSocket) Expect(err).NotTo(HaveOccurred()) _, err = client.GetPodResourceMap(fakePod) Expect(err).To(HaveOccurred()) @@ -215,8 +183,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { UID: podUID, }, } - kubeletSocket = socketName - client, err := getKubeletClient() + client, err := getKubeletClient(testKubeletSocket) Expect(err).NotTo(HaveOccurred()) _, err = client.GetPodResourceMap(fakePod) Expect(err).To(HaveOccurred()) @@ -234,8 +201,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() { }, } - kubeletSocket = socketName - client, err := getKubeletClient() + client, err := getKubeletClient(testKubeletSocket) Expect(err).NotTo(HaveOccurred()) emptyRMap := map[string]*mtypes.ResourceInfo{}