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

Commit 0631b74

Browse files
authored
Merge pull request #710 from ndeloof/APP-117
Validate parameters against the actual compose file
2 parents 4f1a642 + 5fe2739 commit 0631b74

File tree

5 files changed

+95
-14
lines changed

5 files changed

+95
-14
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
version: "3.6"
2+
services:
3+
api:
4+
image: python:3.6
5+
networks:
6+
back:
7+
front:
8+
aliases:
9+
- api.example.com
10+
- ${api.host}
11+
web:
12+
image: nginx:latest
13+
networks:
14+
- front
15+
volumes:
16+
- static:/opt/${static_subdir}
17+
ports:
18+
- ${web.port}:80
19+
db:
20+
image: postgres:9.3
21+
networks:
22+
- back
23+
networks:
24+
front:
25+
back:
26+
volumes:
27+
static:
28+
external: true
29+
name: corp/web-static-data
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: 1.1.0-beta1
2+
name: simple
3+
description: "new fancy webapp with microservices"
4+
maintainers:
5+
- name: John Developer
6+
7+
- name: Jane Developer
8+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
web:
2+
port: '8082'
3+
api:
4+
host: example.com
5+
static_subdir: data/static
6+
unused:
7+
parameter: FOO

e2e/validate_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package e2e
2+
3+
import (
4+
"path"
5+
"strings"
6+
"testing"
7+
8+
"gotest.tools/assert"
9+
10+
"gotest.tools/icmd"
11+
)
12+
13+
func TestOrphanedParameter(t *testing.T) {
14+
cmd, cleanup := dockerCli.createTestCmd()
15+
defer cleanup()
16+
p := path.Join("testdata", "invalid", "unused_parameter")
17+
cmd.Command = dockerCli.Command("app", "validate", p)
18+
out := icmd.RunCmd(cmd).Assert(t, icmd.Expected{ExitCode: 1}).Combined()
19+
assert.Assert(t, strings.Contains(out, "unused.parameter is declared as parameter but not used by the compose file"))
20+
}

internal/commands/validate.go

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import (
44
"fmt"
55
"os"
66

7+
"github.com/docker/app/internal/compose"
78
"github.com/docker/app/internal/packager"
89
"github.com/docker/app/render"
910
"github.com/docker/app/types"
1011
"github.com/docker/cli/cli"
1112
cliopts "github.com/docker/cli/opts"
13+
"github.com/pkg/errors"
1214
"github.com/spf13/cobra"
1315
)
1416

@@ -24,22 +26,37 @@ func validateCmd() *cobra.Command {
2426
Example: `$ docker app validate myapp.dockerapp --set key=value --parameters-file myparam.yml`,
2527
Args: cli.RequiresMaxArgs(1),
2628
RunE: func(cmd *cobra.Command, args []string) error {
27-
app, err := packager.Extract(firstOrEmpty(args),
28-
types.WithParametersFiles(opts.parametersFiles...),
29-
)
30-
if err != nil {
31-
return err
32-
}
33-
defer app.Cleanup()
34-
argParameters := cliopts.ConvertKVStringsToMap(opts.overrides)
35-
_, err = render.Render(app, argParameters, nil)
36-
if err != nil {
37-
return err
38-
}
39-
fmt.Fprintf(os.Stdout, "Validated %q\n", app.Path)
40-
return nil
29+
return runValidate(args, opts)
4130
},
4231
}
4332
opts.parametersOptions.addFlags(cmd.Flags())
4433
return cmd
4534
}
35+
36+
func runValidate(args []string, opts validateOptions) error {
37+
app, err := packager.Extract(firstOrEmpty(args),
38+
types.WithParametersFiles(opts.parametersFiles...),
39+
)
40+
if err != nil {
41+
return err
42+
}
43+
defer app.Cleanup()
44+
argParameters := cliopts.ConvertKVStringsToMap(opts.overrides)
45+
_, err = render.Render(app, argParameters, nil)
46+
if err != nil {
47+
return err
48+
}
49+
50+
vars, err := compose.ExtractVariables(app.Composes()[0], compose.ExtrapolationPattern)
51+
if err != nil {
52+
return errors.Wrap(err, "failed to parse compose file")
53+
}
54+
for k := range app.Parameters().Flatten() {
55+
if _, ok := vars[k]; !ok {
56+
return fmt.Errorf("%s is declared as parameter but not used by the compose file", k)
57+
}
58+
}
59+
60+
fmt.Fprintf(os.Stdout, "Validated %q\n", app.Path)
61+
return nil
62+
}

0 commit comments

Comments
 (0)