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 }