mirror of
https://github.com/k8snetworkplumbingwg/multus-cni.git
synced 2025-09-10 13:22:14 +00:00
committed by
Tomofumi Hayashi
parent
2ba3d3cda2
commit
2339c11a15
@@ -259,7 +259,7 @@ func getKubernetesDelegate(client *ClientInfo, net *types.NetworkSelectionElemen
|
|||||||
logging.Debugf("getKubernetesDelegate: found resourceName annotation : %s", resourceName)
|
logging.Debugf("getKubernetesDelegate: found resourceName annotation : %s", resourceName)
|
||||||
|
|
||||||
if resourceMap == nil {
|
if resourceMap == nil {
|
||||||
ck, err := kubeletclient.GetResourceClient()
|
ck, err := kubeletclient.GetResourceClient("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resourceMap, logging.Errorf("getKubernetesDelegate: failed to get a ResourceClient instance: %v", err)
|
return nil, resourceMap, logging.Errorf("getKubernetesDelegate: failed to get a ResourceClient instance: %v", err)
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
package kubeletclient
|
package kubeletclient
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
@@ -18,27 +18,26 @@ import (
|
|||||||
const (
|
const (
|
||||||
defaultKubeletSocketFile = "kubelet.sock"
|
defaultKubeletSocketFile = "kubelet.sock"
|
||||||
defaultPodResourcesMaxSize = 1024 * 1024 * 16 // 16 Mb
|
defaultPodResourcesMaxSize = 1024 * 1024 * 16 // 16 Mb
|
||||||
)
|
defaultPodResourcesPath = "/var/lib/kubelet/pod-resources"
|
||||||
|
|
||||||
var (
|
|
||||||
kubeletSocket string
|
|
||||||
defaultPodResourcesPath = "/var/lib/kubelet/pod-resources"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetResourceClient returns an instance of ResourceClient interface initialized with Pod resource information
|
// 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
|
// If Kubelet resource API endpoint exist use that by default
|
||||||
// Or else fallback with checkpoint file
|
// 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")
|
logging.Debugf("GetResourceClient: using Kubelet resource API endpoint")
|
||||||
return getKubeletClient()
|
return getKubeletClient(kubeletSocket)
|
||||||
}
|
}
|
||||||
|
|
||||||
logging.Debugf("GetResourceClient: using Kubelet device plugin checkpoint")
|
logging.Debugf("GetResourceClient: using Kubelet device plugin checkpoint")
|
||||||
return checkpoint.GetCheckpoint()
|
return checkpoint.GetCheckpoint()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getKubeletClient() (types.ResourceClient, error) {
|
func getKubeletClient(kubeletSocket string) (types.ResourceClient, error) {
|
||||||
newClient := &kubeletClient{}
|
newClient := &kubeletClient{}
|
||||||
if kubeletSocket == "" {
|
if kubeletSocket == "" {
|
||||||
kubeletSocket = util.LocalEndpoint(defaultPodResourcesPath, podresources.Socket)
|
kubeletSocket = util.LocalEndpoint(defaultPodResourcesPath, podresources.Socket)
|
||||||
@@ -102,10 +101,13 @@ func (rc *kubeletClient) GetPodResourceMap(pod *v1.Pod) (map[string]*types.Resou
|
|||||||
return resourceMap, nil
|
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
|
// Check for kubelet resource API socket file
|
||||||
kubeletAPISocket := filepath.Join(defaultPodResourcesPath, defaultKubeletSocketFile)
|
if _, err := os.Stat(u.Path); err != nil {
|
||||||
if _, err := os.Stat(kubeletAPISocket); err != nil {
|
|
||||||
logging.Debugf("hasKubeletAPIEndpoint: error looking up kubelet resource api socket file: %q", err)
|
logging.Debugf("hasKubeletAPIEndpoint: error looking up kubelet resource api socket file: %q", err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@@ -63,25 +63,27 @@ func TestKubeletclient(t *testing.T) {
|
|||||||
RunSpecs(t, "Kubeletclient Suite")
|
RunSpecs(t, "Kubeletclient Suite")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var testKubeletSocket string
|
||||||
func setUp() error {
|
func setUp() error {
|
||||||
tempSocketDir, err := ioutil.TempDir("", "kubelet-resource-client")
|
tempSocketDir, err := ioutil.TempDir("", "kubelet-resource-client")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
socketDir = defaultPodResourcesPath
|
socketDir = testingPodResourcesPath
|
||||||
socketName = filepath.Join(socketDir, "kubelet.sock")
|
socketName = filepath.Join(socketDir, "kubelet.sock")
|
||||||
|
testKubeletSocket = socketName
|
||||||
|
|
||||||
fakeServer = &fakeResourceServer{server: grpc.NewServer()}
|
fakeServer = &fakeResourceServer{server: grpc.NewServer()}
|
||||||
podresourcesapi.RegisterPodResourcesListerServer(fakeServer.server, fakeServer)
|
podresourcesapi.RegisterPodResourcesListerServer(fakeServer.server, fakeServer)
|
||||||
lis, err := util.CreateListener(socketName)
|
lis, err := util.CreateListener(socketName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
go fakeServer.server.Serve(lis)
|
go fakeServer.server.Serve(lis)
|
||||||
return nil
|
return nil
|
||||||
@@ -109,14 +111,12 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() {
|
|||||||
|
|
||||||
Context("GetResourceClient()", func() {
|
Context("GetResourceClient()", func() {
|
||||||
It("should return no error", func() {
|
It("should return no error", func() {
|
||||||
kubeletSocket = socketName
|
_, err := GetResourceClient(testKubeletSocket)
|
||||||
_, err := GetResourceClient()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should fail with missing file", func() {
|
It("should fail with missing file", func() {
|
||||||
kubeletSocket = "sampleSocketString"
|
_, err := GetResourceClient("sampleSocketString")
|
||||||
_, err := GetResourceClient()
|
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -138,37 +138,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
kubeletSocket = socketName
|
client, err := getKubeletClient(testKubeletSocket)
|
||||||
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()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
outputRMap := map[string]*mtypes.ResourceInfo{
|
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() {
|
It("should return an error with garbage socket value", func() {
|
||||||
kubeletSocket = "/badfilepath!?//"
|
_, err := getKubeletClient("/badfilepath!?//")
|
||||||
_, err := getKubeletClient()
|
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -197,8 +166,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() {
|
|||||||
UID: podUID,
|
UID: podUID,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
kubeletSocket = socketName
|
client, err := getKubeletClient(testKubeletSocket)
|
||||||
client, err := getKubeletClient()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
_, err = client.GetPodResourceMap(fakePod)
|
_, err = client.GetPodResourceMap(fakePod)
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
@@ -215,8 +183,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() {
|
|||||||
UID: podUID,
|
UID: podUID,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
kubeletSocket = socketName
|
client, err := getKubeletClient(testKubeletSocket)
|
||||||
client, err := getKubeletClient()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
_, err = client.GetPodResourceMap(fakePod)
|
_, err = client.GetPodResourceMap(fakePod)
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
@@ -234,8 +201,7 @@ var _ = Describe("Kubelet resource endpoint data read operations", func() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
kubeletSocket = socketName
|
client, err := getKubeletClient(testKubeletSocket)
|
||||||
client, err := getKubeletClient()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
emptyRMap := map[string]*mtypes.ResourceInfo{}
|
emptyRMap := map[string]*mtypes.ResourceInfo{}
|
||||||
|
Reference in New Issue
Block a user