summaryrefslogtreecommitdiff
path: root/pkg/bindings/test
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/bindings/test')
-rw-r--r--pkg/bindings/test/common_test.go49
-rw-r--r--pkg/bindings/test/containers_test.go290
-rw-r--r--pkg/bindings/test/create_test.go50
-rw-r--r--pkg/bindings/test/exec_test.go77
-rw-r--r--pkg/bindings/test/images_test.go157
-rw-r--r--pkg/bindings/test/manifests_test.go124
-rw-r--r--pkg/bindings/test/pods_test.go218
-rw-r--r--pkg/bindings/test/system_test.go51
-rw-r--r--pkg/bindings/test/volumes_test.go173
9 files changed, 993 insertions, 196 deletions
diff --git a/pkg/bindings/test/common_test.go b/pkg/bindings/test/common_test.go
index 38f5014ca..6b8d6788c 100644
--- a/pkg/bindings/test/common_test.go
+++ b/pkg/bindings/test/common_test.go
@@ -1,13 +1,18 @@
package test_bindings
import (
+ "context"
"fmt"
+ "github.com/containers/libpod/libpod/define"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
+ . "github.com/containers/libpod/pkg/bindings"
+ "github.com/containers/libpod/pkg/bindings/containers"
+ "github.com/containers/libpod/pkg/specgen"
"github.com/onsi/ginkgo"
"github.com/onsi/gomega/gexec"
"github.com/pkg/errors"
@@ -55,6 +60,16 @@ type bindingTest struct {
tempDirPath string
runRoot string
crioRoot string
+ conn context.Context
+}
+
+func (b *bindingTest) NewConnection() error {
+ connText, err := NewConnection(context.Background(), b.sock)
+ if err != nil {
+ return err
+ }
+ b.conn = connText
+ return nil
}
func (b *bindingTest) runPodman(command []string) *gexec.Session {
@@ -138,7 +153,7 @@ func (b *bindingTest) startAPIService() *gexec.Session {
var (
cmd []string
)
- cmd = append(cmd, "--log-level=debug", "system", "service", "--timeout=999999", b.sock)
+ cmd = append(cmd, "--log-level=debug", "--events-backend=file", "system", "service", "--timeout=0", b.sock)
return b.runPodman(cmd)
}
@@ -173,17 +188,27 @@ func (b *bindingTest) restoreImageFromCache(i testImage) {
// Run a container within or without a pod
// and add or append the alpine image to it
-func (b *bindingTest) RunTopContainer(containerName *string, insidePod *bool, podName *string) {
- cmd := []string{"run", "-dt"}
+func (b *bindingTest) RunTopContainer(containerName *string, insidePod *bool, podName *string) (string, error) {
+ s := specgen.NewSpecGenerator(alpine.name)
+ s.Terminal = false
+ s.Command = []string{"top"}
+ if containerName != nil {
+ s.Name = *containerName
+ }
if insidePod != nil && podName != nil {
- pName := *podName
- cmd = append(cmd, "--pod", pName)
- } else if containerName != nil {
- cName := *containerName
- cmd = append(cmd, "--name", cName)
+ s.Pod = *podName
}
- cmd = append(cmd, alpine.name, "top")
- b.runPodman(cmd).Wait(45)
+ ctr, err := containers.CreateWithSpec(b.conn, s)
+ if err != nil {
+ return "", nil
+ }
+ err = containers.Start(b.conn, ctr.ID, nil)
+ if err != nil {
+ return "", err
+ }
+ wait := define.ContainerStateRunning
+ _, err = containers.Wait(b.conn, ctr.ID, &wait)
+ return ctr.ID, err
}
// This method creates a pod with the given pod name.
@@ -240,3 +265,7 @@ func createCache() {
}
b.cleanup()
}
+
+func isStopped(state string) bool {
+ return state == "exited" || state == "stopped"
+}
diff --git a/pkg/bindings/test/containers_test.go b/pkg/bindings/test/containers_test.go
index 6756e81c7..9dd9cb707 100644
--- a/pkg/bindings/test/containers_test.go
+++ b/pkg/bindings/test/containers_test.go
@@ -1,13 +1,15 @@
package test_bindings
import (
- "context"
"net/http"
"strconv"
+ "strings"
"time"
+ "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/bindings"
"github.com/containers/libpod/pkg/bindings/containers"
+ "github.com/containers/libpod/pkg/specgen"
"github.com/containers/libpod/test/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@@ -16,12 +18,9 @@ import (
var _ = Describe("Podman containers ", func() {
var (
- bt *bindingTest
- s *gexec.Session
- connText context.Context
- err error
- falseFlag bool = false
- trueFlag bool = true
+ bt *bindingTest
+ s *gexec.Session
+ err error
)
BeforeEach(func() {
@@ -29,7 +28,7 @@ var _ = Describe("Podman containers ", func() {
bt.RestoreImagesFromCache()
s = bt.startAPIService()
time.Sleep(1 * time.Second)
- connText, err = bindings.NewConnection(context.Background(), bt.sock)
+ err := bt.NewConnection()
Expect(err).To(BeNil())
})
@@ -40,7 +39,7 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a bogus container", func() {
// Pausing bogus container should return 404
- err = containers.Pause(connText, "foobar")
+ err = containers.Pause(bt.conn, "foobar")
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
@@ -48,7 +47,7 @@ var _ = Describe("Podman containers ", func() {
It("podman unpause a bogus container", func() {
// Unpausing bogus container should return 404
- err = containers.Unpause(connText, "foobar")
+ err = containers.Unpause(bt.conn, "foobar")
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
@@ -57,12 +56,13 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a running container by name", func() {
// Pausing by name should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Pause(connText, name)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+ err = containers.Pause(bt.conn, name)
Expect(err).To(BeNil())
// Ensure container is paused
- data, err := containers.Inspect(connText, name, nil)
+ data, err := containers.Inspect(bt.conn, name, nil)
Expect(err).To(BeNil())
Expect(data.State.Status).To(Equal("paused"))
})
@@ -70,54 +70,60 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a running container by id", func() {
// Pausing by id should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).To(BeNil())
// Ensure container is paused
- data, err = containers.Inspect(connText, data.ID, nil)
+ data, err := containers.Inspect(bt.conn, cid, nil)
+ Expect(err).To(BeNil())
Expect(data.State.Status).To(Equal("paused"))
})
It("podman unpause a running container by name", func() {
// Unpausing by name should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Pause(connText, name)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Unpause(connText, name)
+ err = containers.Pause(bt.conn, name)
+ Expect(err).To(BeNil())
+ err = containers.Unpause(bt.conn, name)
Expect(err).To(BeNil())
// Ensure container is unpaused
- data, err := containers.Inspect(connText, name, nil)
+ data, err := containers.Inspect(bt.conn, name, nil)
+ Expect(err).To(BeNil())
Expect(data.State.Status).To(Equal("running"))
})
It("podman unpause a running container by ID", func() {
// Unpausing by ID should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- // Pause by name
- err := containers.Pause(connText, name)
- data, err := containers.Inspect(connText, name, nil)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Unpause(connText, data.ID)
+ // Pause by name
+ err = containers.Pause(bt.conn, name)
+ //paused := "paused"
+ //_, err = containers.Wait(bt.conn, cid, &paused)
+ //Expect(err).To(BeNil())
+ err = containers.Unpause(bt.conn, name)
Expect(err).To(BeNil())
// Ensure container is unpaused
- data, err = containers.Inspect(connText, name, nil)
+ data, err := containers.Inspect(bt.conn, name, nil)
+ Expect(err).To(BeNil())
Expect(data.State.Status).To(Equal("running"))
})
It("podman pause a paused container by name", func() {
// Pausing a paused container by name should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Pause(connText, name)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+ err = containers.Pause(bt.conn, name)
Expect(err).To(BeNil())
- err = containers.Pause(connText, name)
+ err = containers.Pause(bt.conn, name)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -126,12 +132,11 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a paused container by id", func() {
// Pausing a paused container by id should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -140,10 +145,11 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a stopped container by name", func() {
// Pausing a stopped container by name should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Stop(connText, name, nil)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, name)
+ err = containers.Stop(bt.conn, name, nil)
+ Expect(err).To(BeNil())
+ err = containers.Pause(bt.conn, name)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -152,11 +158,11 @@ var _ = Describe("Podman containers ", func() {
It("podman pause a stopped container by id", func() {
// Pausing a stopped container by id should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
- err = containers.Stop(connText, data.ID, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+ err = containers.Stop(bt.conn, cid, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -165,12 +171,11 @@ var _ = Describe("Podman containers ", func() {
It("podman remove a paused container by id without force", func() {
// Removing a paused container without force should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).To(BeNil())
- err = containers.Remove(connText, data.ID, &falseFlag, &falseFlag)
+ err = containers.Remove(bt.conn, cid, &bindings.PFalse, &bindings.PFalse)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -187,22 +192,22 @@ var _ = Describe("Podman containers ", func() {
// Removing a paused container with force should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).To(BeNil())
- err = containers.Remove(connText, data.ID, &trueFlag, &falseFlag)
+ err = containers.Remove(bt.conn, cid, &bindings.PTrue, &bindings.PFalse)
Expect(err).To(BeNil())
})
It("podman stop a paused container by name", func() {
// Stopping a paused container by name should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Pause(connText, name)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Stop(connText, name, nil)
+ err = containers.Pause(bt.conn, name)
+ Expect(err).To(BeNil())
+ err = containers.Stop(bt.conn, name, nil)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -211,12 +216,11 @@ var _ = Describe("Podman containers ", func() {
It("podman stop a paused container by id", func() {
// Stopping a paused container by id should fail
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Pause(connText, data.ID)
+ err = containers.Pause(bt.conn, cid)
Expect(err).To(BeNil())
- err = containers.Stop(connText, data.ID, nil)
+ err = containers.Stop(bt.conn, cid, nil)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -225,29 +229,185 @@ var _ = Describe("Podman containers ", func() {
It("podman stop a running container by name", func() {
// Stopping a running container by name should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- err := containers.Stop(connText, name, nil)
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+ err = containers.Stop(bt.conn, name, nil)
Expect(err).To(BeNil())
// Ensure container is stopped
- data, err := containers.Inspect(connText, name, nil)
+ data, err := containers.Inspect(bt.conn, name, nil)
Expect(err).To(BeNil())
- Expect(data.State.Status).To(Equal("exited"))
+ Expect(isStopped(data.State.Status)).To(BeTrue())
})
It("podman stop a running container by ID", func() {
// Stopping a running container by ID should work
var name = "top"
- bt.RunTopContainer(&name, &falseFlag, nil)
- data, err := containers.Inspect(connText, name, nil)
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
Expect(err).To(BeNil())
- err = containers.Stop(connText, data.ID, nil)
+ err = containers.Stop(bt.conn, cid, nil)
Expect(err).To(BeNil())
// Ensure container is stopped
- data, err = containers.Inspect(connText, name, nil)
+ data, err := containers.Inspect(bt.conn, name, nil)
+ Expect(err).To(BeNil())
+ Expect(isStopped(data.State.Status)).To(BeTrue())
+ })
+
+ It("podman wait no condition", func() {
+ var (
+ name = "top"
+ exitCode int32 = -1
+ )
+ _, err := containers.Wait(bt.conn, "foobar", nil)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ errChan := make(chan error)
+ _, err = bt.RunTopContainer(&name, nil, nil)
Expect(err).To(BeNil())
- Expect(data.State.Status).To(Equal("exited"))
+ go func() {
+ exitCode, err = containers.Wait(bt.conn, name, nil)
+ errChan <- err
+ close(errChan)
+ }()
+ err = containers.Stop(bt.conn, name, nil)
+ Expect(err).To(BeNil())
+ wait := <-errChan
+ Expect(wait).To(BeNil())
+ Expect(exitCode).To(BeNumerically("==", 143))
})
+ It("podman wait to pause|unpause condition", func() {
+ var (
+ name = "top"
+ exitCode int32 = -1
+ pause = define.ContainerStatePaused
+ running = define.ContainerStateRunning
+ )
+ errChan := make(chan error)
+ _, err := bt.RunTopContainer(&name, nil, nil)
+ Expect(err).To(BeNil())
+ go func() {
+ exitCode, err = containers.Wait(bt.conn, name, &pause)
+ errChan <- err
+ close(errChan)
+ }()
+ err = containers.Pause(bt.conn, name)
+ Expect(err).To(BeNil())
+ wait := <-errChan
+ Expect(wait).To(BeNil())
+ Expect(exitCode).To(BeNumerically("==", -1))
+
+ errChan = make(chan error)
+ go func() {
+ _, waitErr := containers.Wait(bt.conn, name, &running)
+ errChan <- waitErr
+ close(errChan)
+ }()
+ err = containers.Unpause(bt.conn, name)
+ Expect(err).To(BeNil())
+ unPausewait := <-errChan
+ Expect(unPausewait).To(BeNil())
+ Expect(exitCode).To(BeNumerically("==", -1))
+ })
+
+ It("run healthcheck", func() {
+ bt.runPodman([]string{"run", "-d", "--name", "hc", "--health-interval", "disable", "--health-retries", "2", "--health-cmd", "ls / || exit 1", alpine.name, "top"})
+
+ // bogus name should result in 404
+ _, err := containers.RunHealthCheck(bt.conn, "foobar")
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ // a container that has no healthcheck should be a 409
+ var name = "top"
+ bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ _, err = containers.RunHealthCheck(bt.conn, name)
+ Expect(err).ToNot(BeNil())
+ code, _ = bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusConflict))
+
+ // TODO for the life of me, i cannot get this to work. maybe another set
+ // of eyes will
+ // successful healthcheck
+ //status := "healthy"
+ //for i:=0; i < 10; i++ {
+ // result, err := containers.RunHealthCheck(connText, "hc")
+ // Expect(err).To(BeNil())
+ // if result.Status != "healthy" {
+ // fmt.Println("Healthcheck container still starting, retrying in 1 second")
+ // time.Sleep(1 * time.Second)
+ // continue
+ // }
+ // status = result.Status
+ // break
+ //}
+ //Expect(status).To(Equal("healthy"))
+
+ // TODO enable this when wait is working
+ // healthcheck on a stopped container should be a 409
+ //err = containers.Stop(connText, "hc", nil)
+ //Expect(err).To(BeNil())
+ //_, err = containers.Wait(connText, "hc")
+ //Expect(err).To(BeNil())
+ //_, err = containers.RunHealthCheck(connText, "hc")
+ //code, _ = bindings.CheckResponseCode(err)
+ //Expect(code).To(BeNumerically("==", http.StatusConflict))
+ })
+
+ It("logging", func() {
+ stdoutChan := make(chan string, 10)
+ s := specgen.NewSpecGenerator(alpine.name)
+ s.Terminal = true
+ s.Command = []string{"date", "-R"}
+ r, err := containers.CreateWithSpec(bt.conn, s)
+ Expect(err).To(BeNil())
+ err = containers.Start(bt.conn, r.ID, nil)
+ Expect(err).To(BeNil())
+
+ _, err = containers.Wait(bt.conn, r.ID, nil)
+ Expect(err).To(BeNil())
+
+ opts := containers.LogOptions{Stdout: &bindings.PTrue, Follow: &bindings.PTrue}
+ go func() {
+ containers.Logs(bt.conn, r.ID, opts, stdoutChan, nil)
+ }()
+ o := <-stdoutChan
+ o = strings.ReplaceAll(o, "\r", "")
+ _, err = time.Parse(time.RFC1123Z, o)
+ Expect(err).To(BeNil())
+ })
+
+ It("podman top", func() {
+ var name = "top"
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+
+ // By name
+ output, err := containers.Top(bt.conn, name, nil)
+ Expect(err).To(BeNil())
+
+ // By id
+ output, err = containers.Top(bt.conn, cid, nil)
+ Expect(err).To(BeNil())
+
+ // With descriptors
+ output, err = containers.Top(bt.conn, cid, []string{"user,pid,hpid"})
+ Expect(err).To(BeNil())
+ header := strings.Split(output[0], "\t")
+ for _, d := range []string{"USER", "PID", "HPID"} {
+ Expect(d).To(BeElementOf(header))
+ }
+
+ // With bogus ID
+ _, err = containers.Top(bt.conn, "IdoNotExist", nil)
+ Expect(err).ToNot(BeNil())
+
+ // With bogus descriptors
+ _, err = containers.Top(bt.conn, cid, []string{"Me,Neither"})
+ Expect(err).To(BeNil())
+ })
})
diff --git a/pkg/bindings/test/create_test.go b/pkg/bindings/test/create_test.go
new file mode 100644
index 000000000..f83a9b14d
--- /dev/null
+++ b/pkg/bindings/test/create_test.go
@@ -0,0 +1,50 @@
+package test_bindings
+
+import (
+ "time"
+
+ "github.com/containers/libpod/pkg/bindings/containers"
+ "github.com/containers/libpod/pkg/specgen"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gexec"
+)
+
+var _ = Describe("Create containers ", func() {
+ var (
+ bt *bindingTest
+ s *gexec.Session
+ )
+
+ BeforeEach(func() {
+ bt = newBindingTest()
+ bt.RestoreImagesFromCache()
+ s = bt.startAPIService()
+ time.Sleep(1 * time.Second)
+ err := bt.NewConnection()
+ Expect(err).To(BeNil())
+ })
+
+ AfterEach(func() {
+ s.Kill()
+ bt.cleanup()
+ })
+
+ It("create a container running top", func() {
+ s := specgen.NewSpecGenerator(alpine.name)
+ s.Command = []string{"top"}
+ s.Terminal = true
+ s.Name = "top"
+ ctr, err := containers.CreateWithSpec(bt.conn, s)
+ Expect(err).To(BeNil())
+ data, err := containers.Inspect(bt.conn, ctr.ID, nil)
+ Expect(err).To(BeNil())
+ Expect(data.Name).To(Equal("top"))
+ err = containers.Start(bt.conn, ctr.ID, nil)
+ Expect(err).To(BeNil())
+ data, err = containers.Inspect(bt.conn, ctr.ID, nil)
+ Expect(err).To(BeNil())
+ Expect(data.State.Status).To(Equal("running"))
+ })
+
+})
diff --git a/pkg/bindings/test/exec_test.go b/pkg/bindings/test/exec_test.go
new file mode 100644
index 000000000..1ef2197b6
--- /dev/null
+++ b/pkg/bindings/test/exec_test.go
@@ -0,0 +1,77 @@
+package test_bindings
+
+import (
+ "time"
+
+ "github.com/containers/libpod/pkg/api/handlers"
+ "github.com/containers/libpod/pkg/bindings"
+ "github.com/containers/libpod/pkg/bindings/containers"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gexec"
+)
+
+var _ = Describe("Podman containers exec", func() {
+ var (
+ bt *bindingTest
+ s *gexec.Session
+ )
+
+ BeforeEach(func() {
+ bt = newBindingTest()
+ bt.RestoreImagesFromCache()
+ s = bt.startAPIService()
+ time.Sleep(1 * time.Second)
+ err := bt.NewConnection()
+ Expect(err).To(BeNil())
+ })
+
+ AfterEach(func() {
+ s.Kill()
+ bt.cleanup()
+ })
+
+ It("Podman exec create makes an exec session", func() {
+ name := "testCtr"
+ cid, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+
+ execConfig := new(handlers.ExecCreateConfig)
+ execConfig.Cmd = []string{"echo", "hello world"}
+
+ sessionID, err := containers.ExecCreate(bt.conn, name, execConfig)
+ Expect(err).To(BeNil())
+ Expect(sessionID).To(Not(Equal("")))
+
+ inspectOut, err := containers.ExecInspect(bt.conn, sessionID)
+ Expect(err).To(BeNil())
+ Expect(inspectOut.ContainerID).To(Equal(cid))
+ Expect(inspectOut.ProcessConfig.Entrypoint).To(Equal("echo"))
+ Expect(len(inspectOut.ProcessConfig.Arguments)).To(Equal(1))
+ Expect(inspectOut.ProcessConfig.Arguments[0]).To(Equal("hello world"))
+ })
+
+ It("Podman exec create with bad command fails", func() {
+ name := "testCtr"
+ _, err := bt.RunTopContainer(&name, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
+
+ execConfig := new(handlers.ExecCreateConfig)
+
+ _, err = containers.ExecCreate(bt.conn, name, execConfig)
+ Expect(err).To(Not(BeNil()))
+ })
+
+ It("Podman exec create with invalid container fails", func() {
+ execConfig := new(handlers.ExecCreateConfig)
+ execConfig.Cmd = []string{"echo", "hello world"}
+
+ _, err := containers.ExecCreate(bt.conn, "doesnotexist", execConfig)
+ Expect(err).To(Not(BeNil()))
+ })
+
+ It("Podman exec inspect on invalid session fails", func() {
+ _, err := containers.ExecInspect(bt.conn, "0000000000000000000000000000000000000000000000000000000000000000")
+ Expect(err).To(Not(BeNil()))
+ })
+})
diff --git a/pkg/bindings/test/images_test.go b/pkg/bindings/test/images_test.go
index 8eef28502..13b6086c3 100644
--- a/pkg/bindings/test/images_test.go
+++ b/pkg/bindings/test/images_test.go
@@ -1,7 +1,6 @@
package test_bindings
import (
- "context"
"net/http"
"os"
"path/filepath"
@@ -17,68 +16,66 @@ import (
var _ = Describe("Podman images", func() {
var (
- //tempdir string
- //err error
- //podmanTest *PodmanTestIntegration
- bt *bindingTest
- s *gexec.Session
- connText context.Context
- err error
- falseFlag bool = false
- trueFlag bool = true
+ // tempdir string
+ // err error
+ // podmanTest *PodmanTestIntegration
+ bt *bindingTest
+ s *gexec.Session
+ err error
)
BeforeEach(func() {
- //tempdir, err = CreateTempDirInTempDir()
- //if err != nil {
+ // tempdir, err = CreateTempDirInTempDir()
+ // if err != nil {
// os.Exit(1)
- //}
- //podmanTest = PodmanTestCreate(tempdir)
- //podmanTest.Setup()
- //podmanTest.SeedImages()
+ // }
+ // podmanTest = PodmanTestCreate(tempdir)
+ // podmanTest.Setup()
+ // podmanTest.SeedImages()
bt = newBindingTest()
bt.RestoreImagesFromCache()
s = bt.startAPIService()
time.Sleep(1 * time.Second)
- connText, err = bindings.NewConnection(context.Background(), bt.sock)
+ err := bt.NewConnection()
Expect(err).To(BeNil())
})
AfterEach(func() {
- //podmanTest.Cleanup()
- //f := CurrentGinkgoTestDescription()
- //processTestResult(f)
+ // podmanTest.Cleanup()
+ // f := CurrentGinkgoTestDescription()
+ // processTestResult(f)
s.Kill()
bt.cleanup()
})
+
It("inspect image", func() {
// Inspect invalid image be 404
- _, err = images.GetImage(connText, "foobar5000", nil)
+ _, err = images.GetImage(bt.conn, "foobar5000", nil)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Inspect by short name
- data, err := images.GetImage(connText, alpine.shortName, nil)
+ data, err := images.GetImage(bt.conn, alpine.shortName, nil)
Expect(err).To(BeNil())
// Inspect with full ID
- _, err = images.GetImage(connText, data.ID, nil)
+ _, err = images.GetImage(bt.conn, data.ID, nil)
Expect(err).To(BeNil())
// Inspect with partial ID
- _, err = images.GetImage(connText, data.ID[0:12], nil)
+ _, err = images.GetImage(bt.conn, data.ID[0:12], nil)
Expect(err).To(BeNil())
// Inspect by long name
- _, err = images.GetImage(connText, alpine.name, nil)
+ _, err = images.GetImage(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
// TODO it looks like the images API alwaays returns size regardless
// of bool or not. What should we do ?
- //Expect(data.Size).To(BeZero())
+ // Expect(data.Size).To(BeZero())
// Enabling the size parameter should result in size being populated
- data, err = images.GetImage(connText, alpine.name, &trueFlag)
+ data, err = images.GetImage(bt.conn, alpine.name, &bindings.PTrue)
Expect(err).To(BeNil())
Expect(data.Size).To(BeNumerically(">", 0))
})
@@ -86,49 +83,50 @@ var _ = Describe("Podman images", func() {
// Test to validate the remove image api
It("remove image", func() {
// Remove invalid image should be a 404
- _, err = images.Remove(connText, "foobar5000", &falseFlag)
+ _, err = images.Remove(bt.conn, "foobar5000", &bindings.PFalse)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Remove an image by name, validate image is removed and error is nil
- inspectData, err := images.GetImage(connText, busybox.shortName, nil)
+ inspectData, err := images.GetImage(bt.conn, busybox.shortName, nil)
Expect(err).To(BeNil())
- response, err := images.Remove(connText, busybox.shortName, nil)
+ response, err := images.Remove(bt.conn, busybox.shortName, nil)
Expect(err).To(BeNil())
Expect(inspectData.ID).To(Equal(response[0]["Deleted"]))
- inspectData, err = images.GetImage(connText, busybox.shortName, nil)
+ inspectData, err = images.GetImage(bt.conn, busybox.shortName, nil)
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Start a container with alpine image
var top string = "top"
- bt.RunTopContainer(&top, &falseFlag, nil)
+ _, err = bt.RunTopContainer(&top, &bindings.PFalse, nil)
+ Expect(err).To(BeNil())
// we should now have a container called "top" running
- containerResponse, err := containers.Inspect(connText, "top", &falseFlag)
+ containerResponse, err := containers.Inspect(bt.conn, "top", &bindings.PFalse)
Expect(err).To(BeNil())
Expect(containerResponse.Name).To(Equal("top"))
// try to remove the image "alpine". This should fail since we are not force
// deleting hence image cannot be deleted until the container is deleted.
- response, err = images.Remove(connText, alpine.shortName, &falseFlag)
+ response, err = images.Remove(bt.conn, alpine.shortName, &bindings.PFalse)
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
// Removing the image "alpine" where force = true
- response, err = images.Remove(connText, alpine.shortName, &trueFlag)
+ response, err = images.Remove(bt.conn, alpine.shortName, &bindings.PTrue)
Expect(err).To(BeNil())
// Checking if both the images are gone as well as the container is deleted
- inspectData, err = images.GetImage(connText, busybox.shortName, nil)
+ inspectData, err = images.GetImage(bt.conn, busybox.shortName, nil)
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
- inspectData, err = images.GetImage(connText, alpine.shortName, nil)
+ inspectData, err = images.GetImage(bt.conn, alpine.shortName, nil)
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
- _, err = containers.Inspect(connText, "top", &falseFlag)
+ _, err = containers.Inspect(bt.conn, "top", &bindings.PFalse)
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
})
@@ -136,17 +134,17 @@ var _ = Describe("Podman images", func() {
// Tests to validate the image tag command.
It("tag image", func() {
// Validates if invalid image name is given a bad response is encountered.
- err = images.Tag(connText, "dummy", "demo", alpine.shortName)
+ err = images.Tag(bt.conn, "dummy", "demo", alpine.shortName)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
- // Validates if the image is tagged sucessfully.
- err = images.Tag(connText, alpine.shortName, "demo", alpine.shortName)
+ // Validates if the image is tagged successfully.
+ err = images.Tag(bt.conn, alpine.shortName, "demo", alpine.shortName)
Expect(err).To(BeNil())
- //Validates if name updates when the image is retagged.
- _, err := images.GetImage(connText, "alpine:demo", nil)
+ // Validates if name updates when the image is retagged.
+ _, err := images.GetImage(bt.conn, "alpine:demo", nil)
Expect(err).To(BeNil())
})
@@ -154,7 +152,7 @@ var _ = Describe("Podman images", func() {
// Test to validate the List images command.
It("List image", func() {
// Array to hold the list of images returned
- imageSummary, err := images.List(connText, nil, nil)
+ imageSummary, err := images.List(bt.conn, nil, nil)
// There Should be no errors in the response.
Expect(err).To(BeNil())
// Since in the begin context two images are created the
@@ -164,11 +162,11 @@ var _ = Describe("Podman images", func() {
// Adding one more image. There Should be no errors in the response.
// And the count should be three now.
bt.Pull("busybox:glibc")
- imageSummary, err = images.List(connText, nil, nil)
+ imageSummary, err = images.List(bt.conn, nil, nil)
Expect(err).To(BeNil())
Expect(len(imageSummary)).To(Equal(3))
- //Validate the image names.
+ // Validate the image names.
var names []string
for _, i := range imageSummary {
names = append(names, i.RepoTags...)
@@ -179,13 +177,13 @@ var _ = Describe("Podman images", func() {
// List images with a filter
filters := make(map[string][]string)
filters["reference"] = []string{alpine.name}
- filteredImages, err := images.List(connText, &falseFlag, filters)
+ filteredImages, err := images.List(bt.conn, &bindings.PFalse, filters)
Expect(err).To(BeNil())
Expect(len(filteredImages)).To(BeNumerically("==", 1))
// List images with a bad filter
filters["name"] = []string{alpine.name}
- _, err = images.List(connText, &falseFlag, filters)
+ _, err = images.List(bt.conn, &bindings.PFalse, filters)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -193,64 +191,64 @@ var _ = Describe("Podman images", func() {
It("Image Exists", func() {
// exists on bogus image should be false, with no error
- exists, err := images.Exists(connText, "foobar")
+ exists, err := images.Exists(bt.conn, "foobar")
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
// exists with shortname should be true
- exists, err = images.Exists(connText, alpine.shortName)
+ exists, err = images.Exists(bt.conn, alpine.shortName)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
// exists with fqname should be true
- exists, err = images.Exists(connText, alpine.name)
+ exists, err = images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
})
It("Load|Import Image", func() {
// load an image
- _, err := images.Remove(connText, alpine.name, nil)
+ _, err := images.Remove(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
- exists, err := images.Exists(connText, alpine.name)
+ exists, err := images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
f, err := os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
defer f.Close()
Expect(err).To(BeNil())
- names, err := images.Load(connText, f, nil)
+ names, err := images.Load(bt.conn, f, nil)
Expect(err).To(BeNil())
Expect(names).To(Equal(alpine.name))
- exists, err = images.Exists(connText, alpine.name)
+ exists, err = images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
// load with a repo name
f, err = os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
Expect(err).To(BeNil())
- _, err = images.Remove(connText, alpine.name, nil)
+ _, err = images.Remove(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
- exists, err = images.Exists(connText, alpine.name)
+ exists, err = images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
newName := "quay.io/newname:fizzle"
- names, err = images.Load(connText, f, &newName)
+ names, err = images.Load(bt.conn, f, &newName)
Expect(err).To(BeNil())
Expect(names).To(Equal(alpine.name))
- exists, err = images.Exists(connText, newName)
+ exists, err = images.Exists(bt.conn, newName)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
// load with a bad repo name should trigger a 500
f, err = os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
Expect(err).To(BeNil())
- _, err = images.Remove(connText, alpine.name, nil)
+ _, err = images.Remove(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
- exists, err = images.Exists(connText, alpine.name)
+ exists, err = images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
badName := "quay.io/newName:fizzle"
- _, err = images.Load(connText, f, &badName)
+ _, err = images.Load(bt.conn, f, &badName)
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
@@ -262,7 +260,7 @@ var _ = Describe("Podman images", func() {
w, err := os.Create(filepath.Join(bt.tempDirPath, alpine.tarballName))
defer w.Close()
Expect(err).To(BeNil())
- err = images.Export(connText, alpine.name, w, nil, nil)
+ err = images.Export(bt.conn, alpine.name, w, nil, nil)
Expect(err).To(BeNil())
_, err = os.Stat(exportPath)
Expect(err).To(BeNil())
@@ -272,9 +270,9 @@ var _ = Describe("Podman images", func() {
It("Import Image", func() {
// load an image
- _, err = images.Remove(connText, alpine.name, nil)
+ _, err = images.Remove(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
- exists, err := images.Exists(connText, alpine.name)
+ exists, err := images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeFalse())
f, err := os.Open(filepath.Join(ImageCacheDir, alpine.tarballName))
@@ -282,27 +280,28 @@ var _ = Describe("Podman images", func() {
Expect(err).To(BeNil())
changes := []string{"CMD /bin/foobar"}
testMessage := "test_import"
- _, err = images.Import(connText, changes, &testMessage, &alpine.name, nil, f)
+ _, err = images.Import(bt.conn, changes, &testMessage, &alpine.name, nil, f)
Expect(err).To(BeNil())
- exists, err = images.Exists(connText, alpine.name)
+ exists, err = images.Exists(bt.conn, alpine.name)
Expect(err).To(BeNil())
Expect(exists).To(BeTrue())
- data, err := images.GetImage(connText, alpine.name, nil)
+ data, err := images.GetImage(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
Expect(data.Comment).To(Equal(testMessage))
})
+
It("History Image", func() {
// a bogus name should return a 404
- _, err := images.History(connText, "foobar")
+ _, err := images.History(bt.conn, "foobar")
Expect(err).To(Not(BeNil()))
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
var foundID bool
- data, err := images.GetImage(connText, alpine.name, nil)
+ data, err := images.GetImage(bt.conn, alpine.name, nil)
Expect(err).To(BeNil())
- history, err := images.History(connText, alpine.name)
+ history, err := images.History(bt.conn, alpine.name)
Expect(err).To(BeNil())
for _, i := range history {
if i.ID == data.ID {
@@ -314,7 +313,7 @@ var _ = Describe("Podman images", func() {
})
It("Search for an image", func() {
- imgs, err := images.Search(connText, "alpine", nil, nil)
+ imgs, err := images.Search(bt.conn, "alpine", nil, nil)
Expect(err).To(BeNil())
Expect(len(imgs)).To(BeNumerically(">", 1))
var foundAlpine bool
@@ -328,22 +327,30 @@ var _ = Describe("Podman images", func() {
// Search for alpine with a limit of 10
ten := 10
- imgs, err = images.Search(connText, "docker.io/alpine", &ten, nil)
+ imgs, err = images.Search(bt.conn, "docker.io/alpine", &ten, nil)
Expect(err).To(BeNil())
Expect(len(imgs)).To(BeNumerically("<=", 10))
// Search for alpine with stars greater than 100
filters := make(map[string][]string)
filters["stars"] = []string{"100"}
- imgs, err = images.Search(connText, "docker.io/alpine", nil, filters)
+ imgs, err = images.Search(bt.conn, "docker.io/alpine", nil, filters)
Expect(err).To(BeNil())
for _, i := range imgs {
Expect(i.Stars).To(BeNumerically(">=", 100))
}
// Search with a fqdn
- imgs, err = images.Search(connText, "quay.io/libpod/alpine_nginx", nil, nil)
+ imgs, err = images.Search(bt.conn, "quay.io/libpod/alpine_nginx", nil, nil)
Expect(len(imgs)).To(BeNumerically(">=", 1))
})
+ It("Prune images", func() {
+ trueBoxed := true
+ results, err := images.Prune(bt.conn, &trueBoxed, nil)
+ Expect(err).NotTo(HaveOccurred())
+ Expect(len(results)).To(BeNumerically(">", 0))
+ Expect(results).To(ContainElement("docker.io/library/alpine:latest"))
+ })
+
})
diff --git a/pkg/bindings/test/manifests_test.go b/pkg/bindings/test/manifests_test.go
new file mode 100644
index 000000000..23c3d8194
--- /dev/null
+++ b/pkg/bindings/test/manifests_test.go
@@ -0,0 +1,124 @@
+package test_bindings
+
+import (
+ "net/http"
+ "time"
+
+ "github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/pkg/bindings"
+ "github.com/containers/libpod/pkg/bindings/images"
+ "github.com/containers/libpod/pkg/bindings/manifests"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gexec"
+)
+
+var _ = Describe("Podman containers ", func() {
+ var (
+ bt *bindingTest
+ s *gexec.Session
+ )
+
+ BeforeEach(func() {
+ bt = newBindingTest()
+ bt.RestoreImagesFromCache()
+ s = bt.startAPIService()
+ time.Sleep(1 * time.Second)
+ err := bt.NewConnection()
+ Expect(err).To(BeNil())
+ })
+
+ AfterEach(func() {
+ s.Kill()
+ bt.cleanup()
+ })
+
+ It("create manifest", func() {
+ // create manifest list without images
+ id, err := manifests.Create(bt.conn, []string{"quay.io/libpod/foobar:latest"}, []string{}, nil)
+ Expect(err).To(BeNil())
+ list, err := manifests.Inspect(bt.conn, id)
+ Expect(err).To(BeNil())
+ Expect(len(list.Manifests)).To(BeZero())
+
+ // creating a duplicate should fail as a 500
+ _, err = manifests.Create(bt.conn, []string{"quay.io/libpod/foobar:latest"}, []string{}, nil)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
+
+ _, err = images.Remove(bt.conn, id, nil)
+ Expect(err).To(BeNil())
+
+ // create manifest list with images
+ id, err = manifests.Create(bt.conn, []string{"quay.io/libpod/foobar:latest"}, []string{alpine.name}, nil)
+ Expect(err).To(BeNil())
+ list, err = manifests.Inspect(bt.conn, id)
+ Expect(err).To(BeNil())
+ Expect(len(list.Manifests)).To(BeNumerically("==", 1))
+ })
+
+ It("inspect bogus manifest", func() {
+ _, err := manifests.Inspect(bt.conn, "larry")
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+ })
+
+ It("add manifest", func() {
+ // add to bogus should 404
+ _, err := manifests.Add(bt.conn, "foobar", image.ManifestAddOpts{})
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ id, err := manifests.Create(bt.conn, []string{"quay.io/libpod/foobar:latest"}, []string{}, nil)
+ Expect(err).To(BeNil())
+ opts := image.ManifestAddOpts{Images: []string{alpine.name}}
+ _, err = manifests.Add(bt.conn, id, opts)
+ Expect(err).To(BeNil())
+ list, err := manifests.Inspect(bt.conn, id)
+ Expect(err).To(BeNil())
+ Expect(len(list.Manifests)).To(BeNumerically("==", 1))
+
+ // add bogus name to existing list should fail
+ opts.Images = []string{"larry"}
+ _, err = manifests.Add(bt.conn, id, opts)
+ Expect(err).ToNot(BeNil())
+ code, _ = bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
+ })
+
+ It("remove manifest", func() {
+ // removal on bogus manifest list should be 404
+ _, err := manifests.Remove(bt.conn, "larry", "1234")
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ id, err := manifests.Create(bt.conn, []string{"quay.io/libpod/foobar:latest"}, []string{alpine.name}, nil)
+ Expect(err).To(BeNil())
+ data, err := manifests.Inspect(bt.conn, id)
+ Expect(err).To(BeNil())
+ Expect(len(data.Manifests)).To(BeNumerically("==", 1))
+
+ // removal on a good manifest list with a bad digest should be 400
+ _, err = manifests.Remove(bt.conn, id, "!234")
+ Expect(err).ToNot(BeNil())
+ code, _ = bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusBadRequest))
+
+ digest := data.Manifests[0].Digest.String()
+ _, err = manifests.Remove(bt.conn, id, digest)
+ Expect(err).To(BeNil())
+
+ // removal on good manifest with good digest should work
+ data, err = manifests.Inspect(bt.conn, id)
+ Expect(err).To(BeNil())
+ Expect(len(data.Manifests)).To(BeZero())
+ })
+
+ It("push manifest", func() {
+ Skip("TODO")
+ })
+})
diff --git a/pkg/bindings/test/pods_test.go b/pkg/bindings/test/pods_test.go
index 4bea2f8d7..0f786e341 100644
--- a/pkg/bindings/test/pods_test.go
+++ b/pkg/bindings/test/pods_test.go
@@ -1,26 +1,24 @@
package test_bindings
import (
- "context"
"net/http"
"time"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/bindings"
"github.com/containers/libpod/pkg/bindings/pods"
+ "github.com/containers/libpod/pkg/specgen"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/onsi/gomega/gexec"
)
-var _ = Describe("Podman images", func() {
+var _ = Describe("Podman pods", func() {
var (
- bt *bindingTest
- s *gexec.Session
- connText context.Context
- newpod string
- err error
- trueFlag bool = true
+ bt *bindingTest
+ s *gexec.Session
+ newpod string
+ err error
)
BeforeEach(func() {
@@ -30,7 +28,7 @@ var _ = Describe("Podman images", func() {
bt.Podcreate(&newpod)
s = bt.startAPIService()
time.Sleep(1 * time.Second)
- connText, err = bindings.NewConnection(context.Background(), bt.sock)
+ err := bt.NewConnection()
Expect(err).To(BeNil())
})
@@ -41,13 +39,13 @@ var _ = Describe("Podman images", func() {
It("inspect pod", func() {
//Inspect an invalid pod name
- _, err := pods.Inspect(connText, "dummyname")
+ _, err := pods.Inspect(bt.conn, "dummyname")
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
//Inspect an valid pod name
- response, err := pods.Inspect(connText, newpod)
+ response, err := pods.Inspect(bt.conn, newpod)
Expect(err).To(BeNil())
Expect(response.Config.Name).To(Equal(newpod))
})
@@ -55,12 +53,13 @@ var _ = Describe("Podman images", func() {
// Test validates the list all api returns
It("list pod", func() {
//List all the pods in the current instance
- podSummary, err := pods.List(connText, nil)
+ podSummary, err := pods.List(bt.conn, nil)
Expect(err).To(BeNil())
Expect(len(podSummary)).To(Equal(1))
// Adding an alpine container to the existing pod
- bt.RunTopContainer(nil, &trueFlag, &newpod)
- podSummary, err = pods.List(connText, nil)
+ _, err = bt.RunTopContainer(nil, &bindings.PTrue, &newpod)
+ Expect(err).To(BeNil())
+ podSummary, err = pods.List(bt.conn, nil)
// Verify no errors.
Expect(err).To(BeNil())
// Verify number of containers in the pod.
@@ -69,33 +68,85 @@ var _ = Describe("Podman images", func() {
// Add multiple pods and verify them by name and size.
var newpod2 string = "newpod2"
bt.Podcreate(&newpod2)
- podSummary, err = pods.List(connText, nil)
+ podSummary, err = pods.List(bt.conn, nil)
Expect(len(podSummary)).To(Equal(2))
var names []string
for _, i := range podSummary {
- names = append(names, i.Config.Name)
+ names = append(names, i.Name)
}
Expect(StringInSlice(newpod, names)).To(BeTrue())
Expect(StringInSlice("newpod2", names)).To(BeTrue())
+ })
+
+ // The test validates the list pod endpoint with passing filters as the params.
+ It("List pods with filters", func() {
+ newpod2 := "newpod2"
+ bt.Podcreate(&newpod2)
+ _, err = bt.RunTopContainer(nil, &bindings.PTrue, &newpod)
+ Expect(err).To(BeNil())
+
+ // Expected err with invalid filter params
+ filters := make(map[string][]string)
+ filters["dummy"] = []string{"dummy"}
+ filteredPods, err := pods.List(bt.conn, filters)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
+
+ // Expected empty response with invalid filters
+ filters = make(map[string][]string)
+ filters["name"] = []string{"dummy"}
+ filteredPods, err = pods.List(bt.conn, filters)
+ Expect(err).To(BeNil())
+ Expect(len(filteredPods)).To(BeNumerically("==", 0))
+
+ // Validate list pod with name filter
+ filters = make(map[string][]string)
+ filters["name"] = []string{newpod2}
+ filteredPods, err = pods.List(bt.conn, filters)
+ Expect(err).To(BeNil())
+ Expect(len(filteredPods)).To(BeNumerically("==", 1))
+ var names []string
+ for _, i := range filteredPods {
+ names = append(names, i.Name)
+ }
+ Expect(StringInSlice("newpod2", names)).To(BeTrue())
- // TODO not working Because: code to list based on filter
- // "not yet implemented",
- // Validate list pod with filters
- //filters := make(map[string][]string)
- //filters["name"] = []string{newpod}
- //filteredPods, err := pods.List(connText, filters)
- //Expect(err).To(BeNil())
- //Expect(len(filteredPods)).To(BeNumerically("==", 1))
+ // Validate list pod with id filter
+ filters = make(map[string][]string)
+ response, err := pods.Inspect(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ id := response.Config.ID
+ filters["id"] = []string{id}
+ filteredPods, err = pods.List(bt.conn, filters)
+ Expect(err).To(BeNil())
+ Expect(len(filteredPods)).To(BeNumerically("==", 1))
+ names = names[:0]
+ for _, i := range filteredPods {
+ names = append(names, i.Name)
+ }
+ Expect(StringInSlice("newpod", names)).To(BeTrue())
+
+ // Using multiple filters
+ filters["name"] = []string{newpod}
+ filteredPods, err = pods.List(bt.conn, filters)
+ Expect(err).To(BeNil())
+ Expect(len(filteredPods)).To(BeNumerically("==", 1))
+ names = names[:0]
+ for _, i := range filteredPods {
+ names = append(names, i.Name)
+ }
+ Expect(StringInSlice("newpod", names)).To(BeTrue())
})
// The test validates if the exists responds
It("exists pod", func() {
- response, err := pods.Exists(connText, "dummyName")
+ response, err := pods.Exists(bt.conn, "dummyName")
Expect(err).To(BeNil())
Expect(response).To(BeFalse())
// Should exit with no error and response should be true
- response, err = pods.Exists(connText, "newpod")
+ response, err = pods.Exists(bt.conn, "newpod")
Expect(err).To(BeNil())
Expect(response).To(BeTrue())
})
@@ -103,32 +154,37 @@ var _ = Describe("Podman images", func() {
// This test validates if All running containers within
// each specified pod are paused and unpaused
It("pause upause pod", func() {
+ // TODO fix this
+ Skip("Pod behavior is jacked right now.")
// Pause invalid container
- err := pods.Pause(connText, "dummyName")
+ _, err := pods.Pause(bt.conn, "dummyName")
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Adding an alpine container to the existing pod
- bt.RunTopContainer(nil, &trueFlag, &newpod)
- response, err := pods.Inspect(connText, newpod)
+ _, err = bt.RunTopContainer(nil, &bindings.PTrue, &newpod)
Expect(err).To(BeNil())
// Binding needs to be modified to inspect the pod state.
- // Since we dont have a pod state we inspect the states of the containers within the pod.
+ // Since we don't have a pod state we inspect the states of the containers within the pod.
// Pause a valid container
- err = pods.Pause(connText, newpod)
+ _, err = pods.Pause(bt.conn, newpod)
Expect(err).To(BeNil())
- response, err = pods.Inspect(connText, newpod)
+ response, err := pods.Inspect(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ Expect(response.State.Status).To(Equal(define.PodStatePaused))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStatePaused))
}
// Unpause a valid container
- err = pods.Unpause(connText, newpod)
+ _, err = pods.Unpause(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ response, err = pods.Inspect(bt.conn, newpod)
Expect(err).To(BeNil())
- response, err = pods.Inspect(connText, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStateRunning))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStateRunning))
@@ -137,60 +193,130 @@ var _ = Describe("Podman images", func() {
It("start stop restart pod", func() {
// Start an invalid pod
- err = pods.Start(connText, "dummyName")
+ _, err = pods.Start(bt.conn, "dummyName")
Expect(err).ToNot(BeNil())
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Stop an invalid pod
- err = pods.Stop(connText, "dummyName", nil)
+ _, err = pods.Stop(bt.conn, "dummyName", nil)
Expect(err).ToNot(BeNil())
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Restart an invalid pod
- err = pods.Restart(connText, "dummyName")
+ _, err = pods.Restart(bt.conn, "dummyName")
Expect(err).ToNot(BeNil())
code, _ = bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
// Start a valid pod and inspect status of each container
- err = pods.Start(connText, newpod)
+ _, err = pods.Start(bt.conn, newpod)
Expect(err).To(BeNil())
- response, err := pods.Inspect(connText, newpod)
+ response, err := pods.Inspect(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ Expect(response.State.Status).To(Equal(define.PodStateRunning))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStateRunning))
}
// Start an already running pod
- err = pods.Start(connText, newpod)
+ _, err = pods.Start(bt.conn, newpod)
Expect(err).To(BeNil())
// Stop the running pods
- err = pods.Stop(connText, newpod, nil)
+ _, err = pods.Stop(bt.conn, newpod, nil)
Expect(err).To(BeNil())
- response, _ = pods.Inspect(connText, newpod)
+ response, _ = pods.Inspect(bt.conn, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStateStopped))
}
// Stop an already stopped pod
- err = pods.Stop(connText, newpod, nil)
+ _, err = pods.Stop(bt.conn, newpod, nil)
Expect(err).To(BeNil())
- err = pods.Restart(connText, newpod)
+ _, err = pods.Restart(bt.conn, newpod)
Expect(err).To(BeNil())
- response, _ = pods.Inspect(connText, newpod)
+ response, _ = pods.Inspect(bt.conn, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStateRunning))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStateRunning))
}
})
- // Remove all stopped pods and their container to be implemented.
+ // Test to validate all the pods in the stopped/exited state are pruned successfully.
It("prune pod", func() {
+ // Add a new pod
+ var newpod2 string = "newpod2"
+ bt.Podcreate(&newpod2)
+ // No pods pruned since no pod in exited state
+ err = pods.Prune(bt.conn)
+ Expect(err).To(BeNil())
+ podSummary, err := pods.List(bt.conn, nil)
+ Expect(err).To(BeNil())
+ Expect(len(podSummary)).To(Equal(2))
+
+ // Prune only one pod which is in exited state.
+ // Start then stop a pod.
+ // pod moves to exited state one pod should be pruned now.
+ _, err = pods.Start(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ _, err = pods.Stop(bt.conn, newpod, nil)
+ Expect(err).To(BeNil())
+ response, err := pods.Inspect(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
+ err = pods.Prune(bt.conn)
+ Expect(err).To(BeNil())
+ podSummary, err = pods.List(bt.conn, nil)
+ Expect(err).To(BeNil())
+ Expect(len(podSummary)).To(Equal(1))
+
+ // Test prune all pods in exited state.
+ bt.Podcreate(&newpod)
+ _, err = pods.Start(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ _, err = pods.Start(bt.conn, newpod2)
+ Expect(err).To(BeNil())
+ _, err = pods.Stop(bt.conn, newpod, nil)
+ Expect(err).To(BeNil())
+ response, err = pods.Inspect(bt.conn, newpod)
+ Expect(err).To(BeNil())
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
+ for _, i := range response.Containers {
+ Expect(define.StringToContainerStatus(i.State)).
+ To(Equal(define.ContainerStateStopped))
+ }
+ _, err = pods.Stop(bt.conn, newpod2, nil)
+ Expect(err).To(BeNil())
+ response, err = pods.Inspect(bt.conn, newpod2)
+ Expect(err).To(BeNil())
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
+ for _, i := range response.Containers {
+ Expect(define.StringToContainerStatus(i.State)).
+ To(Equal(define.ContainerStateStopped))
+ }
+ err = pods.Prune(bt.conn)
+ Expect(err).To(BeNil())
+ podSummary, err = pods.List(bt.conn, nil)
+ Expect(err).To(BeNil())
+ Expect(len(podSummary)).To(Equal(0))
+ })
+
+ It("simple create pod", func() {
+ ps := specgen.PodSpecGenerator{}
+ ps.Name = "foobar"
+ _, err := pods.CreatePodFromSpec(bt.conn, &ps)
+ Expect(err).To(BeNil())
+
+ exists, err := pods.Exists(bt.conn, "foobar")
+ Expect(err).To(BeNil())
+ Expect(exists).To(BeTrue())
})
})
diff --git a/pkg/bindings/test/system_test.go b/pkg/bindings/test/system_test.go
new file mode 100644
index 000000000..3abc26b34
--- /dev/null
+++ b/pkg/bindings/test/system_test.go
@@ -0,0 +1,51 @@
+package test_bindings
+
+import (
+ "time"
+
+ "github.com/containers/libpod/pkg/api/handlers"
+ "github.com/containers/libpod/pkg/bindings/system"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gexec"
+)
+
+var _ = Describe("Podman system", func() {
+ var (
+ bt *bindingTest
+ s *gexec.Session
+ )
+
+ BeforeEach(func() {
+ bt = newBindingTest()
+ bt.RestoreImagesFromCache()
+ s = bt.startAPIService()
+ time.Sleep(1 * time.Second)
+ err := bt.NewConnection()
+ Expect(err).To(BeNil())
+ })
+
+ AfterEach(func() {
+ s.Kill()
+ bt.cleanup()
+ })
+
+ It("podman events", func() {
+ eChan := make(chan handlers.Event, 1)
+ var messages []handlers.Event
+ cancelChan := make(chan bool, 1)
+ go func() {
+ for e := range eChan {
+ messages = append(messages, e)
+ }
+ }()
+ go func() {
+ system.Events(bt.conn, eChan, cancelChan, nil, nil, nil)
+ }()
+
+ _, err := bt.RunTopContainer(nil, nil, nil)
+ Expect(err).To(BeNil())
+ cancelChan <- true
+ Expect(len(messages)).To(BeNumerically("==", 3))
+ })
+})
diff --git a/pkg/bindings/test/volumes_test.go b/pkg/bindings/test/volumes_test.go
new file mode 100644
index 000000000..59fe48f22
--- /dev/null
+++ b/pkg/bindings/test/volumes_test.go
@@ -0,0 +1,173 @@
+package test_bindings
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+ "time"
+
+ "github.com/containers/libpod/pkg/bindings"
+ "github.com/containers/libpod/pkg/bindings/containers"
+ "github.com/containers/libpod/pkg/bindings/volumes"
+ "github.com/containers/libpod/pkg/domain/entities"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gexec"
+)
+
+var _ = Describe("Podman volumes", func() {
+ var (
+ //tempdir string
+ //err error
+ //podmanTest *PodmanTestIntegration
+ bt *bindingTest
+ s *gexec.Session
+ connText context.Context
+ err error
+ )
+
+ BeforeEach(func() {
+ //tempdir, err = CreateTempDirInTempDir()
+ //if err != nil {
+ // os.Exit(1)
+ //}
+ //podmanTest = PodmanTestCreate(tempdir)
+ //podmanTest.Setup()
+ //podmanTest.SeedImages()
+ bt = newBindingTest()
+ bt.RestoreImagesFromCache()
+ s = bt.startAPIService()
+ time.Sleep(1 * time.Second)
+ connText, err = bindings.NewConnection(context.Background(), bt.sock)
+ Expect(err).To(BeNil())
+ })
+
+ AfterEach(func() {
+ //podmanTest.Cleanup()
+ //f := CurrentGinkgoTestDescription()
+ //processTestResult(f)
+ s.Kill()
+ bt.cleanup()
+ })
+
+ It("create volume", func() {
+ // create a volume with blank config should work
+ _, err := volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+
+ vcc := entities.VolumeCreateOptions{
+ Name: "foobar",
+ Label: nil,
+ Options: nil,
+ }
+ vol, err := volumes.Create(connText, vcc)
+ Expect(err).To(BeNil())
+ Expect(vol.Name).To(Equal("foobar"))
+
+ // create volume with same name should 500
+ _, err = volumes.Create(connText, vcc)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
+ })
+
+ It("inspect volume", func() {
+ vol, err := volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+ data, err := volumes.Inspect(connText, vol.Name)
+ Expect(err).To(BeNil())
+ Expect(data.Name).To(Equal(vol.Name))
+ })
+
+ It("remove volume", func() {
+ // removing a bogus volume should result in 404
+ err := volumes.Remove(connText, "foobar", nil)
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ // Removing an unused volume should work
+ vol, err := volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+ err = volumes.Remove(connText, vol.Name, nil)
+ Expect(err).To(BeNil())
+
+ // Removing a volume that is being used without force should be 409
+ vol, err = volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+ session := bt.runPodman([]string{"run", "-dt", "-v", fmt.Sprintf("%s:/foobar", vol.Name), "--name", "vtest", alpine.name, "top"})
+ session.Wait(45)
+ err = volumes.Remove(connText, vol.Name, nil)
+ Expect(err).ToNot(BeNil())
+ code, _ = bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusConflict))
+
+ // Removing with a volume in use with force should work with a stopped container
+ zero := uint(0)
+ err = containers.Stop(connText, "vtest", &zero)
+ Expect(err).To(BeNil())
+ err = volumes.Remove(connText, vol.Name, &bindings.PTrue)
+ Expect(err).To(BeNil())
+ })
+
+ It("list volumes", func() {
+ // no volumes should be ok
+ vols, err := volumes.List(connText, nil)
+ Expect(err).To(BeNil())
+ Expect(len(vols)).To(BeZero())
+
+ // create a bunch of named volumes and make verify with list
+ volNames := []string{"homer", "bart", "lisa", "maggie", "marge"}
+ for i := 0; i < 5; i++ {
+ _, err = volumes.Create(connText, entities.VolumeCreateOptions{Name: volNames[i]})
+ Expect(err).To(BeNil())
+ }
+ vols, err = volumes.List(connText, nil)
+ Expect(err).To(BeNil())
+ Expect(len(vols)).To(BeNumerically("==", 5))
+ for _, v := range vols {
+ Expect(StringInSlice(v.Name, volNames)).To(BeTrue())
+ }
+
+ // list with bad filter should be 500
+ filters := make(map[string][]string)
+ filters["foobar"] = []string{"1234"}
+ _, err = volumes.List(connText, filters)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
+
+ filters = make(map[string][]string)
+ filters["name"] = []string{"homer"}
+ vols, err = volumes.List(connText, filters)
+ Expect(err).To(BeNil())
+ Expect(len(vols)).To(BeNumerically("==", 1))
+ Expect(vols[0].Name).To(Equal("homer"))
+ })
+
+ // TODO we need to add filtering to tests
+ It("prune unused volume", func() {
+ // Pruning when no volumes present should be ok
+ _, err := volumes.Prune(connText)
+ Expect(err).To(BeNil())
+
+ // Removing an unused volume should work
+ _, err = volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+ vols, err := volumes.Prune(connText)
+ Expect(err).To(BeNil())
+ Expect(len(vols)).To(BeNumerically("==", 1))
+
+ _, err = volumes.Create(connText, entities.VolumeCreateOptions{Name: "homer"})
+ Expect(err).To(BeNil())
+ _, err = volumes.Create(connText, entities.VolumeCreateOptions{})
+ Expect(err).To(BeNil())
+ session := bt.runPodman([]string{"run", "-dt", "-v", fmt.Sprintf("%s:/homer", "homer"), "--name", "vtest", alpine.name, "top"})
+ session.Wait(45)
+ vols, err = volumes.Prune(connText)
+ Expect(err).To(BeNil())
+ Expect(len(vols)).To(BeNumerically("==", 1))
+ _, err = volumes.Inspect(connText, "homer")
+ Expect(err).To(BeNil())
+ })
+
+})