github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/testutil/daemon/node.go (about)

     1  package daemon
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/demonoid81/moby/api/types"
    10  	"github.com/demonoid81/moby/api/types/swarm"
    11  	"gotest.tools/v3/assert"
    12  )
    13  
    14  // NodeConstructor defines a swarm node constructor
    15  type NodeConstructor func(*swarm.Node)
    16  
    17  // GetNode returns a swarm node identified by the specified id
    18  func (d *Daemon) GetNode(t testing.TB, id string, errCheck ...func(error) bool) *swarm.Node {
    19  	t.Helper()
    20  	cli := d.NewClientT(t)
    21  	defer cli.Close()
    22  
    23  	node, _, err := cli.NodeInspectWithRaw(context.Background(), id)
    24  	if err != nil {
    25  		for _, f := range errCheck {
    26  			if f(err) {
    27  				return nil
    28  			}
    29  		}
    30  	}
    31  	assert.NilError(t, err, "[%s] (*Daemon).GetNode: NodeInspectWithRaw(%q) failed", d.id, id)
    32  	assert.Check(t, node.ID == id)
    33  	return &node
    34  }
    35  
    36  // RemoveNode removes the specified node
    37  func (d *Daemon) RemoveNode(t testing.TB, id string, force bool) {
    38  	t.Helper()
    39  	cli := d.NewClientT(t)
    40  	defer cli.Close()
    41  
    42  	options := types.NodeRemoveOptions{
    43  		Force: force,
    44  	}
    45  	err := cli.NodeRemove(context.Background(), id, options)
    46  	assert.NilError(t, err)
    47  }
    48  
    49  // UpdateNode updates a swarm node with the specified node constructor
    50  func (d *Daemon) UpdateNode(t testing.TB, id string, f ...NodeConstructor) {
    51  	t.Helper()
    52  	cli := d.NewClientT(t)
    53  	defer cli.Close()
    54  
    55  	for i := 0; ; i++ {
    56  		node := d.GetNode(t, id)
    57  		for _, fn := range f {
    58  			fn(node)
    59  		}
    60  
    61  		err := cli.NodeUpdate(context.Background(), node.ID, node.Version, node.Spec)
    62  		if i < 10 && err != nil && strings.Contains(err.Error(), "update out of sequence") {
    63  			time.Sleep(100 * time.Millisecond)
    64  			continue
    65  		}
    66  		assert.NilError(t, err)
    67  		return
    68  	}
    69  }
    70  
    71  // ListNodes returns the list of the current swarm nodes
    72  func (d *Daemon) ListNodes(t testing.TB) []swarm.Node {
    73  	t.Helper()
    74  	cli := d.NewClientT(t)
    75  	defer cli.Close()
    76  
    77  	nodes, err := cli.NodeList(context.Background(), types.NodeListOptions{})
    78  	assert.NilError(t, err)
    79  
    80  	return nodes
    81  }