summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/api/handlers/decoder.go15
-rw-r--r--pkg/bindings/util/util.go11
-rw-r--r--test/apiv2/20-containers.at2
3 files changed, 27 insertions, 1 deletions
diff --git a/pkg/api/handlers/decoder.go b/pkg/api/handlers/decoder.go
index 54087168a..123d325aa 100644
--- a/pkg/api/handlers/decoder.go
+++ b/pkg/api/handlers/decoder.go
@@ -6,6 +6,7 @@ import (
"syscall"
"time"
+ "github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/util"
"github.com/gorilla/schema"
"github.com/sirupsen/logrus"
@@ -19,6 +20,7 @@ func NewAPIDecoder() *schema.Decoder {
d.IgnoreUnknownKeys(true)
d.RegisterConverter(map[string][]string{}, convertURLValuesString)
d.RegisterConverter(time.Time{}, convertTimeString)
+ d.RegisterConverter(define.ContainerStatus(0), convertContainerStatusString)
var Signal syscall.Signal
d.RegisterConverter(Signal, convertSignal)
@@ -46,6 +48,19 @@ func convertURLValuesString(query string) reflect.Value {
return reflect.ValueOf(f)
}
+func convertContainerStatusString(query string) reflect.Value {
+ result, err := define.StringToContainerStatus(query)
+ if err != nil {
+ logrus.Infof("convertContainerStatusString: Failed to parse %s: %s", query, err.Error())
+
+ // We return nil here instead of result because reflect.ValueOf().IsValid() will be true
+ // in github.com/gorilla/schema's decoder, which means there's no parsing error
+ return reflect.ValueOf(nil)
+ }
+
+ return reflect.ValueOf(result)
+}
+
// isZero() can be used to determine if parsing failed.
func convertTimeString(query string) reflect.Value {
var (
diff --git a/pkg/bindings/util/util.go b/pkg/bindings/util/util.go
index 6296fc22f..c1961308e 100644
--- a/pkg/bindings/util/util.go
+++ b/pkg/bindings/util/util.go
@@ -2,6 +2,7 @@ package util
import (
"errors"
+ "fmt"
"net/url"
"reflect"
"strconv"
@@ -11,14 +12,23 @@ import (
)
func IsSimpleType(f reflect.Value) bool {
+ if _, ok := f.Interface().(fmt.Stringer); ok {
+ return true
+ }
+
switch f.Kind() {
case reflect.Bool, reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64, reflect.String:
return true
}
+
return false
}
func SimpleTypeToParam(f reflect.Value) string {
+ if s, ok := f.Interface().(fmt.Stringer); ok {
+ return s.String()
+ }
+
switch f.Kind() {
case reflect.Bool:
return strconv.FormatBool(f.Bool())
@@ -31,6 +41,7 @@ func SimpleTypeToParam(f reflect.Value) string {
case reflect.String:
return f.String()
}
+
panic("the input parameter is not a simple type")
}
diff --git a/test/apiv2/20-containers.at b/test/apiv2/20-containers.at
index 0da196e46..a99e9a184 100644
--- a/test/apiv2/20-containers.at
+++ b/test/apiv2/20-containers.at
@@ -63,7 +63,7 @@ cid=$(jq -r '.Id' <<<"$output")
# Prior to the fix in #6835, this would fail 500 "args must not be empty"
t POST libpod/containers/${cid}/start '' 204
# Container should exit almost immediately. Wait for it, confirm successful run
-t POST libpod/containers/${cid}/wait '' 200 '0'
+t POST "libpod/containers/${cid}/wait?condition=stopped&condition=exited" '' 200 '0'
t GET libpod/containers/${cid}/json 200 \
.Id=$cid \
.State.Status~\\\(exited\\\|stopped\\\) \