11 "github.com/docker/docker/daemon/config"
12 "github.com/docker/docker/pkg/discovery"
13 _ "github.com/docker/docker/pkg/discovery/memory"
14 "github.com/docker/docker/registry"
17 func TestDaemonReloadLabels(t *testing.T) {
19 daemon.configStore = &config.Config{
20 CommonConfig: config.CommonConfig{
21 Labels: []string{"foo:bar"},
25 valuesSets := make(map[string]interface{})
26 valuesSets["labels"] = "foo:baz"
27 newConfig := &config.Config{
28 CommonConfig: config.CommonConfig{
29 Labels: []string{"foo:baz"},
30 ValuesSet: valuesSets,
34 if err := daemon.Reload(newConfig); err != nil {
38 label := daemon.configStore.Labels[0]
39 if label != "foo:baz" {
40 t.Fatalf("Expected daemon label `foo:baz`, got %s", label)
44 func TestDaemonReloadAllowNondistributableArtifacts(t *testing.T) {
46 configStore: &config.Config{},
49 // Initialize daemon with some registries.
50 daemon.RegistryService = registry.NewService(registry.ServiceOptions{
51 AllowNondistributableArtifacts: []string{
54 "10.10.1.22:5000", // This will be removed during reload.
56 "docker2.com", // This will be removed during reload.
60 registries := []string{
63 "10.10.1.33:5000", // This will be added during reload.
65 "docker3.com", // This will be added during reload.
68 newConfig := &config.Config{
69 CommonConfig: config.CommonConfig{
70 ServiceOptions: registry.ServiceOptions{
71 AllowNondistributableArtifacts: registries,
73 ValuesSet: map[string]interface{}{
74 "allow-nondistributable-artifacts": registries,
79 if err := daemon.Reload(newConfig); err != nil {
84 serviceConfig := daemon.RegistryService.ServiceConfig()
85 for _, value := range serviceConfig.AllowNondistributableArtifactsCIDRs {
86 actual = append(actual, value.String())
88 for _, value := range serviceConfig.AllowNondistributableArtifactsHostnames {
89 actual = append(actual, value)
92 sort.Strings(registries)
94 if !reflect.DeepEqual(registries, actual) {
95 t.Fatalf("expected %v, got %v\n", registries, actual)
99 func TestDaemonReloadMirrors(t *testing.T) {
101 daemon.RegistryService = registry.NewService(registry.ServiceOptions{
102 InsecureRegistries: []string{},
104 "https://mirror.test1.com",
105 "https://mirror.test2.com", // this will be removed when reloading
106 "https://mirror.test3.com", // this will be removed when reloading
110 daemon.configStore = &config.Config{}
118 loadMirrors := []pair{
121 mirrors: []string{"10.10.1.11:5000"}, // this mirror is invalid
126 mirrors: []string{"mirror.test1.com"}, // this mirror is invalid
131 mirrors: []string{"10.10.1.11:5000", "mirror.test1.com"}, // mirrors are invalid
136 mirrors: []string{"https://mirror.test1.com", "https://mirror.test4.com"},
137 after: []string{"https://mirror.test1.com/", "https://mirror.test4.com/"},
141 for _, value := range loadMirrors {
142 valuesSets := make(map[string]interface{})
143 valuesSets["registry-mirrors"] = value.mirrors
145 newConfig := &config.Config{
146 CommonConfig: config.CommonConfig{
147 ServiceOptions: registry.ServiceOptions{
148 Mirrors: value.mirrors,
150 ValuesSet: valuesSets,
154 err := daemon.Reload(newConfig)
155 if !value.valid && err == nil {
156 // mirrors should be invalid, should be a non-nil error
157 t.Fatalf("Expected daemon reload error with invalid mirrors: %s, while get nil", value.mirrors)
162 // mirrors should be valid, should be no error
165 registryService := daemon.RegistryService.ServiceConfig()
167 if len(registryService.Mirrors) != len(value.after) {
168 t.Fatalf("Expected %d daemon mirrors %s while get %d with %s",
171 len(registryService.Mirrors),
172 registryService.Mirrors)
175 dataMap := map[string]struct{}{}
177 for _, mirror := range registryService.Mirrors {
178 if _, exist := dataMap[mirror]; !exist {
179 dataMap[mirror] = struct{}{}
183 for _, address := range value.after {
184 if _, exist := dataMap[address]; !exist {
185 t.Fatalf("Expected %s in daemon mirrors, while get none", address)
192 func TestDaemonReloadInsecureRegistries(t *testing.T) {
194 // initialize daemon with existing insecure registries: "127.0.0.0/8", "10.10.1.11:5000", "10.10.1.22:5000"
195 daemon.RegistryService = registry.NewService(registry.ServiceOptions{
196 InsecureRegistries: []string{
199 "10.10.1.22:5000", // this will be removed when reloading
201 "docker2.com", // this will be removed when reloading
205 daemon.configStore = &config.Config{}
207 insecureRegistries := []string{
208 "127.0.0.0/8", // this will be kept
209 "10.10.1.11:5000", // this will be kept
210 "10.10.1.33:5000", // this will be newly added
211 "docker1.com", // this will be kept
212 "docker3.com", // this will be newly added
215 valuesSets := make(map[string]interface{})
216 valuesSets["insecure-registries"] = insecureRegistries
218 newConfig := &config.Config{
219 CommonConfig: config.CommonConfig{
220 ServiceOptions: registry.ServiceOptions{
221 InsecureRegistries: insecureRegistries,
223 ValuesSet: valuesSets,
227 if err := daemon.Reload(newConfig); err != nil {
231 // After Reload, daemon.RegistryService will be changed which is useful
232 // for registry communication in daemon.
233 registries := daemon.RegistryService.ServiceConfig()
235 // After Reload(), newConfig has come to registries.InsecureRegistryCIDRs and registries.IndexConfigs in daemon.
236 // Then collect registries.InsecureRegistryCIDRs in dataMap.
237 // When collecting, we need to convert CIDRS into string as a key,
238 // while the times of key appears as value.
239 dataMap := map[string]int{}
240 for _, value := range registries.InsecureRegistryCIDRs {
241 if _, ok := dataMap[value.String()]; !ok {
242 dataMap[value.String()] = 1
244 dataMap[value.String()]++
248 for _, value := range registries.IndexConfigs {
249 if _, ok := dataMap[value.Name]; !ok {
250 dataMap[value.Name] = 1
252 dataMap[value.Name]++
256 // Finally compare dataMap with the original insecureRegistries.
257 // Each value in insecureRegistries should appear in daemon's insecure registries,
258 // and each can only appear exactly ONCE.
259 for _, r := range insecureRegistries {
260 if value, ok := dataMap[r]; !ok {
261 t.Fatalf("Expected daemon insecure registry %s, got none", r)
262 } else if value != 1 {
263 t.Fatalf("Expected only 1 daemon insecure registry %s, got %d", r, value)
267 // assert if "10.10.1.22:5000" is removed when reloading
268 if value, ok := dataMap["10.10.1.22:5000"]; ok {
269 t.Fatalf("Expected no insecure registry of 10.10.1.22:5000, got %d", value)
272 // assert if "docker2.com" is removed when reloading
273 if value, ok := dataMap["docker2.com"]; ok {
274 t.Fatalf("Expected no insecure registry of docker2.com, got %d", value)
278 func TestDaemonReloadNotAffectOthers(t *testing.T) {
280 daemon.configStore = &config.Config{
281 CommonConfig: config.CommonConfig{
282 Labels: []string{"foo:bar"},
287 valuesSets := make(map[string]interface{})
288 valuesSets["labels"] = "foo:baz"
289 newConfig := &config.Config{
290 CommonConfig: config.CommonConfig{
291 Labels: []string{"foo:baz"},
292 ValuesSet: valuesSets,
296 if err := daemon.Reload(newConfig); err != nil {
300 label := daemon.configStore.Labels[0]
301 if label != "foo:baz" {
302 t.Fatalf("Expected daemon label `foo:baz`, got %s", label)
304 debug := daemon.configStore.Debug
306 t.Fatal("Expected debug 'enabled', got 'disabled'")
310 func TestDaemonDiscoveryReload(t *testing.T) {
312 daemon.configStore = &config.Config{
313 CommonConfig: config.CommonConfig{
314 ClusterStore: "memory://127.0.0.1",
315 ClusterAdvertise: "127.0.0.1:3333",
319 if err := daemon.initDiscovery(daemon.configStore); err != nil {
323 expected := discovery.Entries{
324 &discovery.Entry{Host: "127.0.0.1", Port: "3333"},
328 case <-time.After(10 * time.Second):
329 t.Fatal("timeout waiting for discovery")
330 case <-daemon.discoveryWatcher.ReadyCh():
333 stopCh := make(chan struct{})
335 ch, errCh := daemon.discoveryWatcher.Watch(stopCh)
338 case <-time.After(1 * time.Second):
339 t.Fatal("failed to get discovery advertisements in time")
341 if !reflect.DeepEqual(e, expected) {
342 t.Fatalf("expected %v, got %v\n", expected, e)
348 valuesSets := make(map[string]interface{})
349 valuesSets["cluster-store"] = "memory://127.0.0.1:2222"
350 valuesSets["cluster-advertise"] = "127.0.0.1:5555"
351 newConfig := &config.Config{
352 CommonConfig: config.CommonConfig{
353 ClusterStore: "memory://127.0.0.1:2222",
354 ClusterAdvertise: "127.0.0.1:5555",
355 ValuesSet: valuesSets,
359 expected = discovery.Entries{
360 &discovery.Entry{Host: "127.0.0.1", Port: "5555"},
363 if err := daemon.Reload(newConfig); err != nil {
368 case <-time.After(10 * time.Second):
369 t.Fatal("timeout waiting for discovery")
370 case <-daemon.discoveryWatcher.ReadyCh():
373 ch, errCh = daemon.discoveryWatcher.Watch(stopCh)
376 case <-time.After(1 * time.Second):
377 t.Fatal("failed to get discovery advertisements in time")
379 if !reflect.DeepEqual(e, expected) {
380 t.Fatalf("expected %v, got %v\n", expected, e)
387 func TestDaemonDiscoveryReloadFromEmptyDiscovery(t *testing.T) {
389 daemon.configStore = &config.Config{}
391 valuesSet := make(map[string]interface{})
392 valuesSet["cluster-store"] = "memory://127.0.0.1:2222"
393 valuesSet["cluster-advertise"] = "127.0.0.1:5555"
394 newConfig := &config.Config{
395 CommonConfig: config.CommonConfig{
396 ClusterStore: "memory://127.0.0.1:2222",
397 ClusterAdvertise: "127.0.0.1:5555",
398 ValuesSet: valuesSet,
402 expected := discovery.Entries{
403 &discovery.Entry{Host: "127.0.0.1", Port: "5555"},
406 if err := daemon.Reload(newConfig); err != nil {
411 case <-time.After(10 * time.Second):
412 t.Fatal("timeout waiting for discovery")
413 case <-daemon.discoveryWatcher.ReadyCh():
416 stopCh := make(chan struct{})
418 ch, errCh := daemon.discoveryWatcher.Watch(stopCh)
421 case <-time.After(1 * time.Second):
422 t.Fatal("failed to get discovery advertisements in time")
424 if !reflect.DeepEqual(e, expected) {
425 t.Fatalf("expected %v, got %v\n", expected, e)
432 func TestDaemonDiscoveryReloadOnlyClusterAdvertise(t *testing.T) {
434 daemon.configStore = &config.Config{
435 CommonConfig: config.CommonConfig{
436 ClusterStore: "memory://127.0.0.1",
439 valuesSets := make(map[string]interface{})
440 valuesSets["cluster-advertise"] = "127.0.0.1:5555"
441 newConfig := &config.Config{
442 CommonConfig: config.CommonConfig{
443 ClusterAdvertise: "127.0.0.1:5555",
444 ValuesSet: valuesSets,
447 expected := discovery.Entries{
448 &discovery.Entry{Host: "127.0.0.1", Port: "5555"},
451 if err := daemon.Reload(newConfig); err != nil {
456 case <-daemon.discoveryWatcher.ReadyCh():
457 case <-time.After(10 * time.Second):
458 t.Fatal("Timeout waiting for discovery")
460 stopCh := make(chan struct{})
462 ch, errCh := daemon.discoveryWatcher.Watch(stopCh)
465 case <-time.After(1 * time.Second):
466 t.Fatal("failed to get discovery advertisements in time")
468 if !reflect.DeepEqual(e, expected) {
469 t.Fatalf("expected %v, got %v\n", expected, e)