summaryrefslogtreecommitdiff
path: root/pkg/bindings
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/bindings')
-rw-r--r--pkg/bindings/containers/containers.go15
-rw-r--r--pkg/bindings/test/containers_test.go57
-rw-r--r--pkg/bindings/test/pods_test.go61
3 files changed, 126 insertions, 7 deletions
diff --git a/pkg/bindings/containers/containers.go b/pkg/bindings/containers/containers.go
index 2985787a6..670321f21 100644
--- a/pkg/bindings/containers/containers.go
+++ b/pkg/bindings/containers/containers.go
@@ -210,15 +210,20 @@ func Unpause(ctx context.Context, nameOrID string) error {
return response.Process(nil)
}
-// Wait blocks until the given container exits and returns its exit code. The nameOrID can be a container name
-// or a partial/full ID.
-func Wait(ctx context.Context, nameOrID string) (int32, error) {
+// Wait blocks until the given container reaches a condition. If not provided, the condition will
+// default to stopped. If the condition is stopped, an exit code for the container will be provided. The
+// nameOrID can be a container name or a partial/full ID.
+func Wait(ctx context.Context, nameOrID string, condition *string) (int32, error) {
var exitCode int32
conn, err := bindings.GetClient(ctx)
if err != nil {
return exitCode, err
}
- response, err := conn.DoRequest(nil, http.MethodPost, "containers/%s/wait", nil, nameOrID)
+ params := url.Values{}
+ if condition != nil {
+ params.Set("condition", *condition)
+ }
+ response, err := conn.DoRequest(nil, http.MethodPost, "/containers/%s/wait", params, nameOrID)
if err != nil {
return exitCode, err
}
@@ -233,7 +238,7 @@ func Exists(ctx context.Context, nameOrID string) (bool, error) {
if err != nil {
return false, err
}
- response, err := conn.DoRequest(nil, http.MethodGet, "containers/%s/exists", nil, nameOrID)
+ response, err := conn.DoRequest(nil, http.MethodGet, "/containers/%s/exists", nil, nameOrID)
if err != nil {
return false, err
}
diff --git a/pkg/bindings/test/containers_test.go b/pkg/bindings/test/containers_test.go
index 5a0bdebe6..299a78ac2 100644
--- a/pkg/bindings/test/containers_test.go
+++ b/pkg/bindings/test/containers_test.go
@@ -250,4 +250,61 @@ var _ = Describe("Podman containers ", func() {
Expect(isStopped(data.State.Status)).To(BeTrue())
})
+ It("podman wait no condition", func() {
+ var (
+ name = "top"
+ exitCode int32 = -1
+ )
+ _, err := containers.Wait(connText, "foobar", nil)
+ Expect(err).ToNot(BeNil())
+ code, _ := bindings.CheckResponseCode(err)
+ Expect(code).To(BeNumerically("==", http.StatusNotFound))
+
+ errChan := make(chan error)
+ bt.RunTopContainer(&name, nil, nil)
+ go func() {
+ exitCode, err = containers.Wait(connText, name, nil)
+ errChan <- err
+ close(errChan)
+ }()
+ err = containers.Stop(connText, 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 = "paused"
+ unpause = "running"
+ )
+ errChan := make(chan error)
+ bt.RunTopContainer(&name, nil, nil)
+ go func() {
+ exitCode, err = containers.Wait(connText, name, &pause)
+ errChan <- err
+ close(errChan)
+ }()
+ err := containers.Pause(connText, name)
+ Expect(err).To(BeNil())
+ wait := <-errChan
+ Expect(wait).To(BeNil())
+ Expect(exitCode).To(BeNumerically("==", -1))
+
+ errChan = make(chan error)
+ go func() {
+ exitCode, err = containers.Wait(connText, name, &unpause)
+ errChan <- err
+ close(errChan)
+ }()
+ err = containers.Unpause(connText, name)
+ Expect(err).To(BeNil())
+ unPausewait := <-errChan
+ Expect(unPausewait).To(BeNil())
+ Expect(exitCode).To(BeNumerically("==", -1))
+ })
+
})
diff --git a/pkg/bindings/test/pods_test.go b/pkg/bindings/test/pods_test.go
index 4bea2f8d7..afffee4e6 100644
--- a/pkg/bindings/test/pods_test.go
+++ b/pkg/bindings/test/pods_test.go
@@ -13,7 +13,7 @@ import (
"github.com/onsi/gomega/gexec"
)
-var _ = Describe("Podman images", func() {
+var _ = Describe("Podman pods", func() {
var (
bt *bindingTest
s *gexec.Session
@@ -120,6 +120,7 @@ var _ = Describe("Podman images", func() {
err = pods.Pause(connText, newpod)
Expect(err).To(BeNil())
response, err = pods.Inspect(connText, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStatePaused))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStatePaused))
@@ -129,6 +130,7 @@ var _ = Describe("Podman images", func() {
err = pods.Unpause(connText, 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))
@@ -159,6 +161,7 @@ var _ = Describe("Podman images", func() {
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))
@@ -172,6 +175,7 @@ var _ = Describe("Podman images", func() {
err = pods.Stop(connText, newpod, nil)
Expect(err).To(BeNil())
response, _ = pods.Inspect(connText, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
for _, i := range response.Containers {
Expect(define.StringToContainerStatus(i.State)).
To(Equal(define.ContainerStateStopped))
@@ -184,13 +188,66 @@ var _ = Describe("Podman images", func() {
err = pods.Restart(connText, newpod)
Expect(err).To(BeNil())
response, _ = 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))
}
})
- // Remove all stopped pods and their container to be implemented.
+ // Test to validate all the pods in the stopped/exited state are pruned sucessfully.
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(connText)
+ Expect(err).To(BeNil())
+ podSummary, err := pods.List(connText, 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(connText, newpod)
+ Expect(err).To(BeNil())
+ err = pods.Stop(connText, newpod, nil)
+ Expect(err).To(BeNil())
+ response, err := pods.Inspect(connText, newpod)
+ Expect(response.State.Status).To(Equal(define.PodStateExited))
+ err = pods.Prune(connText)
+ Expect(err).To(BeNil())
+ podSummary, err = pods.List(connText, nil)
+ Expect(err).To(BeNil())
+ Expect(len(podSummary)).To(Equal(1))
+
+ // Test prune all pods in exited state.
+ bt.Podcreate(&newpod)
+ err = pods.Start(connText, newpod)
+ Expect(err).To(BeNil())
+ err = pods.Start(connText, newpod2)
+ Expect(err).To(BeNil())
+ err = pods.Stop(connText, newpod, nil)
+ Expect(err).To(BeNil())
+ response, err = pods.Inspect(connText, newpod)
+ 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(connText, newpod2, nil)
+ Expect(err).To(BeNil())
+ response, err = pods.Inspect(connText, newpod2)
+ 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(connText)
+ Expect(err).To(BeNil())
+ podSummary, err = pods.List(connText, nil)
+ Expect(err).To(BeNil())
+ Expect(len(podSummary)).To(Equal(0))
})
})