Skip to content

Commit

Permalink
Merge pull request #10736 from trusch/feature-use-secret-config
Browse files Browse the repository at this point in the history
read secret config from config file if no user data.
  • Loading branch information
openshift-merge-robot authored Jun 25, 2021
2 parents b476781 + e7507fe commit 0a0ade3
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 26 deletions.
8 changes: 7 additions & 1 deletion cmd/podman/secrets/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,14 @@ func init() {
flags := createCmd.Flags()

driverFlagName := "driver"
flags.StringVar(&createOpts.Driver, driverFlagName, "file", "Specify secret driver")
optsFlagName := "driver-opts"

cfg := registry.PodmanConfig()

flags.StringVar(&createOpts.Driver, driverFlagName, cfg.Secrets.Driver, "Specify secret driver")
flags.StringToStringVar(&createOpts.DriverOpts, optsFlagName, cfg.Secrets.Opts, "Specify driver specific options")
_ = createCmd.RegisterFlagCompletionFunc(driverFlagName, completion.AutocompleteNone)
_ = createCmd.RegisterFlagCompletionFunc(optsFlagName, completion.AutocompleteNone)

envFlagName := "env"
flags.BoolVar(&env, envFlagName, false, "Read secret data from environment variable")
Expand Down
4 changes: 4 additions & 0 deletions docs/source/markdown/podman-secret-create.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ Read secret data from environment variable

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

#### **--driver-opts**=*key1=val1,key2=val2*

Specify driver specific options

#### **--help**

Print usage statement.
Expand Down
16 changes: 14 additions & 2 deletions pkg/api/handlers/libpod/secrets.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package libpod

import (
"encoding/json"
"net/http"
"reflect"

"github.com/containers/podman/v3/libpod"
"github.com/containers/podman/v3/pkg/api/handlers/utils"
Expand All @@ -16,9 +18,17 @@ func CreateSecret(w http.ResponseWriter, r *http.Request) {
runtime = r.Context().Value("runtime").(*libpod.Runtime)
decoder = r.Context().Value("decoder").(*schema.Decoder)
)

decoder.RegisterConverter(map[string]string{}, func(str string) reflect.Value {
res := make(map[string]string)
json.Unmarshal([]byte(str), &res)
return reflect.ValueOf(res)
})

query := struct {
Name string `schema:"name"`
Driver string `schema:"driver"`
Name string `schema:"name"`
Driver string `schema:"driver"`
DriverOpts map[string]string `schema:"driveropts"`
}{
// override any golang type defaults
}
Expand All @@ -28,7 +38,9 @@ func CreateSecret(w http.ResponseWriter, r *http.Request) {
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
return
}

opts.Driver = query.Driver
opts.DriverOpts = query.DriverOpts

ic := abi.ContainerEngine{Libpod: runtime}
report, err := ic.SecretCreate(r.Context(), query.Name, r.Body, opts)
Expand Down
4 changes: 2 additions & 2 deletions pkg/bindings/internal/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ func ToParams(o interface{}) (url.Values, error) {
}
}
case f.Kind() == reflect.Map:
lowerCaseKeys := make(map[string][]string)
lowerCaseKeys := make(map[string]interface{})
iter := f.MapRange()
for iter.Next() {
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface().([]string)
lowerCaseKeys[iter.Key().Interface().(string)] = iter.Value().Interface()
}
s, err := json.MarshalToString(lowerCaseKeys)
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions pkg/bindings/secrets/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type RemoveOptions struct {
//go:generate go run ../generator/generator.go CreateOptions
// CreateOptions are optional options for Creating secrets
type CreateOptions struct {
Driver *string
Name *string
Name *string
Driver *string
DriverOpts map[string]string
}
36 changes: 26 additions & 10 deletions pkg/bindings/secrets/types_create_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,22 @@ func (o *CreateOptions) ToParams() (url.Values, error) {
return util.ToParams(o)
}

// WithName
func (o *CreateOptions) WithName(value string) *CreateOptions {
v := &value
o.Name = v
return o
}

// GetName
func (o *CreateOptions) GetName() string {
var name string
if o.Name == nil {
return name
}
return *o.Name
}

// WithDriver
func (o *CreateOptions) WithDriver(value string) *CreateOptions {
v := &value
Expand All @@ -36,18 +52,18 @@ func (o *CreateOptions) GetDriver() string {
return *o.Driver
}

// WithName
func (o *CreateOptions) WithName(value string) *CreateOptions {
v := &value
o.Name = v
// WithDriverOpts
func (o *CreateOptions) WithDriverOpts(value map[string]string) *CreateOptions {
v := value
o.DriverOpts = v
return o
}

// GetName
func (o *CreateOptions) GetName() string {
var name string
if o.Name == nil {
return name
// GetDriverOpts
func (o *CreateOptions) GetDriverOpts() map[string]string {
var driverOpts map[string]string
if o.DriverOpts == nil {
return driverOpts
}
return *o.Name
return o.DriverOpts
}
3 changes: 2 additions & 1 deletion pkg/domain/entities/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ type SecretCreateReport struct {
}

type SecretCreateOptions struct {
Driver string
Driver string
DriverOpts map[string]string
}

type SecretListRequest struct {
Expand Down
26 changes: 21 additions & 5 deletions pkg/domain/infra/abi/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,30 @@ func (ic *ContainerEngine) SecretCreate(ctx context.Context, name string, reader
if err != nil {
return nil, err
}
driverOptions := make(map[string]string)

// set defaults from config for the case they are not set by an upper layer
// (-> i.e. tests that talk directly to the api)
cfg, err := ic.Libpod.GetConfig()
if err != nil {
return nil, err
}
if options.Driver == "" {
options.Driver = "file"
options.Driver = cfg.Secrets.Driver
}
if len(options.DriverOpts) == 0 {
options.DriverOpts = cfg.Secrets.Opts
}
if options.DriverOpts == nil {
options.DriverOpts = make(map[string]string)
}

if options.Driver == "file" {
driverOptions["path"] = filepath.Join(secretsPath, "filedriver")
if _, ok := options.DriverOpts["path"]; !ok {
options.DriverOpts["path"] = filepath.Join(secretsPath, "filedriver")
}
}
secretID, err := manager.Store(name, data, options.Driver, driverOptions)

secretID, err := manager.Store(name, data, options.Driver, options.DriverOpts)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -58,7 +73,8 @@ func (ic *ContainerEngine) SecretInspect(ctx context.Context, nameOrIDs []string
Spec: entities.SecretSpec{
Name: secret.Name,
Driver: entities.SecretDriverSpec{
Name: secret.Driver,
Name: secret.Driver,
Options: secret.DriverOptions,
},
},
}
Expand Down
10 changes: 8 additions & 2 deletions pkg/domain/infra/tunnel/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@ import (
)

func (ic *ContainerEngine) SecretCreate(ctx context.Context, name string, reader io.Reader, options entities.SecretCreateOptions) (*entities.SecretCreateReport, error) {
opts := new(secrets.CreateOptions).WithDriver(options.Driver).WithName(name)
created, _ := secrets.Create(ic.ClientCtx, reader, opts)
opts := new(secrets.CreateOptions).
WithDriver(options.Driver).
WithDriverOpts(options.DriverOpts).
WithName(name)
created, err := secrets.Create(ic.ClientCtx, reader, opts)
if err != nil {
return nil, err
}
return created, nil
}

Expand Down
6 changes: 5 additions & 1 deletion test/e2e/secret_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ var _ = Describe("Podman secret", func() {
err := ioutil.WriteFile(secretFilePath, []byte("mysecret"), 0755)
Expect(err).To(BeNil())

session := podmanTest.Podman([]string{"secret", "create", "a", secretFilePath})
session := podmanTest.Podman([]string{"secret", "create", "--driver-opts", "opt1=val", "a", secretFilePath})
session.WaitWithDefaultTimeout()
secrID := session.OutputToString()
Expect(session.ExitCode()).To(Equal(0))
Expand All @@ -48,6 +48,10 @@ var _ = Describe("Podman secret", func() {
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(Equal(0))
Expect(inspect.OutputToString()).To(Equal(secrID))
inspect = podmanTest.Podman([]string{"secret", "inspect", "--format", "{{.Spec.Driver.Options}}", secrID})
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(Equal(0))
Expect(inspect.OutputToString()).To(ContainSubstring("opt1:val"))
})

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

0 comments on commit 0a0ade3

Please sign in to comment.