Skip to content

Commit 148f271

Browse files
committed
add NamedUlimitOpt implement NamedOption to fix 32528
Signed-off-by: allencloud <[email protected]>
1 parent b931c35 commit 148f271

File tree

4 files changed

+130
-77
lines changed

4 files changed

+130
-77
lines changed

cmd/dockerd/config_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func installConfigFlags(conf *config.Config, flags *pflag.FlagSet) {
2424

2525
// Then platform-specific install flags
2626
flags.BoolVar(&conf.EnableSelinuxSupport, "selinux-enabled", false, "Enable selinux support")
27-
flags.Var(opts.NewUlimitOpt(&conf.Ulimits), "default-ulimit", "Default ulimits for containers")
27+
flags.Var(opts.NewNamedUlimitOpt("default-ulimits", &conf.Ulimits), "default-ulimit", "Default ulimits for containers")
2828
flags.BoolVar(&conf.BridgeConfig.EnableIPTables, "iptables", true, "Enable addition of iptables rules")
2929
flags.BoolVar(&conf.BridgeConfig.EnableIPForward, "ip-forward", true, "Enable net.ipv4.ip_forward")
3030
flags.BoolVar(&conf.BridgeConfig.EnableIPMasq, "ip-masq", true, "Enable IP masquerading")

daemon/config/config_unix_test.go

Lines changed: 85 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,59 @@
33
package config
44

55
import (
6-
"io/ioutil"
7-
"runtime"
8-
96
"testing"
7+
8+
"github.com/docker/docker/opts"
9+
"github.com/docker/docker/pkg/testutil/tempfile"
10+
"github.com/docker/go-units"
11+
"github.com/spf13/pflag"
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
1014
)
1115

12-
func TestDaemonConfigurationMerge(t *testing.T) {
13-
f, err := ioutil.TempFile("", "docker-config-")
14-
if err != nil {
15-
t.Fatal(err)
16+
func TestGetConflictFreeConfiguration(t *testing.T) {
17+
configFileData := string([]byte(`
18+
{
19+
"debug": true,
20+
"default-ulimits": {
21+
"nofile": {
22+
"Name": "nofile",
23+
"Hard": 2048,
24+
"Soft": 1024
25+
}
26+
},
27+
"log-opts": {
28+
"tag": "test_tag"
29+
}
30+
}`))
31+
32+
file := tempfile.NewTempFile(t, "docker-config", configFileData)
33+
defer file.Remove()
34+
35+
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
36+
var debug bool
37+
flags.BoolVarP(&debug, "debug", "D", false, "")
38+
flags.Var(opts.NewNamedUlimitOpt("default-ulimits", nil), "default-ulimit", "")
39+
flags.Var(opts.NewNamedMapOpts("log-opts", nil, nil), "log-opt", "")
40+
41+
cc, err := getConflictFreeConfiguration(file.Name(), flags)
42+
require.NoError(t, err)
43+
44+
assert.True(t, cc.Debug)
45+
46+
expectedUlimits := map[string]*units.Ulimit{
47+
"nofile": {
48+
Name: "nofile",
49+
Hard: 2048,
50+
Soft: 1024,
51+
},
1652
}
1753

18-
configFile := f.Name()
54+
assert.Equal(t, expectedUlimits, cc.Ulimits)
55+
}
1956

20-
f.Write([]byte(`
57+
func TestDaemonConfigurationMerge(t *testing.T) {
58+
configFileData := string([]byte(`
2159
{
2260
"debug": true,
2361
"default-ulimits": {
@@ -32,7 +70,8 @@ func TestDaemonConfigurationMerge(t *testing.T) {
3270
}
3371
}`))
3472

35-
f.Close()
73+
file := tempfile.NewTempFile(t, "docker-config", configFileData)
74+
defer file.Remove()
3675

3776
c := &Config{
3877
CommonConfig: CommonConfig{
@@ -44,66 +83,55 @@ func TestDaemonConfigurationMerge(t *testing.T) {
4483
},
4584
}
4685

47-
cc, err := MergeDaemonConfigurations(c, nil, configFile)
48-
if err != nil {
49-
t.Fatal(err)
50-
}
51-
if !cc.Debug {
52-
t.Fatalf("expected %v, got %v\n", true, cc.Debug)
53-
}
54-
if !cc.AutoRestart {
55-
t.Fatalf("expected %v, got %v\n", true, cc.AutoRestart)
56-
}
57-
if cc.LogConfig.Type != "syslog" {
58-
t.Fatalf("expected syslog config, got %q\n", cc.LogConfig)
59-
}
86+
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
6087

61-
if configValue, OK := cc.LogConfig.Config["tag"]; !OK {
62-
t.Fatal("expected syslog config attributes, got nil\n")
63-
} else {
64-
if configValue != "test_tag" {
65-
t.Fatalf("expected syslog config attributes 'tag=test_tag', got 'tag=%s'\n", configValue)
66-
}
67-
}
88+
var debug bool
89+
flags.BoolVarP(&debug, "debug", "D", false, "")
90+
flags.Var(opts.NewNamedUlimitOpt("default-ulimits", nil), "default-ulimit", "")
91+
flags.Var(opts.NewNamedMapOpts("log-opts", nil, nil), "log-opt", "")
6892

69-
if cc.Ulimits == nil {
70-
t.Fatal("expected default ulimit config, got nil\n")
71-
} else {
72-
if _, OK := cc.Ulimits["nofile"]; OK {
73-
if cc.Ulimits["nofile"].Name != "nofile" ||
74-
cc.Ulimits["nofile"].Hard != 2048 ||
75-
cc.Ulimits["nofile"].Soft != 1024 {
76-
t.Fatalf("expected default ulimit name, hard and soft are nofile, 2048, 1024, got %s, %d, %d\n", cc.Ulimits["nofile"].Name, cc.Ulimits["nofile"].Hard, cc.Ulimits["nofile"].Soft)
77-
}
78-
} else {
79-
t.Fatal("expected default ulimit name nofile, got nil\n")
80-
}
81-
}
82-
}
93+
cc, err := MergeDaemonConfigurations(c, flags, file.Name())
94+
require.NoError(t, err)
8395

84-
func TestDaemonConfigurationMergeShmSize(t *testing.T) {
85-
if runtime.GOOS == "solaris" {
86-
t.Skip("ShmSize not supported on Solaris\n")
96+
assert.True(t, cc.Debug)
97+
assert.True(t, cc.AutoRestart)
98+
99+
expectedLogConfig := LogConfig{
100+
Type: "syslog",
101+
Config: map[string]string{"tag": "test_tag"},
87102
}
88-
f, err := ioutil.TempFile("", "docker-config-")
89-
if err != nil {
90-
t.Fatal(err)
103+
104+
assert.Equal(t, expectedLogConfig, cc.LogConfig)
105+
106+
expectedUlimits := map[string]*units.Ulimit{
107+
"nofile": {
108+
Name: "nofile",
109+
Hard: 2048,
110+
Soft: 1024,
111+
},
91112
}
92113

93-
configFile := f.Name()
114+
assert.Equal(t, expectedUlimits, cc.Ulimits)
115+
}
94116

95-
f.Write([]byte(`
117+
func TestDaemonConfigurationMergeShmSize(t *testing.T) {
118+
data := string([]byte(`
96119
{
97120
"default-shm-size": "1g"
98121
}`))
99122

100-
f.Close()
123+
file := tempfile.NewTempFile(t, "docker-config", data)
124+
defer file.Remove()
101125

102126
c := &Config{}
103-
cc, err := MergeDaemonConfigurations(c, nil, configFile)
104-
if err != nil {
105-
t.Fatal(err)
106-
}
127+
128+
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
129+
shmSize := opts.MemBytes(DefaultShmSize)
130+
flags.Var(&shmSize, "default-shm-size", "")
131+
132+
cc, err := MergeDaemonConfigurations(c, flags, file.Name())
133+
require.NoError(t, err)
134+
107135
expectedValue := 1 * 1024 * 1024 * 1024
108136
if cc.ShmSize.Value() != int64(expectedValue) {
109137
t.Fatalf("expected default shm size %d, got %d", expectedValue, cc.ShmSize.Value())

daemon/config/config_windows_test.go

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ package config
55
import (
66
"io/ioutil"
77
"testing"
8+
9+
"github.com/docker/docker/opts"
10+
"github.com/spf13/pflag"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
813
)
914

1015
func TestDaemonConfigurationMerge(t *testing.T) {
@@ -35,25 +40,21 @@ func TestDaemonConfigurationMerge(t *testing.T) {
3540
},
3641
}
3742

38-
cc, err := MergeDaemonConfigurations(c, nil, configFile)
39-
if err != nil {
40-
t.Fatal(err)
41-
}
42-
if !cc.Debug {
43-
t.Fatalf("expected %v, got %v\n", true, cc.Debug)
44-
}
45-
if !cc.AutoRestart {
46-
t.Fatalf("expected %v, got %v\n", true, cc.AutoRestart)
47-
}
48-
if cc.LogConfig.Type != "syslog" {
49-
t.Fatalf("expected syslog config, got %q\n", cc.LogConfig)
50-
}
43+
flags := pflag.NewFlagSet("test", pflag.ContinueOnError)
44+
var debug bool
45+
flags.BoolVarP(&debug, "debug", "D", false, "")
46+
flags.Var(opts.NewNamedMapOpts("log-opts", nil, nil), "log-opt", "")
47+
48+
cc, err := MergeDaemonConfigurations(c, flags, configFile)
49+
require.NoError(t, err)
5150

52-
if configValue, OK := cc.LogConfig.Config["tag"]; !OK {
53-
t.Fatal("expected syslog config attributes, got nil\n")
54-
} else {
55-
if configValue != "test_tag" {
56-
t.Fatalf("expected syslog config attributes 'tag=test_tag', got 'tag=%s'\n", configValue)
57-
}
51+
assert.True(t, cc.Debug)
52+
assert.True(t, cc.AutoRestart)
53+
54+
expectedLogConfig := LogConfig{
55+
Type: "syslog",
56+
Config: map[string]string{"tag": "test_tag"},
5857
}
58+
59+
assert.Equal(t, expectedLogConfig, cc.LogConfig)
5960
}

opts/ulimit.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,27 @@ func (o *UlimitOpt) GetList() []*units.Ulimit {
5555
func (o *UlimitOpt) Type() string {
5656
return "ulimit"
5757
}
58+
59+
// NamedUlimitOpt defines a named map of Ulimits
60+
type NamedUlimitOpt struct {
61+
name string
62+
UlimitOpt
63+
}
64+
65+
var _ NamedOption = &NamedUlimitOpt{}
66+
67+
// NewNamedUlimitOpt creates a new NamedUlimitOpt
68+
func NewNamedUlimitOpt(name string, ref *map[string]*units.Ulimit) *NamedUlimitOpt {
69+
if ref == nil {
70+
ref = &map[string]*units.Ulimit{}
71+
}
72+
return &NamedUlimitOpt{
73+
name: name,
74+
UlimitOpt: *NewUlimitOpt(ref),
75+
}
76+
}
77+
78+
// Name returns the option name
79+
func (o *NamedUlimitOpt) Name() string {
80+
return o.name
81+
}

0 commit comments

Comments
 (0)