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 }