From 205c3899619d0b83a9cccb47a219bc7c7d2c8759 Mon Sep 17 00:00:00 2001 From: "xinjun.jiang" Date: Sat, 5 Sep 2026 21:05:28 +0800 Subject: [PATCH] fix: preserve Docker feature flags when enabling CDI Use the decoded map type when enabling CDI so existing Docker feature flags survive. Cover file-based configuration updates and repeated load/enable/save cycles to verify idempotency. Signed-off-by: xinjun.jiang Signed-off-by: git-jxj <65210887+git-jxj@users.noreply.github.com> Co-authored-by: Christopher Desiniotis --- pkg/config/engine/docker/docker.go | 4 ++-- pkg/config/engine/docker/docker_test.go | 30 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/pkg/config/engine/docker/docker.go b/pkg/config/engine/docker/docker.go index 53e09b67d..fb6f502f5 100644 --- a/pkg/config/engine/docker/docker.go +++ b/pkg/config/engine/docker/docker.go @@ -110,9 +110,9 @@ func (c *Config) EnableCDI() { } config := *c - features, ok := config["features"].(map[string]bool) + features, ok := config["features"].(map[string]any) if !ok { - features = make(map[string]bool) + features = make(map[string]any) } features["cdi"] = true diff --git a/pkg/config/engine/docker/docker_test.go b/pkg/config/engine/docker/docker_test.go index 9dd3f21d5..b5ea75c03 100644 --- a/pkg/config/engine/docker/docker_test.go +++ b/pkg/config/engine/docker/docker_test.go @@ -19,6 +19,8 @@ package docker import ( "encoding/json" "fmt" + "os" + "path/filepath" "testing" "github.com/stretchr/testify/require" @@ -247,3 +249,31 @@ func TestGetRuntimeConfig(t *testing.T) { require.Equal(t, tc.expected, rc.GetBinaryPath()) } } + +func TestEnableCDIPreservesFeaturesFromFile(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + {"missing features", `{}`, `{"features":{"cdi":true}}`}, + {"empty features", `{"features":{}}`, `{"features":{"cdi":true}}`}, + {"existing flags", `{"features":{"containerd-snapshotter":true,"buildkit":false},"debug":true}`, `{"features":{"cdi":true,"containerd-snapshotter":true,"buildkit":false},"debug":true}`}, + {"CDI disabled", `{"features":{"cdi":false,"containerd-snapshotter":true}}`, `{"features":{"cdi":true,"containerd-snapshotter":true}}`}, + {"CDI enabled", `{"features":{"cdi":true,"containerd-snapshotter":true}}`, `{"features":{"cdi":true,"containerd-snapshotter":true}}`}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + path := filepath.Join(t.TempDir(), "daemon.json") + require.NoError(t, os.WriteFile(path, []byte(tc.input), 0o600)) + cfg, err := New(WithPath(path)) + require.NoError(t, err) + cfg.EnableCDI() + _, err = cfg.Save(path) + require.NoError(t, err) + contents, err := os.ReadFile(path) + require.NoError(t, err) + require.JSONEq(t, tc.expected, string(contents)) + }) + } +}