github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/cli/command/service/update_test.go (about)

     1  package service
     2  
     3  import (
     4  	"sort"
     5  	"testing"
     6  
     7  	mounttypes "github.com/docker/docker/api/types/mount"
     8  	"github.com/docker/docker/api/types/swarm"
     9  	"github.com/docker/docker/pkg/testutil/assert"
    10  )
    11  
    12  func TestUpdateServiceArgs(t *testing.T) {
    13  	flags := newUpdateCommand(nil).Flags()
    14  	flags.Set("args", "the \"new args\"")
    15  
    16  	spec := &swarm.ServiceSpec{}
    17  	cspec := &spec.TaskTemplate.ContainerSpec
    18  	cspec.Args = []string{"old", "args"}
    19  
    20  	updateService(flags, spec)
    21  	assert.EqualStringSlice(t, cspec.Args, []string{"the", "new args"})
    22  }
    23  
    24  func TestUpdateLabels(t *testing.T) {
    25  	flags := newUpdateCommand(nil).Flags()
    26  	flags.Set("label-add", "toadd=newlabel")
    27  	flags.Set("label-rm", "toremove")
    28  
    29  	labels := map[string]string{
    30  		"toremove": "thelabeltoremove",
    31  		"tokeep":   "value",
    32  	}
    33  
    34  	updateLabels(flags, &labels)
    35  	assert.Equal(t, len(labels), 2)
    36  	assert.Equal(t, labels["tokeep"], "value")
    37  	assert.Equal(t, labels["toadd"], "newlabel")
    38  }
    39  
    40  func TestUpdateLabelsRemoveALabelThatDoesNotExist(t *testing.T) {
    41  	flags := newUpdateCommand(nil).Flags()
    42  	flags.Set("label-rm", "dne")
    43  
    44  	labels := map[string]string{"foo": "theoldlabel"}
    45  	updateLabels(flags, &labels)
    46  	assert.Equal(t, len(labels), 1)
    47  }
    48  
    49  func TestUpdatePlacement(t *testing.T) {
    50  	flags := newUpdateCommand(nil).Flags()
    51  	flags.Set("constraint-add", "node=toadd")
    52  	flags.Set("constraint-rm", "node!=toremove")
    53  
    54  	placement := &swarm.Placement{
    55  		Constraints: []string{"node!=toremove", "container=tokeep"},
    56  	}
    57  
    58  	updatePlacement(flags, placement)
    59  	assert.Equal(t, len(placement.Constraints), 2)
    60  	assert.Equal(t, placement.Constraints[0], "container=tokeep")
    61  	assert.Equal(t, placement.Constraints[1], "node=toadd")
    62  }
    63  
    64  func TestUpdateEnvironment(t *testing.T) {
    65  	flags := newUpdateCommand(nil).Flags()
    66  	flags.Set("env-add", "toadd=newenv")
    67  	flags.Set("env-rm", "toremove")
    68  
    69  	envs := []string{"toremove=theenvtoremove", "tokeep=value"}
    70  
    71  	updateEnvironment(flags, &envs)
    72  	assert.Equal(t, len(envs), 2)
    73  	// Order has been removed in updateEnvironment (map)
    74  	sort.Strings(envs)
    75  	assert.Equal(t, envs[0], "toadd=newenv")
    76  	assert.Equal(t, envs[1], "tokeep=value")
    77  }
    78  
    79  func TestUpdateEnvironmentWithDuplicateValues(t *testing.T) {
    80  	flags := newUpdateCommand(nil).Flags()
    81  	flags.Set("env-add", "foo=newenv")
    82  	flags.Set("env-add", "foo=dupe")
    83  	flags.Set("env-rm", "foo")
    84  
    85  	envs := []string{"foo=value"}
    86  
    87  	updateEnvironment(flags, &envs)
    88  	assert.Equal(t, len(envs), 0)
    89  }
    90  
    91  func TestUpdateEnvironmentWithDuplicateKeys(t *testing.T) {
    92  	// Test case for #25404
    93  	flags := newUpdateCommand(nil).Flags()
    94  	flags.Set("env-add", "A=b")
    95  
    96  	envs := []string{"A=c"}
    97  
    98  	updateEnvironment(flags, &envs)
    99  	assert.Equal(t, len(envs), 1)
   100  	assert.Equal(t, envs[0], "A=b")
   101  }
   102  
   103  func TestUpdateGroups(t *testing.T) {
   104  	flags := newUpdateCommand(nil).Flags()
   105  	flags.Set("group-add", "wheel")
   106  	flags.Set("group-add", "docker")
   107  	flags.Set("group-rm", "root")
   108  	flags.Set("group-add", "foo")
   109  	flags.Set("group-rm", "docker")
   110  
   111  	groups := []string{"bar", "root"}
   112  
   113  	updateGroups(flags, &groups)
   114  	assert.Equal(t, len(groups), 3)
   115  	assert.Equal(t, groups[0], "bar")
   116  	assert.Equal(t, groups[1], "foo")
   117  	assert.Equal(t, groups[2], "wheel")
   118  }
   119  
   120  func TestUpdateMounts(t *testing.T) {
   121  	flags := newUpdateCommand(nil).Flags()
   122  	flags.Set("mount-add", "type=volume,target=/toadd")
   123  	flags.Set("mount-rm", "/toremove")
   124  
   125  	mounts := []mounttypes.Mount{
   126  		{Target: "/toremove", Type: mounttypes.TypeBind},
   127  		{Target: "/tokeep", Type: mounttypes.TypeBind},
   128  	}
   129  
   130  	updateMounts(flags, &mounts)
   131  	assert.Equal(t, len(mounts), 2)
   132  	assert.Equal(t, mounts[0].Target, "/tokeep")
   133  	assert.Equal(t, mounts[1].Target, "/toadd")
   134  }
   135  
   136  func TestUpdatePorts(t *testing.T) {
   137  	flags := newUpdateCommand(nil).Flags()
   138  	flags.Set("publish-add", "1000:1000")
   139  	flags.Set("publish-rm", "333/udp")
   140  
   141  	portConfigs := []swarm.PortConfig{
   142  		{TargetPort: 333, Protocol: swarm.PortConfigProtocolUDP},
   143  		{TargetPort: 555},
   144  	}
   145  
   146  	err := updatePorts(flags, &portConfigs)
   147  	assert.Equal(t, err, nil)
   148  	assert.Equal(t, len(portConfigs), 2)
   149  	// Do a sort to have the order (might have changed by map)
   150  	targetPorts := []int{int(portConfigs[0].TargetPort), int(portConfigs[1].TargetPort)}
   151  	sort.Ints(targetPorts)
   152  	assert.Equal(t, targetPorts[0], 555)
   153  	assert.Equal(t, targetPorts[1], 1000)
   154  }
   155  
   156  func TestUpdatePortsDuplicateEntries(t *testing.T) {
   157  	// Test case for #25375
   158  	flags := newUpdateCommand(nil).Flags()
   159  	flags.Set("publish-add", "80:80")
   160  
   161  	portConfigs := []swarm.PortConfig{
   162  		{TargetPort: 80, PublishedPort: 80},
   163  	}
   164  
   165  	err := updatePorts(flags, &portConfigs)
   166  	assert.Equal(t, err, nil)
   167  	assert.Equal(t, len(portConfigs), 1)
   168  	assert.Equal(t, portConfigs[0].TargetPort, uint32(80))
   169  }
   170  
   171  func TestUpdatePortsDuplicateKeys(t *testing.T) {
   172  	// Test case for #25375
   173  	flags := newUpdateCommand(nil).Flags()
   174  	flags.Set("publish-add", "80:20")
   175  
   176  	portConfigs := []swarm.PortConfig{
   177  		{TargetPort: 80, PublishedPort: 80},
   178  	}
   179  
   180  	err := updatePorts(flags, &portConfigs)
   181  	assert.Equal(t, err, nil)
   182  	assert.Equal(t, len(portConfigs), 1)
   183  	assert.Equal(t, portConfigs[0].TargetPort, uint32(20))
   184  }
   185  
   186  func TestUpdatePortsConflictingFlags(t *testing.T) {
   187  	// Test case for #25375
   188  	flags := newUpdateCommand(nil).Flags()
   189  	flags.Set("publish-add", "80:80")
   190  	flags.Set("publish-add", "80:20")
   191  
   192  	portConfigs := []swarm.PortConfig{
   193  		{TargetPort: 80, PublishedPort: 80},
   194  	}
   195  
   196  	err := updatePorts(flags, &portConfigs)
   197  	assert.Error(t, err, "conflicting port mapping")
   198  }