Fix backword-compatibility issue of non-versioned config file

According to the doc about `config.toml` of containerd:

```
If no version number is specified inside the config file then it is assumed to
be a version 1 config and parsed as such.
```

However, it's not true recently.
This will break the backward-compatibility in some environment.
This commit fixes this issue.

Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
This commit is contained in:
ktock 2021-04-14 17:22:36 +09:00
parent 5c6ea7fdc1
commit fdb76f55d8
3 changed files with 32 additions and 1 deletions

View File

@ -120,7 +120,11 @@ var configCommand = cli.Command{
func platformAgnosticDefaultConfig() *srvconfig.Config { func platformAgnosticDefaultConfig() *srvconfig.Config {
return &srvconfig.Config{ return &srvconfig.Config{
Version: 2, // see: https://github.com/containerd/containerd/blob/5c6ea7fdc1247939edaddb1eba62a94527418687/RELEASES.md#daemon-configuration
// this version MUST remain set to 1 until either there exists a means to
// override / configure the default at the containerd cli .. or when
// version 1 is no longer supported
Version: 1,
Root: defaults.DefaultRootDir, Root: defaults.DefaultRootDir,
State: defaults.DefaultStateDir, State: defaults.DefaultStateDir,
GRPC: srvconfig.GRPCConfig{ GRPC: srvconfig.GRPCConfig{

View File

@ -98,6 +98,7 @@ func (c *Config) ValidateV2() error {
version := c.GetVersion() version := c.GetVersion()
if version < 2 { if version < 2 {
logrus.Warnf("deprecated version : `%d`, please switch to version `2`", version) logrus.Warnf("deprecated version : `%d`, please switch to version `2`", version)
return nil
} }
for _, p := range c.DisabledPlugins { for _, p := range c.DisabledPlugins {
if len(strings.Split(p, ".")) < 4 { if len(strings.Split(p, ".")) < 4 {

View File

@ -207,3 +207,29 @@ version = 2
assert.NilError(t, err) assert.NilError(t, err)
assert.Equal(t, true, pluginConfig["shim_debug"]) assert.Equal(t, true, pluginConfig["shim_debug"])
} }
// TestDecodePluginInV1Config tests decoding non-versioned
// config (should be parsed as V1 config).
func TestDecodePluginInV1Config(t *testing.T) {
data := `
[plugins.linux]
shim_debug = true
`
tempDir, err := ioutil.TempDir("", "containerd_")
assert.NilError(t, err)
defer os.RemoveAll(tempDir)
path := filepath.Join(tempDir, "config.toml")
err = ioutil.WriteFile(path, []byte(data), 0600)
assert.NilError(t, err)
var out Config
err = LoadConfig(path, &out)
assert.NilError(t, err)
pluginConfig := map[string]interface{}{}
_, err = out.Decode(&plugin.Registration{ID: "linux", Config: &pluginConfig})
assert.NilError(t, err)
assert.Equal(t, true, pluginConfig["shim_debug"])
}