|
@@ -1273,123 +1273,6 @@ func TestBindMounts(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// Test that -volumes-from supports both read-only mounts
|
|
|
-func TestFromVolumesInReadonlyMode(t *testing.T) {
|
|
|
- runtime := mkRuntime(t)
|
|
|
- defer nuke(runtime)
|
|
|
- container, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"/bin/echo", "-n", "foobar"},
|
|
|
- Volumes: map[string]struct{}{"/test": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container)
|
|
|
- _, err = container.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- if !container.VolumesRW["/test"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- container2, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"/bin/echo", "-n", "foobar"},
|
|
|
- VolumesFrom: container.ID + ":ro",
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container2)
|
|
|
-
|
|
|
- _, err = container2.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- if container.Volumes["/test"] != container2.Volumes["/test"] {
|
|
|
- t.Logf("container volumes do not match: %s | %s ",
|
|
|
- container.Volumes["/test"],
|
|
|
- container2.Volumes["/test"])
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- _, exists := container2.VolumesRW["/test"]
|
|
|
- if !exists {
|
|
|
- t.Logf("container2 is missing '/test' volume: %s", container2.VolumesRW)
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- if container2.VolumesRW["/test"] != false {
|
|
|
- t.Log("'/test' volume mounted in read-write mode, expected read-only")
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// Test that VolumesRW values are copied to the new container. Regression test for #1201
|
|
|
-func TestVolumesFromReadonlyMount(t *testing.T) {
|
|
|
- runtime := mkRuntime(t)
|
|
|
- defer nuke(runtime)
|
|
|
- container, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"/bin/echo", "-n", "foobar"},
|
|
|
- Volumes: map[string]struct{}{"/test": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container)
|
|
|
- _, err = container.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- if !container.VolumesRW["/test"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- container2, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"/bin/echo", "-n", "foobar"},
|
|
|
- VolumesFrom: container.ID,
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container2)
|
|
|
-
|
|
|
- _, err = container2.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- if container.Volumes["/test"] != container2.Volumes["/test"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- actual, exists := container2.VolumesRW["/test"]
|
|
|
- if !exists {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- if container.VolumesRW["/test"] != actual {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// Test that restarting a container with a volume does not create a new volume on restart. Regression test for #819.
|
|
|
func TestRestartWithVolumes(t *testing.T) {
|
|
|
runtime := mkRuntime(t)
|
|
@@ -1434,73 +1317,6 @@ func TestRestartWithVolumes(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// Test for #1351
|
|
|
-func TestVolumesFromWithVolumes(t *testing.T) {
|
|
|
- runtime := mkRuntime(t)
|
|
|
- defer nuke(runtime)
|
|
|
-
|
|
|
- container, _, err := runtime.Create(&runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"sh", "-c", "echo -n bar > /test/foo"},
|
|
|
- Volumes: map[string]struct{}{"/test": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container)
|
|
|
-
|
|
|
- for key := range container.Config.Volumes {
|
|
|
- if key != "/test" {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _, err = container.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- expected := container.Volumes["/test"]
|
|
|
- if expected == "" {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- container2, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"cat", "/test/foo"},
|
|
|
- VolumesFrom: container.ID,
|
|
|
- Volumes: map[string]struct{}{"/test": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container2)
|
|
|
-
|
|
|
- output, err := container2.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- if string(output) != "bar" {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- if container.Volumes["/test"] != container2.Volumes["/test"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- // Ensure it restarts successfully
|
|
|
- _, err = container2.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
func TestContainerNetwork(t *testing.T) {
|
|
|
runtime := mkRuntime(t)
|
|
|
defer nuke(runtime)
|
|
@@ -1636,81 +1452,3 @@ func TestUnprivilegedCannotMount(t *testing.T) {
|
|
|
t.Fatal("Could mount into secure container")
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-func TestMultipleVolumesFrom(t *testing.T) {
|
|
|
- runtime := mkRuntime(t)
|
|
|
- defer nuke(runtime)
|
|
|
-
|
|
|
- container, _, err := runtime.Create(&runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"sh", "-c", "echo -n bar > /test/foo"},
|
|
|
- Volumes: map[string]struct{}{"/test": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container)
|
|
|
-
|
|
|
- for key := range container.Config.Volumes {
|
|
|
- if key != "/test" {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _, err = container.Output()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- expected := container.Volumes["/test"]
|
|
|
- if expected == "" {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-
|
|
|
- container2, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"sh", "-c", "echo -n bar > /other/foo"},
|
|
|
- Volumes: map[string]struct{}{"/other": {}},
|
|
|
- },
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container2)
|
|
|
-
|
|
|
- for key := range container2.Config.Volumes {
|
|
|
- if key != "/other" {
|
|
|
- t.FailNow()
|
|
|
- }
|
|
|
- }
|
|
|
- if _, err := container2.Output(); err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- container3, _, err := runtime.Create(
|
|
|
- &runconfig.Config{
|
|
|
- Image: GetTestImage(runtime).ID,
|
|
|
- Cmd: []string{"/bin/echo", "-n", "foobar"},
|
|
|
- VolumesFrom: strings.Join([]string{container.ID, container2.ID}, ","),
|
|
|
- }, "")
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer runtime.Destroy(container3)
|
|
|
-
|
|
|
- if _, err := container3.Output(); err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- if container3.Volumes["/test"] != container.Volumes["/test"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
- if container3.Volumes["/other"] != container2.Volumes["/other"] {
|
|
|
- t.Fail()
|
|
|
- }
|
|
|
-}
|