diff --git a/opts/config.go b/opts/config.go index 82fd2bce4e..b110439056 100644 --- a/opts/config.go +++ b/opts/config.go @@ -32,7 +32,7 @@ func (o *ConfigOpt) Set(value string) error { } // support a simple syntax of --config foo - if len(fields) == 1 { + if len(fields) == 1 && !strings.Contains(fields[0], "=") { options.File.Name = fields[0] options.ConfigName = fields[0] o.values = append(o.values, options) @@ -72,6 +72,9 @@ func (o *ConfigOpt) Set(value string) error { if options.ConfigName == "" { return fmt.Errorf("source is required") } + if options.File.Name == "" { + options.File.Name = options.ConfigName + } o.values = append(o.values, options) return nil diff --git a/opts/config_test.go b/opts/config_test.go new file mode 100644 index 0000000000..e0dc7feade --- /dev/null +++ b/opts/config_test.go @@ -0,0 +1,87 @@ +package opts + +import ( + "os" + "testing" + + "gotest.tools/assert" + is "gotest.tools/assert/cmp" +) + +func TestConfigOptions(t *testing.T) { + testCases := []struct { + name string + input string + configName string + fileName string + uid string + gid string + fileMode uint + }{ + { + name: "Simple", + input: "app-config", + configName: "app-config", + fileName: "app-config", + uid: "0", + gid: "0", + }, + { + name: "Source", + input: "source=foo", + configName: "foo", + fileName: "foo", + }, + { + name: "SourceTarget", + input: "source=foo,target=testing", + configName: "foo", + fileName: "testing", + }, + { + name: "Shorthand", + input: "src=foo,target=testing", + configName: "foo", + fileName: "testing", + }, + { + name: "CustomUidGid", + input: "source=foo,target=testing,uid=1000,gid=1001", + configName: "foo", + fileName: "testing", + uid: "1000", + gid: "1001", + }, + { + name: "CustomMode", + input: "source=foo,target=testing,uid=1000,gid=1001,mode=0444", + configName: "foo", + fileName: "testing", + uid: "1000", + gid: "1001", + fileMode: 0444, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + var opt ConfigOpt + assert.NilError(t, opt.Set(tc.input)) + reqs := opt.Value() + assert.Assert(t, is.Len(reqs, 1)) + req := reqs[0] + assert.Check(t, is.Equal(tc.configName, req.ConfigName)) + assert.Check(t, is.Equal(tc.fileName, req.File.Name)) + if tc.uid != "" { + assert.Check(t, is.Equal(tc.uid, req.File.UID)) + } + if tc.gid != "" { + assert.Check(t, is.Equal(tc.gid, req.File.GID)) + } + if tc.fileMode != 0 { + assert.Check(t, is.Equal(os.FileMode(tc.fileMode), req.File.Mode)) + } + }) + } +} diff --git a/opts/secret.go b/opts/secret.go index a1fde54d91..c527ad3be6 100644 --- a/opts/secret.go +++ b/opts/secret.go @@ -32,7 +32,7 @@ func (o *SecretOpt) Set(value string) error { } // support a simple syntax of --secret foo - if len(fields) == 1 { + if len(fields) == 1 && !strings.Contains(fields[0], "=") { options.File.Name = fields[0] options.SecretName = fields[0] o.values = append(o.values, options) @@ -72,6 +72,9 @@ func (o *SecretOpt) Set(value string) error { if options.SecretName == "" { return fmt.Errorf("source is required") } + if options.File.Name == "" { + options.File.Name = options.SecretName + } o.values = append(o.values, options) return nil diff --git a/opts/secret_test.go b/opts/secret_test.go index 94dd80d19a..aeab48b8c4 100644 --- a/opts/secret_test.go +++ b/opts/secret_test.go @@ -8,73 +8,80 @@ import ( is "gotest.tools/assert/cmp" ) -func TestSecretOptionsSimple(t *testing.T) { - var opt SecretOpt +func TestSecretOptions(t *testing.T) { + testCases := []struct { + name string + input string + secretName string + fileName string + uid string + gid string + fileMode uint + }{ + { + name: "Simple", + input: "app-secret", + secretName: "app-secret", + fileName: "app-secret", + uid: "0", + gid: "0", + }, + { + name: "Source", + input: "source=foo", + secretName: "foo", + fileName: "foo", + }, + { + name: "SourceTarget", + input: "source=foo,target=testing", + secretName: "foo", + fileName: "testing", + }, + { + name: "Shorthand", + input: "src=foo,target=testing", + secretName: "foo", + fileName: "testing", + }, + { + name: "CustomUidGid", + input: "source=foo,target=testing,uid=1000,gid=1001", + secretName: "foo", + fileName: "testing", + uid: "1000", + gid: "1001", + }, + { + name: "CustomMode", + input: "source=foo,target=testing,uid=1000,gid=1001,mode=0444", + secretName: "foo", + fileName: "testing", + uid: "1000", + gid: "1001", + fileMode: 0444, + }, + } - testCase := "app-secret" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Assert(t, is.Len(reqs, 1)) - req := reqs[0] - assert.Check(t, is.Equal("app-secret", req.SecretName)) - assert.Check(t, is.Equal("app-secret", req.File.Name)) - assert.Check(t, is.Equal("0", req.File.UID)) - assert.Check(t, is.Equal("0", req.File.GID)) -} - -func TestSecretOptionsSourceTarget(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Assert(t, is.Len(reqs, 1)) - req := reqs[0] - assert.Check(t, is.Equal("foo", req.SecretName)) - assert.Check(t, is.Equal("testing", req.File.Name)) -} - -func TestSecretOptionsShorthand(t *testing.T) { - var opt SecretOpt - - testCase := "src=foo,target=testing" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Assert(t, is.Len(reqs, 1)) - req := reqs[0] - assert.Check(t, is.Equal("foo", req.SecretName)) -} - -func TestSecretOptionsCustomUidGid(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing,uid=1000,gid=1001" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Assert(t, is.Len(reqs, 1)) - req := reqs[0] - assert.Check(t, is.Equal("foo", req.SecretName)) - assert.Check(t, is.Equal("testing", req.File.Name)) - assert.Check(t, is.Equal("1000", req.File.UID)) - assert.Check(t, is.Equal("1001", req.File.GID)) -} - -func TestSecretOptionsCustomMode(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing,uid=1000,gid=1001,mode=0444" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Assert(t, is.Len(reqs, 1)) - req := reqs[0] - assert.Check(t, is.Equal("foo", req.SecretName)) - assert.Check(t, is.Equal("testing", req.File.Name)) - assert.Check(t, is.Equal("1000", req.File.UID)) - assert.Check(t, is.Equal("1001", req.File.GID)) - assert.Check(t, is.Equal(os.FileMode(0444), req.File.Mode)) + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + var opt SecretOpt + assert.NilError(t, opt.Set(tc.input)) + reqs := opt.Value() + assert.Assert(t, is.Len(reqs, 1)) + req := reqs[0] + assert.Check(t, is.Equal(tc.secretName, req.SecretName)) + assert.Check(t, is.Equal(tc.fileName, req.File.Name)) + if tc.uid != "" { + assert.Check(t, is.Equal(tc.uid, req.File.UID)) + } + if tc.gid != "" { + assert.Check(t, is.Equal(tc.gid, req.File.GID)) + } + if tc.fileMode != 0 { + assert.Check(t, is.Equal(os.FileMode(tc.fileMode), req.File.Mode)) + } + }) + } }