update_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package service // import "github.com/docker/docker/integration/service"
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/docker/docker/api/types"
  6. swarmtypes "github.com/docker/docker/api/types/swarm"
  7. "github.com/docker/docker/client"
  8. "github.com/docker/docker/integration/internal/swarm"
  9. "gotest.tools/assert"
  10. is "gotest.tools/assert/cmp"
  11. "gotest.tools/skip"
  12. )
  13. func TestServiceUpdateLabel(t *testing.T) {
  14. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  15. defer setupTest(t)()
  16. d := swarm.NewSwarm(t, testEnv)
  17. defer d.Stop(t)
  18. cli := d.NewClientT(t)
  19. defer cli.Close()
  20. ctx := context.Background()
  21. serviceName := "TestService_" + t.Name()
  22. serviceID := swarm.CreateService(t, d, swarm.ServiceWithName(serviceName))
  23. service := getService(t, cli, serviceID)
  24. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{}))
  25. // add label to empty set
  26. service.Spec.Labels["foo"] = "bar"
  27. _, err := cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  28. assert.NilError(t, err)
  29. service = getService(t, cli, serviceID)
  30. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{"foo": "bar"}))
  31. // add label to non-empty set
  32. service.Spec.Labels["foo2"] = "bar"
  33. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  34. assert.NilError(t, err)
  35. service = getService(t, cli, serviceID)
  36. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{"foo": "bar", "foo2": "bar"}))
  37. delete(service.Spec.Labels, "foo2")
  38. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  39. assert.NilError(t, err)
  40. service = getService(t, cli, serviceID)
  41. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{"foo": "bar"}))
  42. delete(service.Spec.Labels, "foo")
  43. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  44. assert.NilError(t, err)
  45. service = getService(t, cli, serviceID)
  46. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{}))
  47. // now make sure we can add again
  48. service.Spec.Labels["foo"] = "bar"
  49. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  50. assert.NilError(t, err)
  51. service = getService(t, cli, serviceID)
  52. assert.Check(t, is.DeepEqual(service.Spec.Labels, map[string]string{"foo": "bar"}))
  53. err = cli.ServiceRemove(context.Background(), serviceID)
  54. assert.NilError(t, err)
  55. }
  56. func TestServiceUpdateSecrets(t *testing.T) {
  57. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  58. defer setupTest(t)()
  59. d := swarm.NewSwarm(t, testEnv)
  60. defer d.Stop(t)
  61. cli := d.NewClientT(t)
  62. defer cli.Close()
  63. ctx := context.Background()
  64. secretName := "TestSecret_" + t.Name()
  65. secretTarget := "targetName"
  66. resp, err := cli.SecretCreate(ctx, swarmtypes.SecretSpec{
  67. Annotations: swarmtypes.Annotations{
  68. Name: secretName,
  69. },
  70. Data: []byte("TESTINGDATA"),
  71. })
  72. assert.NilError(t, err)
  73. assert.Check(t, resp.ID != "")
  74. serviceName := "TestService_" + t.Name()
  75. serviceID := swarm.CreateService(t, d, swarm.ServiceWithName(serviceName))
  76. service := getService(t, cli, serviceID)
  77. // add secret
  78. service.Spec.TaskTemplate.ContainerSpec.Secrets = append(service.Spec.TaskTemplate.ContainerSpec.Secrets,
  79. &swarmtypes.SecretReference{
  80. File: &swarmtypes.SecretReferenceFileTarget{
  81. Name: secretTarget,
  82. },
  83. SecretID: resp.ID,
  84. SecretName: secretName,
  85. },
  86. )
  87. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  88. assert.NilError(t, err)
  89. service = getService(t, cli, serviceID)
  90. secrets := service.Spec.TaskTemplate.ContainerSpec.Secrets
  91. assert.Assert(t, is.Equal(1, len(secrets)))
  92. secret := *secrets[0]
  93. assert.Check(t, is.Equal(secretName, secret.SecretName))
  94. assert.Check(t, nil != secret.File)
  95. assert.Check(t, is.Equal(secretTarget, secret.File.Name))
  96. // remove
  97. service.Spec.TaskTemplate.ContainerSpec.Secrets = []*swarmtypes.SecretReference{}
  98. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  99. assert.NilError(t, err)
  100. service = getService(t, cli, serviceID)
  101. assert.Check(t, is.Equal(0, len(service.Spec.TaskTemplate.ContainerSpec.Secrets)))
  102. err = cli.ServiceRemove(context.Background(), serviceID)
  103. assert.NilError(t, err)
  104. }
  105. func TestServiceUpdateConfigs(t *testing.T) {
  106. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  107. defer setupTest(t)()
  108. d := swarm.NewSwarm(t, testEnv)
  109. defer d.Stop(t)
  110. cli := d.NewClientT(t)
  111. defer cli.Close()
  112. ctx := context.Background()
  113. configName := "TestConfig_" + t.Name()
  114. configTarget := "targetName"
  115. resp, err := cli.ConfigCreate(ctx, swarmtypes.ConfigSpec{
  116. Annotations: swarmtypes.Annotations{
  117. Name: configName,
  118. },
  119. Data: []byte("TESTINGDATA"),
  120. })
  121. assert.NilError(t, err)
  122. assert.Check(t, resp.ID != "")
  123. serviceName := "TestService_" + t.Name()
  124. serviceID := swarm.CreateService(t, d, swarm.ServiceWithName(serviceName))
  125. service := getService(t, cli, serviceID)
  126. // add config
  127. service.Spec.TaskTemplate.ContainerSpec.Configs = append(service.Spec.TaskTemplate.ContainerSpec.Configs,
  128. &swarmtypes.ConfigReference{
  129. File: &swarmtypes.ConfigReferenceFileTarget{
  130. Name: configTarget,
  131. },
  132. ConfigID: resp.ID,
  133. ConfigName: configName,
  134. },
  135. )
  136. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  137. assert.NilError(t, err)
  138. service = getService(t, cli, serviceID)
  139. configs := service.Spec.TaskTemplate.ContainerSpec.Configs
  140. assert.Assert(t, is.Equal(1, len(configs)))
  141. config := *configs[0]
  142. assert.Check(t, is.Equal(configName, config.ConfigName))
  143. assert.Check(t, nil != config.File)
  144. assert.Check(t, is.Equal(configTarget, config.File.Name))
  145. // remove
  146. service.Spec.TaskTemplate.ContainerSpec.Configs = []*swarmtypes.ConfigReference{}
  147. _, err = cli.ServiceUpdate(ctx, serviceID, service.Version, service.Spec, types.ServiceUpdateOptions{})
  148. assert.NilError(t, err)
  149. service = getService(t, cli, serviceID)
  150. assert.Check(t, is.Equal(0, len(service.Spec.TaskTemplate.ContainerSpec.Configs)))
  151. err = cli.ServiceRemove(context.Background(), serviceID)
  152. assert.NilError(t, err)
  153. }
  154. func getService(t *testing.T, cli client.ServiceAPIClient, serviceID string) swarmtypes.Service {
  155. t.Helper()
  156. service, _, err := cli.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
  157. assert.NilError(t, err)
  158. return service
  159. }