From 6aa23a76a1275bb57bd942f4cd78881d9be4dcc9 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Sun, 27 Mar 2022 12:40:05 +0200 Subject: [PATCH] fix: more precise filtering Closes https://git.coopcloud.tech/coop-cloud/organising/issues/305. --- cli/app/cp.go | 2 +- cli/app/errors.go | 4 +++- cli/app/logs.go | 14 +++++++++----- cli/app/ps.go | 7 ++++--- cli/app/remove.go | 8 +++++--- cli/app/run.go | 2 +- cli/app/secret.go | 15 ++++++++++----- cli/app/volume.go | 14 ++++++++++++-- pkg/client/volumes.go | 5 +---- pkg/config/app.go | 24 ++++++++++++++++++++++++ 10 files changed, 70 insertions(+), 25 deletions(-) diff --git a/cli/app/cp.go b/cli/app/cp.go index 5e647715..4f2d46ab 100644 --- a/cli/app/cp.go +++ b/cli/app/cp.go @@ -111,7 +111,7 @@ func configureAndCp( } filters := filters.NewArgs() - filters.Add("name", fmt.Sprintf("%s_%s", app.StackName(), service)) + filters.Add("name", fmt.Sprintf("^%s_%s", app.StackName(), service)) container, err := container.GetContainer(context.Background(), cl, filters, internal.NoInput) if err != nil { diff --git a/cli/app/errors.go b/cli/app/errors.go index 2d0632c9..e7efb822 100644 --- a/cli/app/errors.go +++ b/cli/app/errors.go @@ -2,6 +2,7 @@ package app import ( "context" + "fmt" "strconv" "strings" "time" @@ -95,7 +96,8 @@ func checkErrors(c *cli.Context, cl *dockerClient.Client, app config.App) error for _, service := range recipe.Config.Services { filters := filters.NewArgs() - filters.Add("name", service.Name) + filters.Add("name", fmt.Sprintf("^%s_%s", app.StackName(), service.Name)) + containers, err := cl.ContainerList(context.Background(), types.ContainerListOptions{Filters: filters}) if err != nil { return err diff --git a/cli/app/logs.go b/cli/app/logs.go index 8eb88920..7bb326e7 100644 --- a/cli/app/logs.go +++ b/cli/app/logs.go @@ -29,9 +29,12 @@ var logOpts = types.ContainerLogsOptions{ } // stackLogs lists logs for all stack services -func stackLogs(c *cli.Context, stackName string, client *dockerClient.Client) { - filters := filters.NewArgs() - filters.Add("name", stackName) +func stackLogs(c *cli.Context, app config.App, client *dockerClient.Client) { + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + serviceOpts := types.ServiceListOptions{Filters: filters} services, err := client.ServiceList(context.Background(), serviceOpts) if err != nil { @@ -86,7 +89,7 @@ var appLogsCommand = cli.Command{ serviceName := c.Args().Get(1) if serviceName == "" { logrus.Debugf("tailing logs for all %s services", app.Recipe) - stackLogs(c, app.StackName(), cl) + stackLogs(c, app, cl) } else { logrus.Debugf("tailing logs for %s", serviceName) if err := tailServiceLogs(c, cl, app, serviceName); err != nil { @@ -100,7 +103,8 @@ var appLogsCommand = cli.Command{ func tailServiceLogs(c *cli.Context, cl *dockerClient.Client, app config.App, serviceName string) error { filters := filters.NewArgs() - filters.Add("name", fmt.Sprintf("%s_%s", app.StackName(), serviceName)) + filters.Add("name", fmt.Sprintf("^%s_%s", app.StackName(), serviceName)) + chosenService, err := service.GetService(context.Background(), cl, filters, internal.NoInput) if err != nil { logrus.Fatal(err) diff --git a/cli/app/ps.go b/cli/app/ps.go index 2cdfc889..e0c075ee 100644 --- a/cli/app/ps.go +++ b/cli/app/ps.go @@ -15,7 +15,6 @@ import ( "github.com/buger/goterm" dockerFormatter "github.com/docker/cli/cli/command/formatter" "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" dockerClient "github.com/docker/docker/client" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -67,8 +66,10 @@ var appPsCommand = cli.Command{ // showPSOutput renders ps output. func showPSOutput(c *cli.Context, app config.App, cl *dockerClient.Client) { - filters := filters.NewArgs() - filters.Add("name", app.StackName()) + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } containers, err := cl.ContainerList(context.Background(), types.ContainerListOptions{Filters: filters}) if err != nil { diff --git a/cli/app/remove.go b/cli/app/remove.go index 2c09cc97..a5ea805d 100644 --- a/cli/app/remove.go +++ b/cli/app/remove.go @@ -11,7 +11,6 @@ import ( stack "coopcloud.tech/abra/pkg/upstream/stack" "github.com/AlecAivazis/survey/v2" "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -66,8 +65,11 @@ var appRemoveCommand = cli.Command{ logrus.Fatalf("%s is still deployed. Run \"abra app undeploy %s\"", app.Name, app.Name) } - fs := filters.NewArgs() - fs.Add("name", app.StackName()) + fs, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + secretList, err := cl.SecretList(context.Background(), types.SecretListOptions{Filters: fs}) if err != nil { logrus.Fatal(err) diff --git a/cli/app/run.go b/cli/app/run.go index f2572e7c..4ae68c1b 100644 --- a/cli/app/run.go +++ b/cli/app/run.go @@ -59,7 +59,7 @@ var appRunCommand = cli.Command{ } serviceName := c.Args().Get(1) - stackAndServiceName := fmt.Sprintf("%s_%s", app.StackName(), serviceName) + stackAndServiceName := fmt.Sprintf("^%s_%s", app.StackName(), serviceName) filters := filters.NewArgs() filters.Add("name", stackAndServiceName) diff --git a/cli/app/secret.go b/cli/app/secret.go index bcf89492..d3c555ec 100644 --- a/cli/app/secret.go +++ b/cli/app/secret.go @@ -14,7 +14,6 @@ import ( "coopcloud.tech/abra/pkg/formatter" "coopcloud.tech/abra/pkg/secret" "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" dockerClient "github.com/docker/docker/client" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -217,8 +216,11 @@ Example: logrus.Fatal(err) } - filters := filters.NewArgs() - filters.Add("name", app.StackName()) + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + secretList, err := cl.SecretList(context.Background(), types.SecretListOptions{Filters: filters}) if err != nil { logrus.Fatal(err) @@ -291,8 +293,11 @@ var appSecretLsCommand = cli.Command{ logrus.Fatal(err) } - filters := filters.NewArgs() - filters.Add("name", app.StackName()) + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + secretList, err := cl.SecretList(context.Background(), types.SecretListOptions{Filters: filters}) if err != nil { logrus.Fatal(err) diff --git a/cli/app/volume.go b/cli/app/volume.go index 42b5bd33..c1c7fb9f 100644 --- a/cli/app/volume.go +++ b/cli/app/volume.go @@ -26,7 +26,12 @@ var appVolumeListCommand = cli.Command{ Action: func(c *cli.Context) error { app := internal.ValidateApp(c) - volumeList, err := client.GetVolumes(context.Background(), app.Server, app.StackName()) + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + + volumeList, err := client.GetVolumes(context.Background(), app.Server, filters) if err != nil { logrus.Fatal(err) } @@ -75,7 +80,12 @@ Passing "--force/-f" will select all volumes for removal. Be careful. Action: func(c *cli.Context) error { app := internal.ValidateApp(c) - volumeList, err := client.GetVolumes(context.Background(), app.Server, app.StackName()) + filters, err := app.Filters() + if err != nil { + logrus.Fatal(err) + } + + volumeList, err := client.GetVolumes(context.Background(), app.Server, filters) if err != nil { logrus.Fatal(err) } diff --git a/pkg/client/volumes.go b/pkg/client/volumes.go index 3e6d99b9..fca6c2fb 100644 --- a/pkg/client/volumes.go +++ b/pkg/client/volumes.go @@ -7,15 +7,12 @@ import ( "github.com/docker/docker/api/types/filters" ) -func GetVolumes(ctx context.Context, server string, appName string) ([]*types.Volume, error) { +func GetVolumes(ctx context.Context, server string, fs filters.Args) ([]*types.Volume, error) { cl, err := New(server) if err != nil { return nil, err } - fs := filters.NewArgs() - fs.Add("name", appName) - volumeListOKBody, err := cl.VolumeList(ctx, fs) volumeList := volumeListOKBody.Volumes if err != nil { diff --git a/pkg/config/app.go b/pkg/config/app.go index 3f66bad7..33029189 100644 --- a/pkg/config/app.go +++ b/pkg/config/app.go @@ -13,6 +13,7 @@ import ( loader "coopcloud.tech/abra/pkg/upstream/stack" stack "coopcloud.tech/abra/pkg/upstream/stack" composetypes "github.com/docker/cli/cli/compose/types" + "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" ) @@ -63,6 +64,29 @@ 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 := filters.NewArgs() + + composeFiles, err := GetAppComposeFiles(a.Recipe, a.Env) + if err != nil { + return filters, err + } + + opts := stack.Deploy{Composefiles: composeFiles} + compose, err := GetAppComposeConfig(a.Recipe, opts, a.Env) + if err != nil { + return filters, err + } + + for _, service := range compose.Services { + filter := fmt.Sprintf("^%s_%s", a.StackName(), service.Name) + filters.Add("name", filter) + } + + return filters, nil +} + // ByServer sort a slice of Apps type ByServer []App