Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 2411bdc

Browse files
Merge pull request #457 from rumpl/refactor-parameters
Refactor parameters resolution and merging
2 parents 0c1ee92 + 4746515 commit 2411bdc

6 files changed

Lines changed: 319 additions & 68 deletions

File tree

cmd/docker-app/cnab.go

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ import (
1414
"github.com/deislabs/duffle/pkg/loader"
1515
"github.com/docker/app/internal"
1616
"github.com/docker/app/internal/packager"
17-
"github.com/docker/app/types/parameters"
1817
"github.com/docker/cli/cli/command"
1918
"github.com/docker/cli/cli/context/store"
20-
cliopts "github.com/docker/cli/opts"
2119
"github.com/pkg/errors"
2220
)
2321

@@ -97,40 +95,6 @@ func prepareDriver(dockerCli command.Cli) (driver.Driver, error) {
9795
return driverImpl, err
9896
}
9997

100-
func applyParameterValues(parameterValues map[string]string, parameterDefinitions map[string]bundle.ParameterDefinition, finalValues map[string]interface{}) error {
101-
for k, v := range parameterValues {
102-
pd, ok := parameterDefinitions[k]
103-
if !ok {
104-
return fmt.Errorf("parameter %q is not defined in the bundle", k)
105-
}
106-
value, err := pd.ConvertValue(v)
107-
if err != nil {
108-
return errors.Wrapf(err, "invalid value for parameter %q", k)
109-
}
110-
if err := pd.ValidateParameterValue(value); err != nil {
111-
return errors.Wrapf(err, "invalid value for parameter %q", k)
112-
}
113-
finalValues[k] = value
114-
}
115-
return nil
116-
}
117-
118-
func prepareParameters(opts parametersOptions) (map[string]string, error) {
119-
p, err := parameters.LoadFiles(opts.parametersFiles)
120-
if err != nil {
121-
return nil, err
122-
}
123-
d := cliopts.ConvertKVStringsToMap(opts.env)
124-
overrides, err := parameters.FromFlatten(d)
125-
if err != nil {
126-
return nil, err
127-
}
128-
if p, err = parameters.Merge(p, overrides); err != nil {
129-
return nil, err
130-
}
131-
return p.Flatten(), nil
132-
}
133-
13498
func getAppNameKind(name string) (string, nameKind) {
13599
if name == "" {
136100
return name, nameKindEmpty

cmd/docker-app/install.go

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55

66
"github.com/deislabs/duffle/pkg/action"
7-
"github.com/deislabs/duffle/pkg/bundle"
87
"github.com/deislabs/duffle/pkg/claim"
98
"github.com/deislabs/duffle/pkg/credentials"
109
"github.com/deislabs/duffle/pkg/utils/crud"
@@ -70,19 +69,15 @@ func installCmd(dockerCli command.Cli) *cobra.Command {
7069

7170
func runInstall(dockerCli command.Cli, appname string, opts installOptions) error {
7271
muteDockerCli(dockerCli)
73-
targetContext := getTargetContext(opts.targetContext, dockerCli.CurrentContext())
74-
parameterValues, err := prepareParameters(opts.parametersOptions)
75-
if err != nil {
76-
return err
72+
if opts.sendRegistryAuth {
73+
return errors.New("with-registry-auth is not supported at the moment")
7774
}
75+
targetContext := getTargetContext(opts.targetContext, dockerCli.CurrentContext())
7876

7977
bndl, err := resolveBundle(dockerCli, opts.namespace, appname)
8078
if err != nil {
8179
return err
8280
}
83-
if opts.sendRegistryAuth {
84-
return errors.New("with-registry-auth is not supported at the moment")
85-
}
8681
if err := bndl.Validate(); err != nil {
8782
return err
8883
}
@@ -99,12 +94,6 @@ func runInstall(dockerCli command.Cli, appname string, opts installOptions) erro
9994
if err != nil {
10095
return err
10196
}
102-
if _, ok := bndl.Parameters["docker.orchestrator"]; ok {
103-
parameterValues["docker.orchestrator"] = opts.orchestrator
104-
}
105-
if _, ok := bndl.Parameters["docker.kubernetes-namespace"]; ok {
106-
parameterValues["docker.kubernetes-namespace"] = opts.kubeNamespace
107-
}
10897

10998
driverImpl, err := prepareDriver(dockerCli)
11099
if err != nil {
@@ -119,16 +108,16 @@ func runInstall(dockerCli command.Cli, appname string, opts installOptions) erro
119108
}
120109

121110
c.Bundle = bndl
122-
convertedParamValues := map[string]interface{}{}
123111

124-
if err := applyParameterValues(parameterValues, bndl.Parameters, convertedParamValues); err != nil {
125-
return err
126-
}
127-
128-
c.Parameters, err = bundle.ValuesOrDefaults(convertedParamValues, bndl)
112+
c.Parameters, err = mergeBundleParameters(bndl,
113+
withFileParameters(opts.parametersFiles),
114+
withCommandLineParameters(opts.overrides),
115+
withOrchestratorParameters(opts.orchestrator, opts.kubeNamespace),
116+
)
129117
if err != nil {
130118
return err
131119
}
120+
132121
inst := &action.Install{
133122
Driver: driverImpl,
134123
}

cmd/docker-app/parameters.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/deislabs/duffle/pkg/bundle"
7+
"github.com/docker/app/types/parameters"
8+
cliopts "github.com/docker/cli/opts"
9+
"github.com/pkg/errors"
10+
)
11+
12+
type parameterOperation func(bndl *bundle.Bundle, params map[string]string) error
13+
14+
func withFileParameters(parametersFiles []string) parameterOperation {
15+
return func(bndl *bundle.Bundle, params map[string]string) error {
16+
p, err := parameters.LoadFiles(parametersFiles)
17+
if err != nil {
18+
return err
19+
}
20+
for k, v := range p.Flatten() {
21+
params[k] = v
22+
}
23+
return nil
24+
}
25+
}
26+
27+
func withCommandLineParameters(overrides []string) parameterOperation {
28+
return func(bndl *bundle.Bundle, params map[string]string) error {
29+
d := cliopts.ConvertKVStringsToMap(overrides)
30+
for k, v := range d {
31+
params[k] = v
32+
}
33+
return nil
34+
}
35+
}
36+
37+
func withOrchestratorParameters(orchestrator string, kubeNamespace string) parameterOperation {
38+
return func(bndl *bundle.Bundle, params map[string]string) error {
39+
if _, ok := bndl.Parameters["docker.orchestrator"]; ok {
40+
params["docker.orchestrator"] = orchestrator
41+
}
42+
if _, ok := bndl.Parameters["docker.kubernetes-namespace"]; ok {
43+
params["docker.kubernetes-namespace"] = kubeNamespace
44+
}
45+
return nil
46+
}
47+
}
48+
49+
func mergeBundleParameters(bndl *bundle.Bundle, ops ...parameterOperation) (map[string]interface{}, error) {
50+
userParams := map[string]string{}
51+
for _, op := range ops {
52+
if err := op(bndl, userParams); err != nil {
53+
return nil, err
54+
}
55+
}
56+
convertedParams, err := matchParametersDefinition(userParams, bndl.Parameters)
57+
if err != nil {
58+
return nil, err
59+
}
60+
return bundle.ValuesOrDefaults(convertedParams, bndl)
61+
}
62+
63+
func matchParametersDefinition(parameterValues map[string]string, parameterDefinitions map[string]bundle.ParameterDefinition) (map[string]interface{}, error) {
64+
finalValues := map[string]interface{}{}
65+
for k, v := range parameterValues {
66+
definition, ok := parameterDefinitions[k]
67+
if !ok {
68+
return nil, fmt.Errorf("parameter %q is not defined in the bundle", k)
69+
}
70+
value, err := definition.ConvertValue(v)
71+
if err != nil {
72+
return nil, errors.Wrapf(err, "invalid value for parameter %q", k)
73+
}
74+
if err := definition.ValidateParameterValue(value); err != nil {
75+
return nil, errors.Wrapf(err, "invalid value for parameter %q", k)
76+
}
77+
finalValues[k] = value
78+
}
79+
return finalValues, nil
80+
}

0 commit comments

Comments
 (0)