From 17999c70c39e14a474e69ce10de05a66258e2a5b Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Tue, 1 Sep 2015 20:26:48 +0200 Subject: [PATCH] Use StrSlice from pkg/stringutils Signed-off-by: Antonio Murdaca --- runconfig/hostconfig.go | 129 +++++++++++------------------------ runconfig/hostconfig_test.go | 38 ----------- runconfig/parse.go | 4 +- 3 files changed, 40 insertions(+), 131 deletions(-) diff --git a/runconfig/hostconfig.go b/runconfig/hostconfig.go index 6000a94dc0..77ed0d7ed7 100644 --- a/runconfig/hostconfig.go +++ b/runconfig/hostconfig.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/docker/docker/pkg/nat" + "github.com/docker/docker/pkg/stringutils" "github.com/docker/docker/pkg/ulimit" ) @@ -209,101 +210,47 @@ func NewLxcConfig(values []KeyValuePair) *LxcConfig { return &LxcConfig{values} } -// CapList represents the list of capabilities of the container. -type CapList struct { - caps []string -} - -// MarshalJSON marshals (or serializes) the CapList into JSON. -func (c *CapList) MarshalJSON() ([]byte, error) { - if c == nil { - return []byte{}, nil - } - return json.Marshal(c.Slice()) -} - -// UnmarshalJSON unmarshals (or deserializes) the specified byte slices -// from JSON to a CapList. -func (c *CapList) UnmarshalJSON(b []byte) error { - if len(b) == 0 { - return nil - } - - var caps []string - if err := json.Unmarshal(b, &caps); err != nil { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - caps = append(caps, s) - } - c.caps = caps - - return nil -} - -// Len returns the number of specific kernel capabilities. -func (c *CapList) Len() int { - if c == nil { - return 0 - } - return len(c.caps) -} - -// Slice returns the specific capabilities into a slice of KeyValuePair. -func (c *CapList) Slice() []string { - if c == nil { - return nil - } - return c.caps -} - -// NewCapList creates a CapList from a slice of string. -func NewCapList(caps []string) *CapList { - return &CapList{caps} -} - // HostConfig the non-portable Config structure of a container. // Here, "non-portable" means "dependent of the host we are running on". // Portable information *should* appear in Config. type HostConfig struct { - Binds []string // List of volume bindings for this container - ContainerIDFile string // File (path) where the containerId is written - LxcConf *LxcConfig // Additional lxc configuration - Memory int64 // Memory limit (in bytes) - MemorySwap int64 // Total memory usage (memory + swap); set `-1` to disable swap - KernelMemory int64 // Kernel memory limit (in bytes) - CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) - CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period - CpusetCpus string // CpusetCpus 0-2, 0,1 - CpusetMems string // CpusetMems 0-2, 0,1 - CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota - BlkioWeight int64 // Block IO weight (relative weight vs. other containers) - OomKillDisable bool // Whether to disable OOM Killer or not - MemorySwappiness *int64 // Tuning container memory swappiness behaviour - Privileged bool // Is the container in privileged mode - PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host - Links []string // List of links (in the name:alias form) - PublishAllPorts bool // Should docker publish all exposed port for the container - DNS []string `json:"Dns"` // List of DNS server to lookup - DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for - ExtraHosts []string // List of extra hosts - VolumesFrom []string // List of volumes to take from other container - Devices []DeviceMapping // List of devices to map inside the container - NetworkMode NetworkMode // Network namespace to use for the container - IpcMode IpcMode // IPC namespace to use for the container - PidMode PidMode // PID namespace to use for the container - UTSMode UTSMode // UTS namespace to use for the container - CapAdd *CapList // List of kernel capabilities to add to the container - CapDrop *CapList // List of kernel capabilities to remove from the container - GroupAdd []string // List of additional groups that the container process will run as - RestartPolicy RestartPolicy // Restart policy to be used for the container - SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. - ReadonlyRootfs bool // Is the container root filesystem in read-only - Ulimits []*ulimit.Ulimit // List of ulimits to be set in the container - LogConfig LogConfig // Configuration of the logs for this container - CgroupParent string // Parent cgroup. - ConsoleSize [2]int // Initial console size on Windows + Binds []string // List of volume bindings for this container + ContainerIDFile string // File (path) where the containerId is written + LxcConf *LxcConfig // Additional lxc configuration + Memory int64 // Memory limit (in bytes) + MemorySwap int64 // Total memory usage (memory + swap); set `-1` to disable swap + KernelMemory int64 // Kernel memory limit (in bytes) + CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) + CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period + CpusetCpus string // CpusetCpus 0-2, 0,1 + CpusetMems string // CpusetMems 0-2, 0,1 + CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota + BlkioWeight int64 // Block IO weight (relative weight vs. other containers) + OomKillDisable bool // Whether to disable OOM Killer or not + MemorySwappiness *int64 // Tuning container memory swappiness behaviour + Privileged bool // Is the container in privileged mode + PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host + Links []string // List of links (in the name:alias form) + PublishAllPorts bool // Should docker publish all exposed port for the container + DNS []string `json:"Dns"` // List of DNS server to lookup + DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for + ExtraHosts []string // List of extra hosts + VolumesFrom []string // List of volumes to take from other container + Devices []DeviceMapping // List of devices to map inside the container + NetworkMode NetworkMode // Network namespace to use for the container + IpcMode IpcMode // IPC namespace to use for the container + PidMode PidMode // PID namespace to use for the container + UTSMode UTSMode // UTS namespace to use for the container + CapAdd *stringutils.StrSlice // List of kernel capabilities to add to the container + CapDrop *stringutils.StrSlice // List of kernel capabilities to remove from the container + GroupAdd []string // List of additional groups that the container process will run as + RestartPolicy RestartPolicy // Restart policy to be used for the container + SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. + ReadonlyRootfs bool // Is the container root filesystem in read-only + Ulimits []*ulimit.Ulimit // List of ulimits to be set in the container + LogConfig LogConfig // Configuration of the logs for this container + CgroupParent string // Parent cgroup. + ConsoleSize [2]int // Initial console size on Windows } // DecodeHostConfig creates a HostConfig based on the specified Reader. diff --git a/runconfig/hostconfig_test.go b/runconfig/hostconfig_test.go index 2c5b06505a..cf3452ac8a 100644 --- a/runconfig/hostconfig_test.go +++ b/runconfig/hostconfig_test.go @@ -4,7 +4,6 @@ package runconfig import ( "bytes" - "encoding/json" "fmt" "io/ioutil" "testing" @@ -267,40 +266,3 @@ func TestDecodeHostConfig(t *testing.T) { } } } - -func TestCapListUnmarshalSliceAndString(t *testing.T) { - var cl *CapList - cap0, err := json.Marshal([]string{"CAP_SOMETHING"}) - if err != nil { - t.Fatal(err) - } - if err := json.Unmarshal(cap0, &cl); err != nil { - t.Fatal(err) - } - - slice := cl.Slice() - if len(slice) != 1 { - t.Fatalf("expected 1 element after unmarshal: %q", slice) - } - - if slice[0] != "CAP_SOMETHING" { - t.Fatalf("expected `CAP_SOMETHING`, got: %q", slice[0]) - } - - cap1, err := json.Marshal("CAP_SOMETHING") - if err != nil { - t.Fatal(err) - } - if err := json.Unmarshal(cap1, &cl); err != nil { - t.Fatal(err) - } - - slice = cl.Slice() - if len(slice) != 1 { - t.Fatalf("expected 1 element after unmarshal: %q", slice) - } - - if slice[0] != "CAP_SOMETHING" { - t.Fatalf("expected `CAP_SOMETHING`, got: %q", slice[0]) - } -} diff --git a/runconfig/parse.go b/runconfig/parse.go index 392c8cf2dc..90a0fecdef 100644 --- a/runconfig/parse.go +++ b/runconfig/parse.go @@ -353,8 +353,8 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe PidMode: pidMode, UTSMode: utsMode, Devices: deviceMappings, - CapAdd: NewCapList(flCapAdd.GetAll()), - CapDrop: NewCapList(flCapDrop.GetAll()), + CapAdd: stringutils.NewStrSlice(flCapAdd.GetAll()...), + CapDrop: stringutils.NewStrSlice(flCapDrop.GetAll()...), GroupAdd: flGroupAdd.GetAll(), RestartPolicy: restartPolicy, SecurityOpt: flSecurityOpt.GetAll(),