func startEchoServerContainer(t *testing.T, proto string) (*Runtime, *Container, string) { var ( err error container *Container strPort string runtime = mkRuntime(t) port = 5554 ) for { port += 1 strPort = strconv.Itoa(port) var cmd string if proto == "tcp" { cmd = "socat TCP-LISTEN:" + strPort + ",reuseaddr,fork EXEC:/bin/cat" } else if proto == "udp" { cmd = "socat UDP-RECVFROM:" + strPort + ",fork EXEC:/bin/cat" } else { t.Fatal(fmt.Errorf("Unknown protocol %v", proto)) } t.Log("Trying port", strPort) container, err = runtime.Create(&Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"sh", "-c", cmd}, PortSpecs: []string{fmt.Sprintf("%s/%s", strPort, proto)}, }) if container != nil { break } if err != nil { nuke(runtime) t.Fatal(err) } t.Logf("Port %v already in use", strPort) } if err := container.Start(&HostConfig{}); err != nil { nuke(runtime) t.Fatal(err) } setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() { for !container.State.Running { time.Sleep(10 * time.Millisecond) } }) // Even if the state is running, lets give some time to lxc to spawn the process container.WaitTimeout(500 * time.Millisecond) strPort = container.NetworkSettings.PortMapping[strings.Title(proto)][strPort] return runtime, container, strPort }
func TestDestroy(t *testing.T) { runtime := mkRuntime(t) defer nuke(runtime) container, _, err := runtime.Create(&Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, }, "") if err != nil { t.Fatal(err) } // Destroy if err := runtime.Destroy(container); err != nil { t.Error(err) } // Make sure runtime.Exists() behaves correctly if runtime.Exists("test_destroy") { t.Errorf("Exists() returned true") } // Make sure runtime.List() doesn't list the destroyed container if len(runtime.List()) != 0 { t.Errorf("Expected 0 container, %v found", len(runtime.List())) } // Make sure runtime.Get() refuses to return the unexisting container if runtime.Get(container.ID) != nil { t.Errorf("Unable to get newly created container") } // Make sure the container root directory does not exist anymore _, err = os.Stat(container.root) if err == nil || !os.IsNotExist(err) { t.Errorf("Container root directory still exists after destroy") } // Test double destroy if err := runtime.Destroy(container); err == nil { // It should have failed t.Errorf("Double destroy did not fail") } }
func TestDestroyWithInitLayer(t *testing.T) { runtime := mkRuntime(t) defer nuke(runtime) container, _, err := runtime.Create(&docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, }, "") if err != nil { t.Fatal(err) } // Destroy if err := runtime.Destroy(container); err != nil { t.Fatal(err) } // Make sure runtime.Exists() behaves correctly if runtime.Exists("test_destroy") { t.Fatalf("Exists() returned true") } // Make sure runtime.List() doesn't list the destroyed container if len(runtime.List()) != 0 { t.Fatalf("Expected 0 container, %v found", len(runtime.List())) } driver := runtime.Graph().Driver() // Make sure that the container does not exist in the driver if _, err := driver.Get(container.ID); err == nil { t.Fatal("Conttainer should not exist in the driver") } // Make sure that the init layer is removed from the driver if _, err := driver.Get(fmt.Sprintf("%s-init", container.ID)); err == nil { t.Fatal("Container's init layer should not exist in the driver") } }
func TestRuntimeCreate(t *testing.T) { runtime := mkRuntime(t) defer nuke(runtime) // Make sure we start we 0 containers if len(runtime.List()) != 0 { t.Errorf("Expected 0 containers, %v found", len(runtime.List())) } container, _, err := runtime.Create(&docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, }, "", ) if err != nil { t.Fatal(err) } defer func() { if err := runtime.Destroy(container); err != nil { t.Error(err) } }() // Make sure we can find the newly created container with List() if len(runtime.List()) != 1 { t.Errorf("Expected 1 container, %v found", len(runtime.List())) } // Make sure the container List() returns is the right one if runtime.List()[0].ID != container.ID { t.Errorf("Unexpected container %v returned by List", runtime.List()[0]) } // Make sure we can get the container with Get() if runtime.Get(container.ID) == nil { t.Errorf("Unable to get newly created container") } // Make sure it is the right container if runtime.Get(container.ID) != container { t.Errorf("Get() returned the wrong container") } // Make sure Exists returns it as existing if !runtime.Exists(container.ID) { t.Errorf("Exists() returned false for a newly created container") } // Test that conflict error displays correct details testContainer, _, _ := runtime.Create( &docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, }, "conflictname", ) if _, _, err := runtime.Create(&docker.Config{Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}}, testContainer.Name); err == nil || !strings.Contains(err.Error(), utils.TruncateID(testContainer.ID)) { t.Fatalf("Name conflict error doesn't include the correct short id. Message was: %s", err.Error()) } // Make sure create with bad parameters returns an error if _, _, err = runtime.Create(&docker.Config{Image: GetTestImage(runtime).ID}, ""); err == nil { t.Fatal("Builder.Create should throw an error when Cmd is missing") } if _, _, err := runtime.Create( &docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{}, }, "", ); err == nil { t.Fatal("Builder.Create should throw an error when Cmd is empty") } config := &docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"/bin/ls"}, PortSpecs: []string{"80"}, } container, _, err = runtime.Create(config, "") _, err = runtime.Commit(container, "testrepo", "testtag", "", "", config) if err != nil { t.Error(err) } // test expose 80:8000 container, warnings, err := runtime.Create(&docker.Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, PortSpecs: []string{"80:8000"}, }, "", ) if err != nil { t.Fatal(err) } if warnings == nil || len(warnings) != 1 { t.Error("Expected a warning, got none") } }
func startEchoServerContainer(t *testing.T, proto string) (*Runtime, *Container, string) { var ( err error container *Container strPort string runtime = mkRuntime(t) port = 5554 p Port ) for { port += 1 strPort = strconv.Itoa(port) var cmd string if proto == "tcp" { cmd = "socat TCP-LISTEN:" + strPort + ",reuseaddr,fork EXEC:/bin/cat" } else if proto == "udp" { cmd = "socat UDP-RECVFROM:" + strPort + ",fork EXEC:/bin/cat" } else { t.Fatal(fmt.Errorf("Unknown protocol %v", proto)) } ep := make(map[Port]struct{}, 1) p = Port(fmt.Sprintf("%s/%s", strPort, proto)) ep[p] = struct{}{} container, _, err = runtime.Create(&Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"sh", "-c", cmd}, PortSpecs: []string{fmt.Sprintf("%s/%s", strPort, proto)}, ExposedPorts: ep, }, "") if err != nil { nuke(runtime) t.Fatal(err) } if container != nil { break } t.Logf("Port %v already in use, trying another one", strPort) } container.hostConfig = &HostConfig{ PortBindings: make(map[Port][]PortBinding), } container.hostConfig.PortBindings[p] = []PortBinding{ {}, } if err := container.Start(); err != nil { nuke(runtime) t.Fatal(err) } setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() { for !container.State.Running { time.Sleep(10 * time.Millisecond) } }) // Even if the state is running, lets give some time to lxc to spawn the process container.WaitTimeout(500 * time.Millisecond) strPort = container.NetworkSettings.Ports[p][0].HostPort return runtime, container, strPort }
func TestRuntimeCreate(t *testing.T) { runtime := mkRuntime(t) defer nuke(runtime) // Make sure we start we 0 containers if len(runtime.List()) != 0 { t.Errorf("Expected 0 containers, %v found", len(runtime.List())) } container, err := runtime.Create(&Config{ Image: GetTestImage(runtime).ID, Cmd: []string{"ls", "-al"}, }, ) if err != nil { t.Fatal(err) } defer func() { if err := runtime.Destroy(container); err != nil { t.Error(err) } }() // Make sure we can find the newly created container with List() if len(runtime.List()) != 1 { t.Errorf("Expected 1 container, %v found", len(runtime.List())) } // Make sure the container List() returns is the right one if runtime.List()[0].ID != container.ID { t.Errorf("Unexpected container %v returned by List", runtime.List()[0]) } // Make sure we can get the container with Get() if runtime.Get(container.ID) == nil { t.Errorf("Unable to get newly created container") } // Make sure it is the right container if runtime.Get(container.ID) != container { t.Errorf("Get() returned the wrong container") } // Make sure Exists returns it as existing if !runtime.Exists(container.ID) { t.Errorf("Exists() returned false for a newly created container") } // Make sure crete with bad parameters returns an error _, err = runtime.Create( &Config{ Image: GetTestImage(runtime).ID, }, ) if err == nil { t.Fatal("Builder.Create should throw an error when Cmd is missing") } _, err = runtime.Create( &Config{ Image: GetTestImage(runtime).ID, Cmd: []string{}, }, ) if err == nil { t.Fatal("Builder.Create should throw an error when Cmd is empty") } }