github.com/containerd/Containerd@v1.4.13/services/server/config/config_test.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package config 18 19 import ( 20 "io/ioutil" 21 "os" 22 "path/filepath" 23 "sort" 24 "testing" 25 26 "gotest.tools/v3/assert" 27 28 "github.com/containerd/containerd/plugin" 29 ) 30 31 func TestMergeConfigs(t *testing.T) { 32 a := &Config{ 33 Version: 2, 34 Root: "old_root", 35 RequiredPlugins: []string{"old_plugin"}, 36 DisabledPlugins: []string{"old_plugin"}, 37 State: "old_state", 38 OOMScore: 1, 39 Timeouts: map[string]string{"a": "1"}, 40 StreamProcessors: map[string]StreamProcessor{"1": {Path: "2", Returns: "4"}, "2": {Path: "5"}}, 41 } 42 43 b := &Config{ 44 Root: "new_root", 45 RequiredPlugins: []string{"new_plugin1", "new_plugin2"}, 46 OOMScore: 2, 47 Timeouts: map[string]string{"b": "2"}, 48 StreamProcessors: map[string]StreamProcessor{"1": {Path: "3"}}, 49 } 50 51 err := mergeConfig(a, b) 52 assert.NilError(t, err) 53 54 assert.Equal(t, a.Version, 2) 55 assert.Equal(t, a.Root, "new_root") 56 assert.Equal(t, a.State, "old_state") 57 assert.Equal(t, a.OOMScore, 2) 58 assert.DeepEqual(t, a.RequiredPlugins, []string{"old_plugin", "new_plugin1", "new_plugin2"}) 59 assert.DeepEqual(t, a.DisabledPlugins, []string{"old_plugin"}) 60 assert.DeepEqual(t, a.Timeouts, map[string]string{"a": "1", "b": "2"}) 61 assert.DeepEqual(t, a.StreamProcessors, map[string]StreamProcessor{"1": {Path: "3"}, "2": {Path: "5"}}) 62 } 63 64 func TestResolveImports(t *testing.T) { 65 tempDir, err := ioutil.TempDir("", "containerd_") 66 assert.NilError(t, err) 67 defer os.RemoveAll(tempDir) 68 69 for _, filename := range []string{"config_1.toml", "config_2.toml", "test.toml"} { 70 err = ioutil.WriteFile(filepath.Join(tempDir, filename), []byte(""), 0600) 71 assert.NilError(t, err) 72 } 73 74 imports, err := resolveImports(filepath.Join(tempDir, "root.toml"), []string{ 75 filepath.Join(tempDir, "config_*.toml"), // Glob 76 filepath.Join(tempDir, "./test.toml"), // Path clean up 77 "current.toml", // Resolve current working dir 78 }) 79 assert.NilError(t, err) 80 81 assert.DeepEqual(t, imports, []string{ 82 filepath.Join(tempDir, "config_1.toml"), 83 filepath.Join(tempDir, "config_2.toml"), 84 filepath.Join(tempDir, "test.toml"), 85 filepath.Join(tempDir, "current.toml"), 86 }) 87 } 88 89 func TestLoadSingleConfig(t *testing.T) { 90 data := ` 91 version = 2 92 root = "/var/lib/containerd" 93 94 [stream_processors] 95 [stream_processors."io.containerd.processor.v1.pigz"] 96 accepts = ["application/vnd.docker.image.rootfs.diff.tar.gzip"] 97 path = "unpigz" 98 ` 99 tempDir, err := ioutil.TempDir("", "containerd_") 100 assert.NilError(t, err) 101 defer os.RemoveAll(tempDir) 102 103 path := filepath.Join(tempDir, "config.toml") 104 err = ioutil.WriteFile(path, []byte(data), 0600) 105 assert.NilError(t, err) 106 107 var out Config 108 err = LoadConfig(path, &out) 109 assert.NilError(t, err) 110 assert.Equal(t, 2, out.Version) 111 assert.Equal(t, "/var/lib/containerd", out.Root) 112 assert.DeepEqual(t, map[string]StreamProcessor{ 113 "io.containerd.processor.v1.pigz": { 114 Accepts: []string{"application/vnd.docker.image.rootfs.diff.tar.gzip"}, 115 Path: "unpigz", 116 }, 117 }, out.StreamProcessors) 118 } 119 120 func TestLoadConfigWithImports(t *testing.T) { 121 data1 := ` 122 version = 2 123 root = "/var/lib/containerd" 124 imports = ["data2.toml"] 125 ` 126 127 data2 := ` 128 disabled_plugins = ["io.containerd.v1.xyz"] 129 ` 130 131 tempDir, err := ioutil.TempDir("", "containerd_") 132 assert.NilError(t, err) 133 defer os.RemoveAll(tempDir) 134 135 err = ioutil.WriteFile(filepath.Join(tempDir, "data1.toml"), []byte(data1), 0600) 136 assert.NilError(t, err) 137 138 err = ioutil.WriteFile(filepath.Join(tempDir, "data2.toml"), []byte(data2), 0600) 139 assert.NilError(t, err) 140 141 var out Config 142 err = LoadConfig(filepath.Join(tempDir, "data1.toml"), &out) 143 assert.NilError(t, err) 144 145 assert.Equal(t, 2, out.Version) 146 assert.Equal(t, "/var/lib/containerd", out.Root) 147 assert.DeepEqual(t, []string{"io.containerd.v1.xyz"}, out.DisabledPlugins) 148 } 149 150 func TestLoadConfigWithCircularImports(t *testing.T) { 151 data1 := ` 152 version = 2 153 root = "/var/lib/containerd" 154 imports = ["data2.toml", "data1.toml"] 155 ` 156 157 data2 := ` 158 disabled_plugins = ["io.containerd.v1.xyz"] 159 imports = ["data1.toml", "data2.toml"] 160 ` 161 tempDir, err := ioutil.TempDir("", "containerd_") 162 assert.NilError(t, err) 163 defer os.RemoveAll(tempDir) 164 165 err = ioutil.WriteFile(filepath.Join(tempDir, "data1.toml"), []byte(data1), 0600) 166 assert.NilError(t, err) 167 168 err = ioutil.WriteFile(filepath.Join(tempDir, "data2.toml"), []byte(data2), 0600) 169 assert.NilError(t, err) 170 171 var out Config 172 err = LoadConfig(filepath.Join(tempDir, "data1.toml"), &out) 173 assert.NilError(t, err) 174 175 assert.Equal(t, 2, out.Version) 176 assert.Equal(t, "/var/lib/containerd", out.Root) 177 assert.DeepEqual(t, []string{"io.containerd.v1.xyz"}, out.DisabledPlugins) 178 179 sort.Strings(out.Imports) 180 assert.DeepEqual(t, []string{ 181 filepath.Join(tempDir, "data1.toml"), 182 filepath.Join(tempDir, "data2.toml"), 183 }, out.Imports) 184 } 185 186 func TestDecodePlugin(t *testing.T) { 187 data := ` 188 version = 1 189 [plugins.linux] 190 shim_debug = true 191 ` 192 193 tempDir, err := ioutil.TempDir("", "containerd_") 194 assert.NilError(t, err) 195 defer os.RemoveAll(tempDir) 196 197 path := filepath.Join(tempDir, "config.toml") 198 err = ioutil.WriteFile(path, []byte(data), 0600) 199 assert.NilError(t, err) 200 201 var out Config 202 err = LoadConfig(path, &out) 203 assert.NilError(t, err) 204 205 pluginConfig := map[string]interface{}{} 206 _, err = out.Decode(&plugin.Registration{ID: "linux", Config: &pluginConfig}) 207 assert.NilError(t, err) 208 assert.Equal(t, true, pluginConfig["shim_debug"]) 209 }