diff --git a/pkg/kubelet/container/runtime.go b/pkg/kubelet/container/runtime.go index 440f8b370e7..83c872916eb 100644 --- a/pkg/kubelet/container/runtime.go +++ b/pkg/kubelet/container/runtime.go @@ -530,8 +530,8 @@ const ( type RuntimeStatus struct { // Conditions is an array of current observed runtime conditions. Conditions []RuntimeCondition - // Handlers is a map of current available handlers - Handlers map[string]RuntimeHandler + // Handlers is an array of current available handlers + Handlers []RuntimeHandler } // GetRuntimeCondition gets a specified runtime condition from the runtime status. diff --git a/pkg/kubelet/kubelet_getters.go b/pkg/kubelet/kubelet_getters.go index e435d568906..a32f197143f 100644 --- a/pkg/kubelet/kubelet_getters.go +++ b/pkg/kubelet/kubelet_getters.go @@ -123,11 +123,12 @@ func (kl *Kubelet) HandlerSupportsUserNamespaces(rtHandler string) (bool, error) if rtHandlers == nil { return false, fmt.Errorf("runtime handlers are not set") } - h, found := rtHandlers[rtHandler] - if !found { - return false, fmt.Errorf("the handler %q is not known", rtHandler) + for _, h := range rtHandlers { + if h.Name == rtHandler { + return h.SupportsUserNamespaces, nil + } } - return h.SupportsUserNamespaces, nil + return false, fmt.Errorf("the handler %q is not known", rtHandler) } // GetKubeletMappings gets the additional IDs allocated for the Kubelet. diff --git a/pkg/kubelet/kubelet_getters_test.go b/pkg/kubelet/kubelet_getters_test.go index 75938e61040..71f95417201 100644 --- a/pkg/kubelet/kubelet_getters_test.go +++ b/pkg/kubelet/kubelet_getters_test.go @@ -109,13 +109,13 @@ func TestHandlerSupportsUserNamespaces(t *testing.T) { defer testKubelet.Cleanup() kubelet := testKubelet.kubelet - kubelet.runtimeState.setRuntimeHandlers(map[string]kubecontainer.RuntimeHandler{ - "has-support": { + kubelet.runtimeState.setRuntimeHandlers([]kubecontainer.RuntimeHandler{ + { Name: "has-support", SupportsUserNamespaces: true, }, - "has-no-support": { - Name: "has-support", + { + Name: "has-no-support", SupportsUserNamespaces: false, }, }) diff --git a/pkg/kubelet/kuberuntime/helpers.go b/pkg/kubelet/kuberuntime/helpers.go index ea3a4e4b53e..9c2d1b500b2 100644 --- a/pkg/kubelet/kuberuntime/helpers.go +++ b/pkg/kubelet/kuberuntime/helpers.go @@ -219,13 +219,13 @@ func toKubeRuntimeStatus(status *runtimeapi.RuntimeStatus, handlers []*runtimeap Message: c.Message, }) } - retHandlers := make(map[string]kubecontainer.RuntimeHandler) - for _, h := range handlers { + retHandlers := make([]kubecontainer.RuntimeHandler, len(handlers)) + for i, h := range handlers { supportsUserns := false if h.Features != nil { supportsUserns = h.Features.UserNamespaces } - retHandlers[h.Name] = kubecontainer.RuntimeHandler{ + retHandlers[i] = kubecontainer.RuntimeHandler{ Name: h.Name, SupportsUserNamespaces: supportsUserns, } diff --git a/pkg/kubelet/runtime.go b/pkg/kubelet/runtime.go index cc16dfdcd52..43335d8f957 100644 --- a/pkg/kubelet/runtime.go +++ b/pkg/kubelet/runtime.go @@ -35,7 +35,7 @@ type runtimeState struct { storageError error cidr string healthChecks []*healthCheck - rtHandlers map[string]kubecontainer.RuntimeHandler + rtHandlers []kubecontainer.RuntimeHandler } // A health check function should be efficient and not rely on external @@ -71,13 +71,13 @@ func (s *runtimeState) setRuntimeState(err error) { s.runtimeError = err } -func (s *runtimeState) setRuntimeHandlers(rtHandlers map[string]kubecontainer.RuntimeHandler) { +func (s *runtimeState) setRuntimeHandlers(rtHandlers []kubecontainer.RuntimeHandler) { s.Lock() defer s.Unlock() s.rtHandlers = rtHandlers } -func (s *runtimeState) runtimeHandlers() map[string]kubecontainer.RuntimeHandler { +func (s *runtimeState) runtimeHandlers() []kubecontainer.RuntimeHandler { s.RLock() defer s.RUnlock() return s.rtHandlers