diff --git a/api/server/server_unit_test.go b/api/server/server_unit_test.go index 3fc1cea064..3dbba640ff 100644 --- a/api/server/server_unit_test.go +++ b/api/server/server_unit_test.go @@ -70,7 +70,7 @@ func TestGetVersion(t *testing.T) { eng.Register("version", func(job *engine.Job) engine.Status { called = true v := &engine.Env{} - v.Set("Version", "42.1") + v.SetJson("Version", "42.1") v.Set("ApiVersion", "1.1.1.1.1") v.Set("GoVersion", "2.42") v.Set("Os", "Linux") diff --git a/engine/env.go b/engine/env.go index 1da3ae52e0..c43a5ec971 100644 --- a/engine/env.go +++ b/engine/env.go @@ -194,7 +194,25 @@ func (env *Env) SetAuto(k string, v interface{}) { } func (env *Env) Encode(dst io.Writer) error { - return json.NewEncoder(dst).Encode(env.Map()) + m := make(map[string]interface{}) + for k, v := range env.Map() { + var val interface{} + if err := json.Unmarshal([]byte(v), &val); err == nil { + // FIXME: we fix-convert float values to int, because + // encoding/json decodes integers to float64, but cannot encode them back. + // (See http://golang.org/src/pkg/encoding/json/decode.go#L46) + if fval, isFloat := val.(float64); isFloat { + val = int(fval) + } + m[k] = val + } else { + m[k] = v + } + } + if err := json.NewEncoder(dst).Encode(&m); err != nil { + return err + } + return nil } func (env *Env) WriteTo(dst io.Writer) (n int64, err error) { diff --git a/engine/env_test.go b/engine/env_test.go index da7d919f03..c7079ff942 100644 --- a/engine/env_test.go +++ b/engine/env_test.go @@ -95,21 +95,3 @@ func TestEnviron(t *testing.T) { t.Fatalf("bar not found in the environ") } } - -func TestEnvWriteTo(t *testing.T) { - e := &Env{} - inputKey := "Version" - inputVal := "42.1" - e.Set(inputKey, inputVal) - out := NewOutput() - e2, err := out.AddEnv() - if err != nil { - t.Fatal(err) - } - e.WriteTo(out) - result := e2.Get(inputKey) - expected := inputVal - if expected != result { - t.Fatalf("%#v\n", result) - } -} diff --git a/server/server.go b/server/server.go index 55ac10fd0d..9cabf17889 100644 --- a/server/server.go +++ b/server/server.go @@ -846,7 +846,7 @@ func (srv *Server) DockerInfo(job *engine.Job) engine.Status { func (srv *Server) DockerVersion(job *engine.Job) engine.Status { v := &engine.Env{} v.Set("Version", dockerversion.VERSION) - v.Set("ApiVersion", string(api.APIVERSION)) + v.SetJson("ApiVersion", api.APIVERSION) v.Set("GitCommit", dockerversion.GITCOMMIT) v.Set("GoVersion", goruntime.Version()) v.Set("Os", goruntime.GOOS)