Skip to content

Commit 23b2970

Browse files
authored
Merge pull request #862 from elezar/add-v3-containerd-config
Add support for containerd version 3 config
2 parents 3da3e51 + 2918059 commit 23b2970

File tree

14 files changed

+359
-182
lines changed

14 files changed

+359
-182
lines changed

pkg/config/engine/api.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ package engine
1818

1919
// Interface defines the API for a runtime config updater.
2020
type Interface interface {
21-
DefaultRuntime() string
2221
AddRuntime(string, string, bool) error
23-
Set(string, interface{})
22+
DefaultRuntime() string
23+
GetRuntimeConfig(string) (RuntimeConfig, error)
2424
RemoveRuntime(string) error
2525
Save(string) (int64, error)
26-
GetRuntimeConfig(string) (RuntimeConfig, error)
26+
Set(string, interface{})
27+
String() string
2728
}
2829

2930
// RuntimeConfig defines the interface to query container runtime handler configuration

pkg/config/engine/containerd/config_v2.go renamed to pkg/config/engine/containerd/config.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,40 @@ func (c *Config) AddRuntime(name string, path string, setAsDefault bool) error {
3030
}
3131
config := *c.Tree
3232

33-
config.Set("version", int64(2))
33+
config.Set("version", c.Version)
3434

3535
runtimeNamesForConfig := engine.GetLowLevelRuntimes(c)
3636
for _, r := range runtimeNamesForConfig {
37-
options := config.GetSubtreeByPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", r})
37+
options := config.GetSubtreeByPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", r})
3838
if options == nil {
3939
continue
4040
}
4141
c.Logger.Debugf("using options from runtime %v: %v", r, options)
42-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name}, options.Copy())
42+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name}, options.Copy())
4343
break
4444
}
4545

46-
if config.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name}) == nil {
46+
if config.GetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name}) == nil {
4747
c.Logger.Warningf("could not infer options from runtimes %v; using defaults", runtimeNamesForConfig)
48-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "runtime_type"}, c.RuntimeType)
49-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "runtime_root"}, "")
50-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "runtime_engine"}, "")
51-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "privileged_without_host_devices"}, false)
48+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "runtime_type"}, c.RuntimeType)
49+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "runtime_root"}, "")
50+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "runtime_engine"}, "")
51+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "privileged_without_host_devices"}, false)
5252
}
5353

5454
if len(c.ContainerAnnotations) > 0 {
55-
annotations, err := c.getRuntimeAnnotations([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "container_annotations"})
55+
annotations, err := c.getRuntimeAnnotations([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "container_annotations"})
5656
if err != nil {
5757
return err
5858
}
5959
annotations = append(c.ContainerAnnotations, annotations...)
60-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "container_annotations"}, annotations)
60+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "container_annotations"}, annotations)
6161
}
6262

63-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name, "options", "BinaryName"}, path)
63+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name, "options", "BinaryName"}, path)
6464

6565
if setAsDefault {
66-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}, name)
66+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "default_runtime_name"}, name)
6767
}
6868

6969
*c.Tree = config
@@ -99,13 +99,13 @@ func (c *Config) getRuntimeAnnotations(path []string) ([]string, error) {
9999
// Set sets the specified containerd option.
100100
func (c *Config) Set(key string, value interface{}) {
101101
config := *c.Tree
102-
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", key}, value)
102+
config.SetPath([]string{"plugins", c.CRIRuntimePluginName, key}, value)
103103
*c.Tree = config
104104
}
105105

106106
// DefaultRuntime returns the default runtime for the cri-o config
107107
func (c Config) DefaultRuntime() string {
108-
if runtime, ok := c.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}).(string); ok {
108+
if runtime, ok := c.GetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "default_runtime_name"}).(string); ok {
109109
return runtime
110110
}
111111
return ""
@@ -119,14 +119,14 @@ func (c *Config) RemoveRuntime(name string) error {
119119

120120
config := *c.Tree
121121

122-
config.DeletePath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name})
123-
if runtime, ok := config.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}).(string); ok {
122+
config.DeletePath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name})
123+
if runtime, ok := config.GetPath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "default_runtime_name"}).(string); ok {
124124
if runtime == name {
125-
config.DeletePath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"})
125+
config.DeletePath([]string{"plugins", c.CRIRuntimePluginName, "containerd", "default_runtime_name"})
126126
}
127127
}
128128

129-
runtimePath := []string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "runtimes", name}
129+
runtimePath := []string{"plugins", c.CRIRuntimePluginName, "containerd", "runtimes", name}
130130
for i := 0; i < len(runtimePath); i++ {
131131
if runtimes, ok := config.GetPath(runtimePath[:len(runtimePath)-i]).(*toml.Tree); ok {
132132
if len(runtimes.Keys()) == 0 {

pkg/config/engine/containerd/config_v2_test.go renamed to pkg/config/engine/containerd/config_test.go

Lines changed: 74 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestAddRuntime(t *testing.T) {
4646
privileged_without_host_devices = false
4747
runtime_engine = ""
4848
runtime_root = ""
49-
runtime_type = ""
49+
runtime_type = "io.containerd.runc.v2"
5050
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.test.options]
5151
BinaryName = "/usr/bin/test"
5252
`,
@@ -195,24 +195,85 @@ func TestAddRuntime(t *testing.T) {
195195
SystemdCgroup = false
196196
`,
197197
},
198+
{
199+
description: "empty v3 spec is supported",
200+
config: `
201+
version = 3
202+
`,
203+
expectedConfig: `
204+
version = 3
205+
[plugins]
206+
[plugins."io.containerd.cri.v1.runtime"]
207+
[plugins."io.containerd.cri.v1.runtime".containerd]
208+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes]
209+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.test]
210+
privileged_without_host_devices = false
211+
runtime_engine = ""
212+
runtime_root = ""
213+
runtime_type = "io.containerd.runc.v2"
214+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.test.options]
215+
BinaryName = "/usr/bin/test"
216+
`,
217+
expectedError: nil,
218+
},
219+
{
220+
description: "v3 spec is supported",
221+
config: `
222+
version = 3
223+
[plugins]
224+
[plugins."io.containerd.cri.v1.runtime"]
225+
[plugins."io.containerd.cri.v1.runtime".containerd]
226+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes]
227+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc]
228+
privileged_without_host_devices = true
229+
runtime_engine = "engine"
230+
runtime_root = "root"
231+
runtime_type = "type"
232+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc.options]
233+
BinaryName = "/usr/bin/runc"
234+
SystemdCgroup = true
235+
`,
236+
expectedConfig: `
237+
version = 3
238+
[plugins]
239+
[plugins."io.containerd.cri.v1.runtime"]
240+
[plugins."io.containerd.cri.v1.runtime".containerd]
241+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes]
242+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc]
243+
privileged_without_host_devices = true
244+
runtime_engine = "engine"
245+
runtime_root = "root"
246+
runtime_type = "type"
247+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc.options]
248+
BinaryName = "/usr/bin/runc"
249+
SystemdCgroup = true
250+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.test]
251+
privileged_without_host_devices = true
252+
runtime_engine = "engine"
253+
runtime_root = "root"
254+
runtime_type = "type"
255+
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.test.options]
256+
BinaryName = "/usr/bin/test"
257+
SystemdCgroup = true
258+
`,
259+
},
198260
}
199261

200262
for _, tc := range testCases {
201263
t.Run(tc.description, func(t *testing.T) {
202-
cfg, err := toml.Load(tc.config)
203-
require.NoError(t, err)
204264
expectedConfig, err := toml.Load(tc.expectedConfig)
205265
require.NoError(t, err)
206266

207-
c := &Config{
208-
Logger: logger,
209-
Tree: cfg,
210-
}
267+
c, err := New(
268+
WithLogger(logger),
269+
WithConfigSource(toml.FromString(tc.config)),
270+
)
271+
require.NoError(t, err)
211272

212273
err = c.AddRuntime("test", "/usr/bin/test", tc.setAsDefault)
213274
require.NoError(t, err)
214275

215-
require.EqualValues(t, expectedConfig.String(), cfg.String())
276+
require.EqualValues(t, expectedConfig.String(), c.String())
216277
})
217278
}
218279
}
@@ -299,13 +360,13 @@ func TestGetRuntimeConfig(t *testing.T) {
299360

300361
for _, tc := range testCases {
301362
t.Run(tc.description, func(t *testing.T) {
302-
cfg, err := toml.Load(config)
363+
364+
c, err := New(
365+
WithLogger(logger),
366+
WithConfigSource(toml.FromString(config)),
367+
)
303368
require.NoError(t, err)
304369

305-
c := &Config{
306-
Logger: logger,
307-
Tree: cfg,
308-
}
309370
rc, err := c.GetRuntimeConfig(tc.runtime)
310371
require.Equal(t, tc.expectedError, err)
311372
require.Equal(t, tc.expected, rc.GetBinaryPath())

pkg/config/engine/containerd/config_v1.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,20 @@ func (c *ConfigV1) AddRuntime(name string, path string, setAsDefault bool) error
7070
config.SetPath([]string{"plugins", "cri", "containerd", "runtimes", name, "options", "BinaryName"}, path)
7171
config.SetPath([]string{"plugins", "cri", "containerd", "runtimes", name, "options", "Runtime"}, path)
7272

73-
if setAsDefault && c.UseDefaultRuntimeName {
74-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime_name"}, name)
75-
} else if setAsDefault {
76-
// Note: This is deprecated in containerd 1.4.0 and will be removed in 1.5.0
77-
if config.GetPath([]string{"plugins", "cri", "containerd", "default_runtime"}) == nil {
78-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_type"}, c.RuntimeType)
79-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_root"}, "")
80-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_engine"}, "")
81-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "privileged_without_host_devices"}, false)
73+
if setAsDefault {
74+
if !c.UseLegacyConfig {
75+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime_name"}, name)
76+
} else {
77+
// Note: This is deprecated in containerd 1.4.0 and will be removed in 1.5.0
78+
if config.GetPath([]string{"plugins", "cri", "containerd", "default_runtime"}) == nil {
79+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_type"}, c.RuntimeType)
80+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_root"}, "")
81+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "runtime_engine"}, "")
82+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "privileged_without_host_devices"}, false)
83+
}
84+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "options", "BinaryName"}, path)
85+
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "options", "Runtime"}, path)
8286
}
83-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "options", "BinaryName"}, path)
84-
config.SetPath([]string{"plugins", "cri", "containerd", "default_runtime", "options", "Runtime"}, path)
8587
}
8688

8789
*c.Tree = config

pkg/config/engine/containerd/config_v1_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -200,20 +200,21 @@ func TestAddRuntimeV1(t *testing.T) {
200200

201201
for _, tc := range testCases {
202202
t.Run(tc.description, func(t *testing.T) {
203-
cfg, err := toml.Load(tc.config)
204-
require.NoError(t, err)
205203
expectedConfig, err := toml.Load(tc.expectedConfig)
206204
require.NoError(t, err)
207205

208-
c := &ConfigV1{
209-
Logger: logger,
210-
Tree: cfg,
211-
}
206+
c, err := New(
207+
WithLogger(logger),
208+
WithConfigSource(toml.FromString(tc.config)),
209+
WithUseLegacyConfig(true),
210+
WithRuntimeType(""),
211+
)
212+
require.NoError(t, err)
212213

213214
err = c.AddRuntime("test", "/usr/bin/test", tc.setAsDefault)
214215
require.NoError(t, err)
215216

216-
require.EqualValues(t, expectedConfig.String(), cfg.String())
217+
require.EqualValues(t, expectedConfig.String(), c.String())
217218
})
218219
}
219220
}

0 commit comments

Comments
 (0)