From 7a8ad491ef8e9025cd8038cd587f1f14608fab8e Mon Sep 17 00:00:00 2001 From: Renaud Gaubert Date: Fri, 18 Aug 2017 15:17:43 -0700 Subject: [PATCH] Alpha feature integration --- pkg/features/kube_features.go | 8 ++++++++ pkg/kubelet/deviceplugin/endpoint_test.go | 15 +++++++++++++-- pkg/kubelet/deviceplugin/manager_test.go | 14 +++++++++++--- pkg/kubelet/kubelet.go | 14 ++++++++------ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 7b5e8a8132b..37aee4e1ae3 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -73,6 +73,13 @@ const ( // Works only with Docker Container Runtime. Accelerators utilfeature.Feature = "Accelerators" + // owner: @vishh + // alpha: v1.8 + // + // Enables support for Device Plugins + // Only Nvidia GPUs are supported as of v1.8. + DevicePlugins utilfeature.Feature = "DevicePlugins" + // owner: @gmarek // alpha: v1.6 // @@ -155,6 +162,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS ExperimentalHostUserNamespaceDefaultingGate: {Default: false, PreRelease: utilfeature.Beta}, ExperimentalCriticalPodAnnotation: {Default: false, PreRelease: utilfeature.Alpha}, Accelerators: {Default: false, PreRelease: utilfeature.Alpha}, + DevicePlugins: {Default: false, PreRelease: utilfeature.Alpha}, TaintBasedEvictions: {Default: false, PreRelease: utilfeature.Alpha}, RotateKubeletServerCertificate: {Default: false, PreRelease: utilfeature.Alpha}, RotateKubeletClientCertificate: {Default: true, PreRelease: utilfeature.Beta}, diff --git a/pkg/kubelet/deviceplugin/endpoint_test.go b/pkg/kubelet/deviceplugin/endpoint_test.go index 8898b3dd133..9713584949e 100644 --- a/pkg/kubelet/deviceplugin/endpoint_test.go +++ b/pkg/kubelet/deviceplugin/endpoint_test.go @@ -17,6 +17,8 @@ limitations under the License. package deviceplugin import ( + "os" + "path" "testing" "time" @@ -25,11 +27,14 @@ import ( pluginapi "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1alpha1" ) -const ( - socket = "/tmp/mock.sock" +var ( + esocketName = "mock.sock" ) func TestNewEndpoint(t *testing.T) { + wd, _ := os.Getwd() + socket := path.Join(wd, esocketName) + devs := []*pluginapi.Device{ {ID: "ADeviceId", Health: pluginapi.Healthy}, } @@ -39,6 +44,9 @@ func TestNewEndpoint(t *testing.T) { } func TestList(t *testing.T) { + wd, _ := os.Getwd() + socket := path.Join(wd, esocketName) + devs := []*pluginapi.Device{ {ID: "ADeviceId", Health: pluginapi.Healthy}, } @@ -62,6 +70,9 @@ func TestList(t *testing.T) { } func TestListAndWatch(t *testing.T) { + wd, _ := os.Getwd() + socket := path.Join(wd, esocketName) + devs := []*pluginapi.Device{ {ID: "ADeviceId", Health: pluginapi.Healthy}, {ID: "AnotherDeviceId", Health: pluginapi.Healthy}, diff --git a/pkg/kubelet/deviceplugin/manager_test.go b/pkg/kubelet/deviceplugin/manager_test.go index 8aed51007d1..2816339887e 100644 --- a/pkg/kubelet/deviceplugin/manager_test.go +++ b/pkg/kubelet/deviceplugin/manager_test.go @@ -17,6 +17,8 @@ limitations under the License. package deviceplugin import ( + "os" + "path" "testing" "github.com/stretchr/testify/require" @@ -25,19 +27,25 @@ import ( ) const ( - msocket = "/tmp/server.sock" + msocketName = "/tmp/server.sock" ) func TestNewManagerImpl(t *testing.T) { + wd, _ := os.Getwd() + socket := path.Join(wd, msocketName) + _, err := NewManagerImpl("", func(n string, a, u, r []*pluginapi.Device) {}) require.Error(t, err) - _, err = NewManagerImpl(msocket, func(n string, a, u, r []*pluginapi.Device) {}) + _, err = NewManagerImpl(socket, func(n string, a, u, r []*pluginapi.Device) {}) require.NoError(t, err) } func TestNewManagerImplStart(t *testing.T) { - _, err := NewManagerImpl(msocket, func(n string, a, u, r []*pluginapi.Device) {}) + wd, _ := os.Getwd() + socket := path.Join(wd, msocketName) + + _, err := NewManagerImpl(socket, func(n string, a, u, r []*pluginapi.Device) {}) require.NoError(t, err) } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index e145df62109..b2ede83cc9a 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -754,13 +754,15 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, return nil, err } - devicePluginHdlr, err := cm.NewDevicePluginHandler() - if err != nil { - return nil, err + if utilfeature.DefaultFeatureGate.Enabled(features.DevicePlugins) { + devicePluginHdlr, err := cm.NewDevicePluginHandler() + if err != nil { + return nil, err + } + + klet.containerManager.SetDevicePluginHandler(devicePluginHdlr) + } - - klet.containerManager.SetDevicePluginHandler(devicePluginHdlr) - // If the experimentalMounterPathFlag is set, we do not want to // check node capabilities since the mount path is not the default if len(kubeCfg.ExperimentalMounterPath) != 0 {