2016-05-07 06:05:26 -04:00
// This file will be removed when we completely drop support for
// passing HostConfig to container start API.
package main
import (
"net/http"
"strings"
2019-09-09 17:06:12 -04:00
"testing"
2016-05-07 06:05:26 -04:00
2018-05-04 17:15:00 -04:00
"github.com/docker/docker/api/types/versions"
2018-04-17 04:22:04 -04:00
"github.com/docker/docker/internal/test/request"
2019-04-04 09:23:19 -04:00
"gotest.tools/assert"
is "gotest.tools/assert/cmp"
2016-05-07 06:05:26 -04:00
)
func formatV123StartAPIURL ( url string ) string {
return "/v1.23" + url
}
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedContainerAPIStartHostConfig ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
name := "test-deprecated-api-124"
dockerCmd ( c , "create" , "--name" , name , "busybox" )
config := map [ string ] interface { } {
"Binds" : [ ] string { "/aa:/bb" } ,
}
2017-05-23 23:56:26 -04:00
res , body , err := request . Post ( "/containers/" + name + "/start" , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusBadRequest )
2018-05-04 17:15:00 -04:00
if versions . GreaterThanOrEqualTo ( testEnv . DaemonAPIVersion ( ) , "1.32" ) {
// assertions below won't work before 1.32
buf , err := request . ReadBody ( body )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
2018-05-04 17:15:00 -04:00
2019-04-04 09:23:19 -04:00
assert . Equal ( c , res . StatusCode , http . StatusBadRequest )
assert . Assert ( c , strings . Contains ( string ( buf ) , "was deprecated since API v1.22" ) )
2018-05-04 17:15:00 -04:00
}
2016-05-07 06:05:26 -04:00
}
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedContainerAPIStartVolumeBinds ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows CI: Investigate further why this fails on Windows to Windows CI.
testRequires ( c , DaemonIsLinux )
path := "/foo"
2018-01-15 09:32:06 -05:00
if testEnv . OSType == "windows" {
2016-05-07 06:05:26 -04:00
path = ` c:\foo `
}
name := "testing"
config := map [ string ] interface { } {
"Image" : "busybox" ,
"Volumes" : map [ string ] struct { } { path : { } } ,
}
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( formatV123StartAPIURL ( "/containers/create?name=" + name ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusCreated )
2016-05-07 06:05:26 -04:00
2018-01-15 09:32:06 -05:00
bindPath := RandomTmpDirPath ( "test" , testEnv . OSType )
2016-05-07 06:05:26 -04:00
config = map [ string ] interface { } {
"Binds" : [ ] string { bindPath + ":" + path } ,
}
2017-05-23 23:56:26 -04:00
res , _ , err = request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
pth , err := inspectMountSourceField ( name , path )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , pth , bindPath , "expected volume host path to be %s, got %s" , bindPath , pth )
2016-05-07 06:05:26 -04:00
}
// Test for GH#10618
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedContainerAPIStartDupVolumeBinds ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows to Windows CI - Port this
testRequires ( c , DaemonIsLinux )
name := "testdups"
config := map [ string ] interface { } {
"Image" : "busybox" ,
"Volumes" : map [ string ] struct { } { "/tmp" : { } } ,
}
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( formatV123StartAPIURL ( "/containers/create?name=" + name ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusCreated )
2016-05-07 06:05:26 -04:00
2018-01-15 09:32:06 -05:00
bindPath1 := RandomTmpDirPath ( "test1" , testEnv . OSType )
bindPath2 := RandomTmpDirPath ( "test2" , testEnv . OSType )
2016-05-07 06:05:26 -04:00
config = map [ string ] interface { } {
"Binds" : [ ] string { bindPath1 + ":/tmp" , bindPath2 + ":/tmp" } ,
}
2017-05-23 23:56:26 -04:00
res , body , err := request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
2017-05-23 23:56:26 -04:00
buf , err := request . ReadBody ( body )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
2017-05-23 23:56:26 -04:00
2018-05-04 17:15:00 -04:00
if versions . LessThan ( testEnv . DaemonAPIVersion ( ) , "1.32" ) {
2019-04-04 09:23:19 -04:00
assert . Equal ( c , res . StatusCode , http . StatusInternalServerError )
2018-05-04 17:15:00 -04:00
} else {
2019-04-04 09:23:19 -04:00
assert . Equal ( c , res . StatusCode , http . StatusBadRequest )
2018-05-04 17:15:00 -04:00
}
2019-04-04 09:23:19 -04:00
assert . Assert ( c , strings . Contains ( string ( buf ) , "Duplicate mount point" ) , "Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v" , string ( buf ) , err )
2016-05-07 06:05:26 -04:00
}
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedContainerAPIStartVolumesFrom ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows to Windows CI - Port this
testRequires ( c , DaemonIsLinux )
volName := "voltst"
volPath := "/tmp"
dockerCmd ( c , "run" , "--name" , volName , "-v" , volPath , "busybox" )
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
name := "TestContainerAPIStartVolumesFrom"
2016-05-07 06:05:26 -04:00
config := map [ string ] interface { } {
"Image" : "busybox" ,
"Volumes" : map [ string ] struct { } { volPath : { } } ,
}
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( formatV123StartAPIURL ( "/containers/create?name=" + name ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusCreated )
2016-05-07 06:05:26 -04:00
config = map [ string ] interface { } {
"VolumesFrom" : [ ] string { volName } ,
}
2017-05-23 23:56:26 -04:00
res , _ , err = request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . JSONBody ( config ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
pth , err := inspectMountSourceField ( name , volPath )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
2016-05-07 06:05:26 -04:00
pth2 , err := inspectMountSourceField ( volName , volPath )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , pth , pth2 , "expected volume host path to be %s, got %s" , pth , pth2 )
2016-05-07 06:05:26 -04:00
}
// #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedPostContainerBindNormalVolume ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows to Windows CI - Port this
testRequires ( c , DaemonIsLinux )
dockerCmd ( c , "create" , "-v" , "/foo" , "--name=one" , "busybox" )
fooDir , err := inspectMountSourceField ( "one" , "/foo" )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
2016-05-07 06:05:26 -04:00
dockerCmd ( c , "create" , "-v" , "/foo" , "--name=two" , "busybox" )
bindSpec := map [ string ] [ ] string { "Binds" : { fooDir + ":/foo" } }
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( formatV123StartAPIURL ( "/containers/two/start" ) , request . JSONBody ( bindSpec ) )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
fooDir2 , err := inspectMountSourceField ( "two" , "/foo" )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , fooDir2 , fooDir , "expected volume path to be %s, got: %s" , fooDir , fooDir2 )
2016-05-07 06:05:26 -04:00
}
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedStartWithTooLowMemoryLimit ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows: Port once memory is supported
testRequires ( c , DaemonIsLinux )
out , _ := dockerCmd ( c , "create" , "busybox" )
containerID := strings . TrimSpace ( out )
config := ` {
"CpuShares" : 100 ,
"Memory" : 524287
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( formatV123StartAPIURL ( "/containers/" + containerID + "/start" ) , request . RawString ( config ) , request . JSON )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
b , err := request . ReadBody ( body )
assert . NilError ( c , err )
2018-05-04 17:15:00 -04:00
if versions . LessThan ( testEnv . DaemonAPIVersion ( ) , "1.32" ) {
2019-04-04 09:23:19 -04:00
assert . Equal ( c , res . StatusCode , http . StatusInternalServerError )
2018-05-04 17:15:00 -04:00
} else {
2019-04-04 09:23:19 -04:00
assert . Equal ( c , res . StatusCode , http . StatusBadRequest )
2018-05-04 17:15:00 -04:00
}
2019-04-04 09:23:19 -04:00
assert . Assert ( c , is . Contains ( string ( b ) , "Minimum memory limit allowed is 4MB" ) )
2016-05-07 06:05:26 -04:00
}
// #14640
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedPostContainersStartWithoutLinksInHostConfig ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows: Windows doesn't support supplying a hostconfig on start.
// An alternate test could be written to validate the negative testing aspect of this
testRequires ( c , DaemonIsLinux )
name := "test-host-config-links"
2016-08-17 18:46:28 -04:00
dockerCmd ( c , append ( [ ] string { "create" , "--name" , name , "busybox" } , sleepCommandForDaemonPlatform ( ) ... ) ... )
2016-05-07 06:05:26 -04:00
hc := inspectFieldJSON ( c , name , "HostConfig" )
config := ` { "HostConfig": ` + hc + ` } `
2017-03-06 10:35:27 -05:00
res , b , err := request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . RawString ( config ) , request . JSON )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
b . Close ( )
}
// #14640
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedPostContainersStartWithLinksInHostConfig ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows: Windows doesn't support supplying a hostconfig on start.
// An alternate test could be written to validate the negative testing aspect of this
testRequires ( c , DaemonIsLinux )
name := "test-host-config-links"
dockerCmd ( c , "run" , "--name" , "foo" , "-d" , "busybox" , "top" )
dockerCmd ( c , "create" , "--name" , name , "--link" , "foo:bar" , "busybox" , "top" )
hc := inspectFieldJSON ( c , name , "HostConfig" )
config := ` { "HostConfig": ` + hc + ` } `
2017-03-06 10:35:27 -05:00
res , b , err := request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . RawString ( config ) , request . JSON )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
b . Close ( )
}
// #14640
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedPostContainersStartWithLinksInHostConfigIdLinked ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// Windows does not support links
testRequires ( c , DaemonIsLinux )
name := "test-host-config-links"
out , _ := dockerCmd ( c , "run" , "--name" , "link0" , "-d" , "busybox" , "top" )
2017-09-22 09:52:41 -04:00
defer dockerCmd ( c , "stop" , "link0" )
2016-05-07 06:05:26 -04:00
id := strings . TrimSpace ( out )
dockerCmd ( c , "create" , "--name" , name , "--link" , id , "busybox" , "top" )
2017-09-22 09:52:41 -04:00
defer dockerCmd ( c , "stop" , name )
2016-05-07 06:05:26 -04:00
hc := inspectFieldJSON ( c , name , "HostConfig" )
config := ` { "HostConfig": ` + hc + ` } `
2017-03-06 10:35:27 -05:00
res , b , err := request . Post ( formatV123StartAPIURL ( "/containers/" + name + "/start" ) , request . RawString ( config ) , request . JSON )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
b . Close ( )
}
2019-09-09 17:05:55 -04:00
func ( s * DockerSuite ) TestDeprecatedStartWithNilDNS ( c * testing . T ) {
2016-05-07 06:05:26 -04:00
// TODO Windows: Add once DNS is supported
testRequires ( c , DaemonIsLinux )
out , _ := dockerCmd ( c , "create" , "busybox" )
containerID := strings . TrimSpace ( out )
config := ` { "HostConfig": { "Dns": null}} `
2017-03-06 10:35:27 -05:00
res , b , err := request . Post ( formatV123StartAPIURL ( "/containers/" + containerID + "/start" ) , request . RawString ( config ) , request . JSON )
2019-04-04 09:23:19 -04:00
assert . NilError ( c , err )
assert . Equal ( c , res . StatusCode , http . StatusNoContent )
2016-05-07 06:05:26 -04:00
b . Close ( )
dns := inspectFieldJSON ( c , containerID , "HostConfig.Dns" )
2019-04-04 09:23:19 -04:00
assert . Equal ( c , dns , "[]" )
2016-05-07 06:05:26 -04:00
}