diff --git a/cli/app/logs.go b/cli/app/logs.go index 7bb326e7..2057ebeb 100644 --- a/cli/app/logs.go +++ b/cli/app/logs.go @@ -30,7 +30,7 @@ var logOpts = types.ContainerLogsOptions{ // stackLogs lists logs for all stack services func stackLogs(c *cli.Context, app config.App, client *dockerClient.Client) { - filters, err := app.Filters() + filters, err := app.Filters(true, false) if err != nil { logrus.Fatal(err) } diff --git a/cli/app/ps.go b/cli/app/ps.go index e0c075ee..6d602cda 100644 --- a/cli/app/ps.go +++ b/cli/app/ps.go @@ -66,7 +66,7 @@ var appPsCommand = cli.Command{ // showPSOutput renders ps output. func showPSOutput(c *cli.Context, app config.App, cl *dockerClient.Client) { - filters, err := app.Filters() + filters, err := app.Filters(true, true) if err != nil { logrus.Fatal(err) } diff --git a/cli/app/remove.go b/cli/app/remove.go index a5ea805d..2810946c 100644 --- a/cli/app/remove.go +++ b/cli/app/remove.go @@ -65,7 +65,7 @@ var appRemoveCommand = cli.Command{ logrus.Fatalf("%s is still deployed. Run \"abra app undeploy %s\"", app.Name, app.Name) } - fs, err := app.Filters() + fs, err := app.Filters(false, false) if err != nil { logrus.Fatal(err) } @@ -114,6 +114,11 @@ var appRemoveCommand = cli.Command{ logrus.Info("no secrets to remove") } + fs, err = app.Filters(false, true) + if err != nil { + logrus.Fatal(err) + } + volumeListOKBody, err := cl.VolumeList(context.Background(), fs) volumeList := volumeListOKBody.Volumes if err != nil { diff --git a/cli/app/secret.go b/cli/app/secret.go index d3c555ec..5730cf77 100644 --- a/cli/app/secret.go +++ b/cli/app/secret.go @@ -216,7 +216,7 @@ Example: logrus.Fatal(err) } - filters, err := app.Filters() + filters, err := app.Filters(false, false) if err != nil { logrus.Fatal(err) } @@ -293,7 +293,7 @@ var appSecretLsCommand = cli.Command{ logrus.Fatal(err) } - filters, err := app.Filters() + filters, err := app.Filters(false, false) if err != nil { logrus.Fatal(err) } diff --git a/cli/app/volume.go b/cli/app/volume.go index c1c7fb9f..4d658432 100644 --- a/cli/app/volume.go +++ b/cli/app/volume.go @@ -26,7 +26,7 @@ var appVolumeListCommand = cli.Command{ Action: func(c *cli.Context) error { app := internal.ValidateApp(c) - filters, err := app.Filters() + filters, err := app.Filters(false, true) if err != nil { logrus.Fatal(err) } @@ -80,7 +80,7 @@ Passing "--force/-f" will select all volumes for removal. Be careful. Action: func(c *cli.Context) error { app := internal.ValidateApp(c) - filters, err := app.Filters() + filters, err := app.Filters(false, true) if err != nil { logrus.Fatal(err) } diff --git a/pkg/config/app.go b/pkg/config/app.go index 33029189..756d5efd 100644 --- a/pkg/config/app.go +++ b/pkg/config/app.go @@ -64,8 +64,13 @@ func (a App) StackName() string { return stackName } -// Filters retrieves exact app filters for querying the container runtime. -func (a App) Filters() (filters.Args, error) { +// Filters retrieves exact app filters for querying the container runtime. Due +// to upstream issues, filtering works different depending on what you're +// querying. So, for example, secrets don't work with regex! The caller needs +// to implement their own validation that the right secrets are matched. In +// order to handle these cases, we provide the `appendServiceNames` / +// `exactMatch` modifiers. +func (a App) Filters(appendServiceNames, exactMatch bool) (filters.Args, error) { filters := filters.NewArgs() composeFiles, err := GetAppComposeFiles(a.Recipe, a.Env) @@ -80,7 +85,22 @@ func (a App) Filters() (filters.Args, error) { } for _, service := range compose.Services { - filter := fmt.Sprintf("^%s_%s", a.StackName(), service.Name) + var filter string + + if appendServiceNames { + if exactMatch { + filter = fmt.Sprintf("^%s_%s", a.StackName(), service.Name) + } else { + filter = fmt.Sprintf("%s_%s", a.StackName(), service.Name) + } + } else { + if exactMatch { + filter = fmt.Sprintf("^%s", a.StackName()) + } else { + filter = fmt.Sprintf("%s", a.StackName()) + } + } + filters.Add("name", filter) }