github.com/xeptore/docker-cli@v20.10.14+incompatible/cli/command/node/update_test.go (about)

     1  package node
     2  
     3  import (
     4  	"io/ioutil"
     5  	"testing"
     6  
     7  	"github.com/docker/cli/internal/test"
     8  	. "github.com/docker/cli/internal/test/builders" // Import builders to get the builder function as package function
     9  	"github.com/docker/docker/api/types/swarm"
    10  	"github.com/pkg/errors"
    11  	"gotest.tools/v3/assert"
    12  )
    13  
    14  func TestNodeUpdateErrors(t *testing.T) {
    15  	testCases := []struct {
    16  		args            []string
    17  		flags           map[string]string
    18  		nodeInspectFunc func() (swarm.Node, []byte, error)
    19  		nodeUpdateFunc  func(nodeID string, version swarm.Version, node swarm.NodeSpec) error
    20  		expectedError   string
    21  	}{
    22  		{
    23  			expectedError: "requires exactly 1 argument",
    24  		},
    25  		{
    26  			args:          []string{"node1", "node2"},
    27  			expectedError: "requires exactly 1 argument",
    28  		},
    29  		{
    30  			args: []string{"nodeID"},
    31  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    32  				return swarm.Node{}, []byte{}, errors.Errorf("error inspecting the node")
    33  			},
    34  			expectedError: "error inspecting the node",
    35  		},
    36  		{
    37  			args: []string{"nodeID"},
    38  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
    39  				return errors.Errorf("error updating the node")
    40  			},
    41  			expectedError: "error updating the node",
    42  		},
    43  		{
    44  			args: []string{"nodeID"},
    45  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    46  				return *Node(NodeLabels(map[string]string{
    47  					"key": "value",
    48  				})), []byte{}, nil
    49  			},
    50  			flags: map[string]string{
    51  				"label-rm": "notpresent",
    52  			},
    53  			expectedError: "key notpresent doesn't exist in node's labels",
    54  		},
    55  	}
    56  	for _, tc := range testCases {
    57  		cmd := newUpdateCommand(
    58  			test.NewFakeCli(&fakeClient{
    59  				nodeInspectFunc: tc.nodeInspectFunc,
    60  				nodeUpdateFunc:  tc.nodeUpdateFunc,
    61  			}))
    62  		cmd.SetArgs(tc.args)
    63  		for key, value := range tc.flags {
    64  			cmd.Flags().Set(key, value)
    65  		}
    66  		cmd.SetOut(ioutil.Discard)
    67  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    68  	}
    69  }
    70  
    71  func TestNodeUpdate(t *testing.T) {
    72  	testCases := []struct {
    73  		args            []string
    74  		flags           map[string]string
    75  		nodeInspectFunc func() (swarm.Node, []byte, error)
    76  		nodeUpdateFunc  func(nodeID string, version swarm.Version, node swarm.NodeSpec) error
    77  	}{
    78  		{
    79  			args: []string{"nodeID"},
    80  			flags: map[string]string{
    81  				"role": "manager",
    82  			},
    83  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    84  				return *Node(), []byte{}, nil
    85  			},
    86  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
    87  				if node.Role != swarm.NodeRoleManager {
    88  					return errors.Errorf("expected role manager, got %s", node.Role)
    89  				}
    90  				return nil
    91  			},
    92  		},
    93  		{
    94  			args: []string{"nodeID"},
    95  			flags: map[string]string{
    96  				"availability": "drain",
    97  			},
    98  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
    99  				return *Node(), []byte{}, nil
   100  			},
   101  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   102  				if node.Availability != swarm.NodeAvailabilityDrain {
   103  					return errors.Errorf("expected drain availability, got %s", node.Availability)
   104  				}
   105  				return nil
   106  			},
   107  		},
   108  		{
   109  			args: []string{"nodeID"},
   110  			flags: map[string]string{
   111  				"label-add": "lbl",
   112  			},
   113  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   114  				return *Node(), []byte{}, nil
   115  			},
   116  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   117  				if _, present := node.Annotations.Labels["lbl"]; !present {
   118  					return errors.Errorf("expected 'lbl' label, got %v", node.Annotations.Labels)
   119  				}
   120  				return nil
   121  			},
   122  		},
   123  		{
   124  			args: []string{"nodeID"},
   125  			flags: map[string]string{
   126  				"label-add": "key=value",
   127  			},
   128  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   129  				return *Node(), []byte{}, nil
   130  			},
   131  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   132  				if value, present := node.Annotations.Labels["key"]; !present || value != "value" {
   133  					return errors.Errorf("expected 'key' label to be 'value', got %v", node.Annotations.Labels)
   134  				}
   135  				return nil
   136  			},
   137  		},
   138  		{
   139  			args: []string{"nodeID"},
   140  			flags: map[string]string{
   141  				"label-rm": "key",
   142  			},
   143  			nodeInspectFunc: func() (swarm.Node, []byte, error) {
   144  				return *Node(NodeLabels(map[string]string{
   145  					"key": "value",
   146  				})), []byte{}, nil
   147  			},
   148  			nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error {
   149  				if len(node.Annotations.Labels) > 0 {
   150  					return errors.Errorf("expected no labels, got %v", node.Annotations.Labels)
   151  				}
   152  				return nil
   153  			},
   154  		},
   155  	}
   156  	for _, tc := range testCases {
   157  		cmd := newUpdateCommand(
   158  			test.NewFakeCli(&fakeClient{
   159  				nodeInspectFunc: tc.nodeInspectFunc,
   160  				nodeUpdateFunc:  tc.nodeUpdateFunc,
   161  			}))
   162  		cmd.SetArgs(tc.args)
   163  		for key, value := range tc.flags {
   164  			cmd.Flags().Set(key, value)
   165  		}
   166  		assert.NilError(t, cmd.Execute())
   167  	}
   168  }