github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/daemon/cluster/nodes.go (about)

     1  package cluster // import "github.com/docker/docker/daemon/cluster"
     2  
     3  import (
     4  	apitypes "github.com/docker/docker/api/types"
     5  	types "github.com/docker/docker/api/types/swarm"
     6  	"github.com/docker/docker/daemon/cluster/convert"
     7  	"github.com/docker/docker/errdefs"
     8  	swarmapi "github.com/docker/swarmkit/api"
     9  	"golang.org/x/net/context"
    10  )
    11  
    12  // GetNodes returns a list of all nodes known to a cluster.
    13  func (c *Cluster) GetNodes(options apitypes.NodeListOptions) ([]types.Node, error) {
    14  	c.mu.RLock()
    15  	defer c.mu.RUnlock()
    16  
    17  	state := c.currentNodeState()
    18  	if !state.IsActiveManager() {
    19  		return nil, c.errNoManager(state)
    20  	}
    21  
    22  	filters, err := newListNodesFilters(options.Filters)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	ctx, cancel := c.getRequestContext()
    28  	defer cancel()
    29  
    30  	r, err := state.controlClient.ListNodes(
    31  		ctx,
    32  		&swarmapi.ListNodesRequest{Filters: filters})
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	nodes := make([]types.Node, 0, len(r.Nodes))
    38  
    39  	for _, node := range r.Nodes {
    40  		nodes = append(nodes, convert.NodeFromGRPC(*node))
    41  	}
    42  	return nodes, nil
    43  }
    44  
    45  // GetNode returns a node based on an ID.
    46  func (c *Cluster) GetNode(input string) (types.Node, error) {
    47  	var node *swarmapi.Node
    48  
    49  	if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
    50  		n, err := getNode(ctx, state.controlClient, input)
    51  		if err != nil {
    52  			return err
    53  		}
    54  		node = n
    55  		return nil
    56  	}); err != nil {
    57  		return types.Node{}, err
    58  	}
    59  
    60  	return convert.NodeFromGRPC(*node), nil
    61  }
    62  
    63  // UpdateNode updates existing nodes properties.
    64  func (c *Cluster) UpdateNode(input string, version uint64, spec types.NodeSpec) error {
    65  	return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
    66  		nodeSpec, err := convert.NodeSpecToGRPC(spec)
    67  		if err != nil {
    68  			return errdefs.InvalidParameter(err)
    69  		}
    70  
    71  		ctx, cancel := c.getRequestContext()
    72  		defer cancel()
    73  
    74  		currentNode, err := getNode(ctx, state.controlClient, input)
    75  		if err != nil {
    76  			return err
    77  		}
    78  
    79  		_, err = state.controlClient.UpdateNode(
    80  			ctx,
    81  			&swarmapi.UpdateNodeRequest{
    82  				NodeID: currentNode.ID,
    83  				Spec:   &nodeSpec,
    84  				NodeVersion: &swarmapi.Version{
    85  					Index: version,
    86  				},
    87  			},
    88  		)
    89  		return err
    90  	})
    91  }
    92  
    93  // RemoveNode removes a node from a cluster
    94  func (c *Cluster) RemoveNode(input string, force bool) error {
    95  	return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
    96  		node, err := getNode(ctx, state.controlClient, input)
    97  		if err != nil {
    98  			return err
    99  		}
   100  
   101  		_, err = state.controlClient.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force})
   102  		return err
   103  	})
   104  }