Skip to content

Commit 0a0ade3

Browse files
Merge pull request #10736 from trusch/feature-use-secret-config
read secret config from config file if no user data.
2 parents b476781 + e7507fe commit 0a0ade3

File tree

10 files changed

+92
-26
lines changed

10 files changed

+92
-26
lines changed

cmd/podman/secrets/create.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@ func init() {
4242
flags := createCmd.Flags()
4343

4444
driverFlagName := "driver"
45-
flags.StringVar(&createOpts.Driver, driverFlagName, "file", "Specify secret driver")
45+
optsFlagName := "driver-opts"
46+
47+
cfg := registry.PodmanConfig()
48+
49+
flags.StringVar(&createOpts.Driver, driverFlagName, cfg.Secrets.Driver, "Specify secret driver")
50+
flags.StringToStringVar(&createOpts.DriverOpts, optsFlagName, cfg.Secrets.Opts, "Specify driver specific options")
4651
_ = createCmd.RegisterFlagCompletionFunc(driverFlagName, completion.AutocompleteNone)
52+
_ = createCmd.RegisterFlagCompletionFunc(optsFlagName, completion.AutocompleteNone)
4753

4854
envFlagName := "env"
4955
flags.BoolVar(&env, envFlagName, false, "Read secret data from environment variable")

docs/source/markdown/podman-secret-create.1.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Read secret data from environment variable
2828

2929
Specify the secret driver (default **file**, which is unencrypted).
3030

31+
#### **--driver-opts**=*key1=val1,key2=val2*
32+
33+
Specify driver specific options
34+
3135
#### **--help**
3236

3337
Print usage statement.

pkg/api/handlers/libpod/secrets.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package libpod
22

33
import (
4+
"encoding/json"
45
"net/http"
6+
"reflect"
57

68
"github.com/containers/podman/v3/libpod"
79
"github.com/containers/podman/v3/pkg/api/handlers/utils"
@@ -16,9 +18,17 @@ func CreateSecret(w http.ResponseWriter, r *http.Request) {
1618
runtime = r.Context().Value("runtime").(*libpod.Runtime)
1719
decoder = r.Context().Value("decoder").(*schema.Decoder)
1820
)
21+
22+
decoder.RegisterConverter(map[string]string{}, func(str string) reflect.Value {
23+
res := make(map[string]string)
24+
json.Unmarshal([]byte(str), &res)
25+
return reflect.ValueOf(res)
26+
})
27+
1928
query := struct {
20-
Name string `schema:"name"`
21-
Driver string `schema:"driver"`
29+
Name string `schema:"name"`
30+
Driver string `schema:"driver"`
31+
DriverOpts map[string]string `schema:"driveropts"`
2232
}{
2333
// override any golang type defaults
2434
}
@@ -28,7 +38,9 @@ func CreateSecret(w http.ResponseWriter, r *http.Request) {
2838
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
2939
return
3040
}
41+
3142
opts.Driver = query.Driver
43+
opts.DriverOpts = query.DriverOpts
3244

3345
ic := abi.ContainerEngine{Libpod: runtime}
3446
report, err := ic.SecretCreate(r.Context(), query.Name, r.Body, opts)

pkg/bindings/internal/util/util.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ func ToParams(o interface{}) (url.Values, error) {
8585
}
8686
}
8787
case f.Kind() == reflect.Map:
88-
lowerCaseKeys := make(map[string][]string)
88+
lowerCaseKeys := make(map[string]interface{})
8989
iter := f.MapRange()
9090
for iter.Next() {
91-
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string)
91+
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface()
9292
}
9393
s, err := json.MarshalToString(lowerCaseKeys)
9494
if err != nil {

pkg/bindings/secrets/types.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type RemoveOptions struct {
1818
//go:generate go run ../generator/generator.go CreateOptions
1919
// CreateOptions are optional options for Creating secrets
2020
type CreateOptions struct {
21-
Driver *string
22-
Name *string
21+
Name *string
22+
Driver *string
23+
DriverOpts map[string]string
2324
}

pkg/bindings/secrets/types_create_options.go

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,22 @@ func (o *CreateOptions) ToParams() (url.Values, error) {
2020
return util.ToParams(o)
2121
}
2222

23+
// WithName
24+
func (o *CreateOptions) WithName(value string) *CreateOptions {
25+
v := &value
26+
o.Name = v
27+
return o
28+
}
29+
30+
// GetName
31+
func (o *CreateOptions) GetName() string {
32+
var name string
33+
if o.Name == nil {
34+
return name
35+
}
36+
return *o.Name
37+
}
38+
2339
// WithDriver
2440
func (o *CreateOptions) WithDriver(value string) *CreateOptions {
2541
v := &value
@@ -36,18 +52,18 @@ func (o *CreateOptions) GetDriver() string {
3652
return *o.Driver
3753
}
3854

39-
// WithName
40-
func (o *CreateOptions) WithName(value string) *CreateOptions {
41-
v := &value
42-
o.Name = v
55+
// WithDriverOpts
56+
func (o *CreateOptions) WithDriverOpts(value map[string]string) *CreateOptions {
57+
v := value
58+
o.DriverOpts = v
4359
return o
4460
}
4561

46-
// GetName
47-
func (o *CreateOptions) GetName() string {
48-
var name string
49-
if o.Name == nil {
50-
return name
62+
// GetDriverOpts
63+
func (o *CreateOptions) GetDriverOpts() map[string]string {
64+
var driverOpts map[string]string
65+
if o.DriverOpts == nil {
66+
return driverOpts
5167
}
52-
return *o.Name
68+
return o.DriverOpts
5369
}

pkg/domain/entities/secrets.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ type SecretCreateReport struct {
1111
}
1212

1313
type SecretCreateOptions struct {
14-
Driver string
14+
Driver string
15+
DriverOpts map[string]string
1516
}
1617

1718
type SecretListRequest struct {

pkg/domain/infra/abi/secrets.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,30 @@ func (ic *ContainerEngine) SecretCreate(ctx context.Context, name string, reader
1717
if err != nil {
1818
return nil, err
1919
}
20-
driverOptions := make(map[string]string)
2120

21+
// set defaults from config for the case they are not set by an upper layer
22+
// (-> i.e. tests that talk directly to the api)
23+
cfg, err := ic.Libpod.GetConfig()
24+
if err != nil {
25+
return nil, err
26+
}
2227
if options.Driver == "" {
23-
options.Driver = "file"
28+
options.Driver = cfg.Secrets.Driver
29+
}
30+
if len(options.DriverOpts) == 0 {
31+
options.DriverOpts = cfg.Secrets.Opts
32+
}
33+
if options.DriverOpts == nil {
34+
options.DriverOpts = make(map[string]string)
2435
}
36+
2537
if options.Driver == "file" {
26-
driverOptions["path"] = filepath.Join(secretsPath, "filedriver")
38+
if _, ok := options.DriverOpts["path"]; !ok {
39+
options.DriverOpts["path"] = filepath.Join(secretsPath, "filedriver")
40+
}
2741
}
28-
secretID, err := manager.Store(name, data, options.Driver, driverOptions)
42+
43+
secretID, err := manager.Store(name, data, options.Driver, options.DriverOpts)
2944
if err != nil {
3045
return nil, err
3146
}
@@ -58,7 +73,8 @@ func (ic *ContainerEngine) SecretInspect(ctx context.Context, nameOrIDs []string
5873
Spec: entities.SecretSpec{
5974
Name: secret.Name,
6075
Driver: entities.SecretDriverSpec{
61-
Name: secret.Driver,
76+
Name: secret.Driver,
77+
Options: secret.DriverOptions,
6278
},
6379
},
6480
}

pkg/domain/infra/tunnel/secrets.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ import (
1111
)
1212

1313
func (ic *ContainerEngine) SecretCreate(ctx context.Context, name string, reader io.Reader, options entities.SecretCreateOptions) (*entities.SecretCreateReport, error) {
14-
opts := new(secrets.CreateOptions).WithDriver(options.Driver).WithName(name)
15-
created, _ := secrets.Create(ic.ClientCtx, reader, opts)
14+
opts := new(secrets.CreateOptions).
15+
WithDriver(options.Driver).
16+
WithDriverOpts(options.DriverOpts).
17+
WithName(name)
18+
created, err := secrets.Create(ic.ClientCtx, reader, opts)
19+
if err != nil {
20+
return nil, err
21+
}
1622
return created, nil
1723
}
1824

test/e2e/secret_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var _ = Describe("Podman secret", func() {
3939
err := ioutil.WriteFile(secretFilePath, []byte("mysecret"), 0755)
4040
Expect(err).To(BeNil())
4141

42-
session := podmanTest.Podman([]string{"secret", "create", "a", secretFilePath})
42+
session := podmanTest.Podman([]string{"secret", "create", "--driver-opts", "opt1=val", "a", secretFilePath})
4343
session.WaitWithDefaultTimeout()
4444
secrID := session.OutputToString()
4545
Expect(session.ExitCode()).To(Equal(0))
@@ -48,6 +48,10 @@ var _ = Describe("Podman secret", func() {
4848
inspect.WaitWithDefaultTimeout()
4949
Expect(inspect.ExitCode()).To(Equal(0))
5050
Expect(inspect.OutputToString()).To(Equal(secrID))
51+
inspect = podmanTest.Podman([]string{"secret", "inspect", "--format", "{{.Spec.Driver.Options}}", secrID})
52+
inspect.WaitWithDefaultTimeout()
53+
Expect(inspect.ExitCode()).To(Equal(0))
54+
Expect(inspect.OutputToString()).To(ContainSubstring("opt1:val"))
5155
})
5256

5357
It("podman secret create bad name should fail", func() {

0 commit comments

Comments
 (0)