health_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //go:build !windows
  2. package container // import "github.com/docker/docker/daemon/cluster/executor/container"
  3. import (
  4. "context"
  5. "testing"
  6. "time"
  7. containertypes "github.com/docker/docker/api/types/container"
  8. eventtypes "github.com/docker/docker/api/types/events"
  9. "github.com/docker/docker/container"
  10. "github.com/docker/docker/daemon"
  11. "github.com/docker/docker/daemon/events"
  12. "github.com/moby/swarmkit/v2/api"
  13. )
  14. func TestHealthStates(t *testing.T) {
  15. // set up environment: events, task, container ....
  16. e := events.New()
  17. _, l, _ := e.Subscribe()
  18. defer e.Evict(l)
  19. task := &api.Task{
  20. ID: "id",
  21. ServiceID: "sid",
  22. Spec: api.TaskSpec{
  23. Runtime: &api.TaskSpec_Container{
  24. Container: &api.ContainerSpec{
  25. Image: "image_name",
  26. Labels: map[string]string{
  27. "com.docker.swarm.task.id": "id",
  28. },
  29. },
  30. },
  31. },
  32. Annotations: api.Annotations{Name: "name"},
  33. }
  34. c := &container.Container{
  35. ID: "id",
  36. Name: "name",
  37. Config: &containertypes.Config{
  38. Image: "image_name",
  39. Labels: map[string]string{
  40. "com.docker.swarm.task.id": "id",
  41. },
  42. },
  43. }
  44. daemon := &daemon.Daemon{
  45. EventsService: e,
  46. }
  47. controller, err := newController(daemon, nil, nil, task, nil, nil)
  48. if err != nil {
  49. t.Fatalf("create controller fail %v", err)
  50. }
  51. errChan := make(chan error, 1)
  52. ctx, cancel := context.WithCancel(context.Background())
  53. defer cancel()
  54. // fire checkHealth
  55. go func() {
  56. err := controller.checkHealth(ctx)
  57. select {
  58. case errChan <- err:
  59. case <-ctx.Done():
  60. }
  61. }()
  62. // send an event and expect to get expectedErr
  63. // if expectedErr is nil, shouldn't get any error
  64. logAndExpect := func(msg eventtypes.Action, expectedErr error) {
  65. daemon.LogContainerEvent(c, msg)
  66. timer := time.NewTimer(1 * time.Second)
  67. defer timer.Stop()
  68. select {
  69. case err := <-errChan:
  70. if err != expectedErr {
  71. t.Fatalf("expect error %v, but get %v", expectedErr, err)
  72. }
  73. case <-timer.C:
  74. if expectedErr != nil {
  75. t.Fatal("time limit exceeded, didn't get expected error")
  76. }
  77. }
  78. }
  79. // events that are ignored by checkHealth
  80. logAndExpect(eventtypes.ActionHealthStatusRunning, nil)
  81. logAndExpect(eventtypes.ActionHealthStatusHealthy, nil)
  82. logAndExpect(eventtypes.ActionDie, nil)
  83. // unhealthy event will be caught by checkHealth
  84. logAndExpect(eventtypes.ActionHealthStatusUnhealthy, ErrContainerUnhealthy)
  85. }