Skip to content

Commit

Permalink
Copy docker client structs, adding yaml/json tags.
Browse files Browse the repository at this point in the history
Use these in our v1beta1 package so that we can pass fuzz test encode/decode.
  • Loading branch information
lavalamp committed Aug 1, 2014
1 parent 30b6ab5 commit 828aed4
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 17 deletions.
40 changes: 27 additions & 13 deletions pkg/api/helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"testing"

"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/fsouza/go-dockerclient"
)

var fuzzIters = flag.Int("fuzz_iters", 3, "How many fuzzing iterations to do.")
Expand Down Expand Up @@ -55,23 +56,28 @@ var apiObjectFuzzer = util.NewFuzzer(
intstr.StrVal = util.RandString()
}
},
func(p *PodInfo) {
// The docker container type doesn't survive fuzzing.
// TODO: fix this.
*p = nil
func(u64 *uint64) {
// TODO: uint64's are NOT handled right.
*u64 = util.RandUint64() >> 8
},
func(pb map[docker.Port][]docker.PortBinding) {
// This is necessary because keys with nil values get omitted.
// TODO: Is this a bug?
pb[docker.Port(util.RandString())] = []docker.PortBinding{
{util.RandString(), util.RandString()},
{util.RandString(), util.RandString()},
}
},
func(pm map[string]docker.PortMapping) {
// This is necessary because keys with nil values get omitted.
// TODO: Is this a bug?
pm[util.RandString()] = docker.PortMapping{
util.RandString(): util.RandString(),
}
},
)

func objDiff(a, b interface{}) string {

// An alternate diff attempt, in case json isn't showing you
// the difference. (reflect.DeepEqual makes a distinction between
// nil and empty slices, for example.)
return util.StringDiff(
fmt.Sprintf("%#v", a),
fmt.Sprintf("%#v", b),
)

ab, err := json.Marshal(a)
if err != nil {
panic("a")
Expand All @@ -81,6 +87,14 @@ func objDiff(a, b interface{}) string {
panic("b")
}
return util.StringDiff(string(ab), string(bb))

// An alternate diff attempt, in case json isn't showing you
// the difference. (reflect.DeepEqual makes a distinction between
// nil and empty slices, for example.)
return util.StringDiff(
fmt.Sprintf("%#v", a),
fmt.Sprintf("%#v", b),
)
}

func runTest(t *testing.T, source interface{}) {
Expand Down
5 changes: 3 additions & 2 deletions pkg/api/v1beta1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package v1beta1
import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
"github.com/fsouza/go-dockerclient"
"github.com/fsouza/go-dockerclient-copiedstructs"
)

// Common string formats
Expand Down Expand Up @@ -237,7 +237,8 @@ type PodState struct {
// The key of this map is the *name* of the container within the manifest; it has one
// entry per container in the manifest. The value of this map is currently the output
// of `docker inspect`. This output format is *not* final and should not be relied
// upon.
// upon. To allow marshalling/unmarshalling, we copied the client's structs and added
// json/yaml tags.
// TODO: Make real decisions about what our info should look like.
Info PodInfo `json:"info,omitempty" yaml:"info,omitempty"`
RestartPolicy RestartPolicy `json:"restartpolicy,omitempty" yaml:"restartpolicy,omitempty"`
Expand Down
4 changes: 2 additions & 2 deletions pkg/util/fuzz.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ func (f *Fuzzer) doFuzz(v reflect.Value) {
case reflect.Map:
if rand.Intn(5) > 0 {
v.Set(reflect.MakeMap(v.Type()))
n := 1 + rand.Intn(10)
n := 1 + rand.Intn(2)
for i := 0; i < n; i++ {
key := reflect.New(v.Type().Key()).Elem()
f.doFuzz(key)
Expand All @@ -129,7 +129,7 @@ func (f *Fuzzer) doFuzz(v reflect.Value) {
v.Set(reflect.Zero(v.Type()))
case reflect.Slice:
if rand.Intn(5) > 0 {
n := 1 + rand.Intn(10)
n := 1 + rand.Intn(2)
v.Set(reflect.MakeSlice(v.Type(), n, n))
for i := 0; i < n; i++ {
f.doFuzz(v.Index(i))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright 2014 go-dockerclient authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package docker

import (
"time"
)

type Container struct {
ID string `yaml:"ID,omitempty" json:"ID,omitempty"`
Created time.Time `yaml:"Created,omitempty" json:"Created,omitempty"`
Path string `yaml:"Path,omitempty" json:"Path,omitempty"`
Args []string `yaml:"Args,omitempty" json:"Args,omitempty"`
Config *Config `yaml:"Config,omitempty" json:"Config,omitempty"`
State State `yaml:"State,omitempty" json:"State,omitempty"`
Image string `yaml:"Image,omitempty" json:"Image,omitempty"`

NetworkSettings *NetworkSettings `yaml:"NetworkSettings,omitempty" json:"NetworkSettings,omitempty"`

SysInitPath string `yaml:"SysInitPath,omitempty" json:"SysInitPath,omitempty"`
ResolvConfPath string `yaml:"ResolvConfPath,omitempty" json:"ResolvConfPath,omitempty"`
HostnamePath string `yaml:"HostnamePath,omitempty" json:"HostnamePath,omitempty"`
HostsPath string `yaml:"HostsPath,omitempty" json:"HostsPath,omitempty"`
Name string `yaml:"Name,omitempty" json:"Name,omitempty"`
Driver string `yaml:"Driver,omitempty" json:"Driver,omitempty"`

Volumes map[string]string `yaml:"Volumes,omitempty" json:"Volumes,omitempty"`
VolumesRW map[string]bool `yaml:"VolumesRW,omitempty" json:"VolumesRW,omitempty"`
HostConfig *HostConfig `yaml:"HostConfig,omitempty" json:"HostConfig,omitempty"`
}

type Config struct {
Hostname string `yaml:"Hostname,omitempty" json:"Hostname,omitempty"`
Domainname string `yaml:"Domainname,omitempty" json:"Domainname,omitempty"`
User string `yaml:"User,omitempty" json:"User,omitempty"`
Memory int64 `yaml:"Memory,omitempty" json:"Memory,omitempty"`
MemorySwap int64 `yaml:"MemorySwap,omitempty" json:"MemorySwap,omitempty"`
CpuShares int64 `yaml:"CpuShares,omitempty" json:"CpuShares,omitempty"`
AttachStdin bool `yaml:"AttachStdin,omitempty" json:"AttachStdin,omitempty"`
AttachStdout bool `yaml:"AttachStdout,omitempty" json:"AttachStdout,omitempty"`
AttachStderr bool `yaml:"AttachStderr,omitempty" json:"AttachStderr,omitempty"`
PortSpecs []string `yaml:"PortSpecs,omitempty" json:"PortSpecs,omitempty"`
ExposedPorts map[Port]struct{} `yaml:"ExposedPorts,omitempty" json:"ExposedPorts,omitempty"`
Tty bool `yaml:"Tty,omitempty" json:"Tty,omitempty"`
OpenStdin bool `yaml:"OpenStdin,omitempty" json:"OpenStdin,omitempty"`
StdinOnce bool `yaml:"StdinOnce,omitempty" json:"StdinOnce,omitempty"`
Env []string `yaml:"Env,omitempty" json:"Env,omitempty"`
Cmd []string `yaml:"Cmd,omitempty" json:"Cmd,omitempty"`
Dns []string `yaml:"Dns,omitempty" json:"Dns,omitempty"`
Image string `yaml:"Image,omitempty" json:"Image,omitempty"`
Volumes map[string]struct{} `yaml:"Volumes,omitempty" json:"Volumes,omitempty"`
VolumesFrom string `yaml:"VolumesFrom,omitempty" json:"VolumesFrom,omitempty"`
WorkingDir string `yaml:"WorkingDir,omitempty" json:"WorkingDir,omitempty"`
Entrypoint []string `yaml:"Entrypoint,omitempty" json:"Entrypoint,omitempty"`
NetworkDisabled bool `yaml:"NetworkDisabled,omitempty" json:"NetworkDisabled,omitempty"`
}

type State struct {
Running bool `yaml:"Running,omitempty" json:"Running,omitempty"`
Paused bool `yaml:"Paused,omitempty" json:"Paused,omitempty"`
Pid int `yaml:"Pid,omitempty" json:"Pid,omitempty"`
ExitCode int `yaml:"ExitCode,omitempty" json:"ExitCode,omitempty"`
StartedAt time.Time `yaml:"StartedAt,omitempty" json:"StartedAt,omitempty"`
FinishedAt time.Time `yaml:"FinishedAt,omitempty" json:"FinishedAt,omitempty"`
}

type PortBinding struct {
HostIp string `yaml:"HostIp,omitempty" json:"HostIp,omitempty"`
HostPort string `yaml:"HostPort,omitempty" json:"HostPort,omitempty"`
}

type PortMapping map[string]string

type NetworkSettings struct {
IPAddress string `yaml:"IPAddress,omitempty" json:"IPAddress,omitempty"`
IPPrefixLen int `yaml:"IPPrefixLen,omitempty" json:"IPPrefixLen,omitempty"`
Gateway string `yaml:"Gateway,omitempty" json:"Gateway,omitempty"`
Bridge string `yaml:"Bridge,omitempty" json:"Bridge,omitempty"`
PortMapping map[string]PortMapping `yaml:"PortMapping,omitempty" json:"PortMapping,omitempty"`
Ports map[Port][]PortBinding `yaml:"Ports,omitempty" json:"Ports,omitempty"`
}

type KeyValuePair struct {
Key string `yaml:"Key,omitempty" json:"Key,omitempty"`
Value string `yaml:"Value,omitempty" json:"Value,omitempty"`
}

type Port string

type HostConfig struct {
Binds []string `yaml:"Binds,omitempty" json:"Binds,omitempty"`
ContainerIDFile string `yaml:"ContainerIDFile,omitempty" json:"ContainerIDFile,omitempty"`
LxcConf []KeyValuePair `yaml:"LxcConf,omitempty" json:"LxcConf,omitempty"`
Privileged bool `yaml:"Privileged,omitempty" json:"Privileged,omitempty"`
PortBindings map[Port][]PortBinding `yaml:"PortBindings,omitempty" json:"PortBindings,omitempty"`
Links []string `yaml:"Links,omitempty" json:"Links,omitempty"`
PublishAllPorts bool `yaml:"PublishAllPorts,omitempty" json:"PublishAllPorts,omitempty"`
Dns []string `yaml:"Dns,omitempty" json:"Dns,omitempty"`
DnsSearch []string `yaml:"DnsSearch,omitempty" json:"DnsSearch,omitempty"`
VolumesFrom []string `yaml:"VolumesFrom,omitempty" json:"VolumesFrom,omitempty"`
NetworkMode string `yaml:"NetworkMode,omitempty" json:"NetworkMode,omitempty"`
}

0 comments on commit 828aed4

Please sign in to comment.