Skip to content

Commit 2667197

Browse files
cdesiniotiselezar
andcommitted
Opt-out of drop-in config files if RUNTIME_DROP_IN_CONFIG is empty
This change allows users to opt-out of using drop-in config files when configuring containerd or crio. This is useful in cases where the top-level config is a templated config file. Co-authored-by: Christopher Desiniotis <[email protected]> Co-authored-by: Evan Lezar <[email protected]>
1 parent 8295a7b commit 2667197

File tree

9 files changed

+148
-9
lines changed

9 files changed

+148
-9
lines changed

cmd/nvidia-ctk-installer/container/runtime/containerd/config_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,113 @@ version = 3
17771777

17781778
require.NoFileExists(t, co.DropInConfig)
17791779

1780+
return nil
1781+
},
1782+
},
1783+
{
1784+
description: "setting drop-in-config to empty modifies existing config",
1785+
containerOptions: container.Options{
1786+
TopLevelConfigPath: "{{ .testRoot }}/etc/containerd/config.toml",
1787+
DropInConfig: "",
1788+
RuntimeName: "nvidia",
1789+
RuntimeDir: "/usr/bin",
1790+
SetAsDefault: false,
1791+
RestartMode: "none",
1792+
ExecutablePath: "not-containerd",
1793+
},
1794+
options: Options{
1795+
runtimeType: "io.containerd.runc.v2",
1796+
},
1797+
prepareEnvironment: func(t *testing.T, co *container.Options, o *Options) error {
1798+
require.NoError(t, os.MkdirAll(filepath.Dir(co.TopLevelConfigPath), 0755))
1799+
1800+
initialConfig := `version = 2
1801+
1802+
[plugins]
1803+
[plugins."io.containerd.grpc.v1.cri"]
1804+
[plugins."io.containerd.grpc.v1.cri".containerd]
1805+
default_runtime_name = "runc"
1806+
1807+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
1808+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
1809+
runtime_type = "io.containerd.runc.v2"
1810+
1811+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
1812+
BinaryName = "/usr/bin/runc"
1813+
`
1814+
require.NoError(t, os.WriteFile(co.TopLevelConfigPath, []byte(initialConfig), 0600))
1815+
return nil
1816+
},
1817+
assertSetupPostConditions: func(t *testing.T, co *container.Options, o *Options) error {
1818+
require.FileExists(t, co.TopLevelConfigPath)
1819+
1820+
actual, err := os.ReadFile(co.TopLevelConfigPath)
1821+
require.NoError(t, err)
1822+
1823+
expected := `version = 2
1824+
1825+
[plugins]
1826+
1827+
[plugins."io.containerd.grpc.v1.cri"]
1828+
1829+
[plugins."io.containerd.grpc.v1.cri".containerd]
1830+
default_runtime_name = "runc"
1831+
1832+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
1833+
1834+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
1835+
runtime_type = "io.containerd.runc.v2"
1836+
1837+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
1838+
BinaryName = "/usr/bin/nvidia-container-runtime"
1839+
1840+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi]
1841+
runtime_type = "io.containerd.runc.v2"
1842+
1843+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi.options]
1844+
BinaryName = "/usr/bin/nvidia-container-runtime.cdi"
1845+
1846+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy]
1847+
runtime_type = "io.containerd.runc.v2"
1848+
1849+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy.options]
1850+
BinaryName = "/usr/bin/nvidia-container-runtime.legacy"
1851+
1852+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
1853+
runtime_type = "io.containerd.runc.v2"
1854+
1855+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
1856+
BinaryName = "/usr/bin/runc"
1857+
`
1858+
require.Equal(t, expected, string(actual))
1859+
1860+
return nil
1861+
},
1862+
assertCleanupPostConditions: func(t *testing.T, co *container.Options, o *Options) error {
1863+
require.FileExists(t, co.TopLevelConfigPath)
1864+
1865+
actual, err := os.ReadFile(co.TopLevelConfigPath)
1866+
require.NoError(t, err)
1867+
1868+
expected := `version = 2
1869+
1870+
[plugins]
1871+
1872+
[plugins."io.containerd.grpc.v1.cri"]
1873+
1874+
[plugins."io.containerd.grpc.v1.cri".containerd]
1875+
default_runtime_name = "runc"
1876+
1877+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
1878+
1879+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
1880+
runtime_type = "io.containerd.runc.v2"
1881+
1882+
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
1883+
BinaryName = "/usr/bin/runc"
1884+
`
1885+
require.Equal(t, expected, string(actual))
1886+
17801887
return nil
17811888
},
17821889
},

cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ func getRuntimeConfig(o *container.Options, co *Options) (engine.Interface, erro
183183
containerd.WithRuntimeType(co.runtimeType),
184184
containerd.WithUseLegacyConfig(co.useLegacyConfig),
185185
containerd.WithContainerAnnotations(co.containerAnnotationsFromCDIPrefixes()...),
186+
containerd.WithDisableDropInConfig(o.DropInConfig == ""),
186187
}
187188
if o.DropInConfigHostPath != "" && o.DropInConfig != "" {
188189
options = append(options,

cmd/nvidia-ctk-installer/container/runtime/crio/crio.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,5 +222,6 @@ func getRuntimeConfig(o *container.Options) (engine.Interface, error) {
222222
toml.FromFile(o.TopLevelConfigPath),
223223
),
224224
),
225+
crio.WithDisableDropInConfig(o.DropInConfig == ""),
225226
)
226227
}

cmd/nvidia-ctk-installer/container/runtime/runtime.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func Flags(opts *Options) []cli.Flag {
5656
},
5757
&cli.StringFlag{
5858
Name: "drop-in-config",
59-
Usage: "Path to the NVIDIA-specific drop-in config file",
59+
Usage: "Path to the NVIDIA-specific drop-in config file. If this is empty, the top-level config is modified directly.",
6060
Value: runtimeSpecificDefault,
6161
Destination: &opts.DropInConfig,
6262
Sources: cli.EnvVars("RUNTIME_DROP_IN_CONFIG"),

cmd/nvidia-ctk/runtime/configure/configure.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,14 @@ func (m command) configureConfigFile(config *config) error {
302302
containerd.WithLogger(m.logger),
303303
containerd.WithTopLevelConfigPath(config.configFilePath),
304304
containerd.WithConfigSource(configSource),
305+
containerd.WithDisableDropInConfig(config.dropInConfigPath == ""),
305306
)
306307
case "crio":
307308
cfg, err = crio.New(
308309
crio.WithLogger(m.logger),
309310
crio.WithTopLevelConfigPath(config.configFilePath),
310311
crio.WithConfigSource(configSource),
312+
crio.WithDisableDropInConfig(config.dropInConfigPath == ""),
311313
)
312314
case "docker":
313315
cfg, err = docker.New(

pkg/config/engine/containerd/containerd.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type configOptions struct {
5050
// for the CRI runtime service. The name of this plugin was changed in v3 of the
5151
// containerd configuration file.
5252
CRIRuntimePluginName string
53+
DisableDropInConfig bool
5354
}
5455

5556
var _ engine.Interface = (*Config)(nil)
@@ -122,6 +123,10 @@ func New(opts ...Option) (engine.Interface, error) {
122123
// We return the sourceConfig as is.
123124
return (*ConfigV1)(sourceConfig), nil
124125
default:
126+
if b.disableDropInConfig {
127+
b.logger.Info("Drop-in config files are disabled. Modifying the source config directly.")
128+
return sourceConfig, nil
129+
}
125130
// For other versions, we create a DropInConfig with a reference to the
126131
// top-level config if present.
127132
topLevelConfig := &Config{

pkg/config/engine/containerd/option.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ type builder struct {
3131
containerAnnotations []string
3232

3333
containerToHostPathMap map[string]string
34+
35+
disableDropInConfig bool
3436
}
3537

3638
// Option defines a function that can be used to configure the config builder
@@ -97,3 +99,10 @@ func WithContainerAnnotations(containerAnnotations ...string) Option {
9799
b.containerAnnotations = containerAnnotations
98100
}
99101
}
102+
103+
// WithDisableDropInConfig disables the use of drop-in config files
104+
func WithDisableDropInConfig(disable bool) Option {
105+
return func(b *builder) {
106+
b.disableDropInConfig = disable
107+
}
108+
}

pkg/config/engine/crio/crio.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,22 @@ func New(opts ...Option) (engine.Interface, error) {
6262
b.configSource = toml.FromFile(b.topLevelConfigPath)
6363
}
6464

65-
sourceConfig, err := b.configSource.Load()
65+
sourceConfigTree, err := b.configSource.Load()
6666
if err != nil {
6767
return nil, err
6868
}
6969

70+
sourceConfig := &Config{
71+
Tree: sourceConfigTree,
72+
Logger: b.logger,
73+
}
74+
75+
if b.disableDropInConfig {
76+
return sourceConfig, nil
77+
}
78+
7079
cfg := &engine.Config{
71-
Source: &Config{
72-
Tree: sourceConfig,
73-
Logger: b.logger,
74-
},
80+
Source: sourceConfig,
7581
Destination: &Config{
7682
Tree: toml.NewEmpty(),
7783
Logger: b.logger,

pkg/config/engine/crio/option.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,22 @@ import (
2222
)
2323

2424
type builder struct {
25-
logger logger.Interface
26-
configSource toml.Loader
27-
topLevelConfigPath string
25+
logger logger.Interface
26+
configSource toml.Loader
27+
topLevelConfigPath string
28+
disableDropInConfig bool
2829
}
2930

3031
// Option defines a function that can be used to configure the config builder
3132
type Option func(*builder)
3233

34+
// WithDisableDropInConfig disables the use of drop-in config files
35+
func WithDisableDropInConfig(disable bool) Option {
36+
return func(b *builder) {
37+
b.disableDropInConfig = disable
38+
}
39+
}
40+
3341
// WithLogger sets the logger for the config builder
3442
func WithLogger(logger logger.Interface) Option {
3543
return func(b *builder) {

0 commit comments

Comments
 (0)