github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/daemon/cluster/executor/container/health_test.go (about)

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