Browse Source

Filter `compose ps` output by provided compose model

Signed-off-by: Laura Brehm <[email protected]>
Laura Brehm 3 years ago
parent
commit
be495ab8e6
4 changed files with 20 additions and 2 deletions
  1. 3 2
      cmd/compose/ps.go
  2. 1 0
      pkg/api/api.go
  3. 13 0
      pkg/compose/ps.go
  4. 3 0
      pkg/compose/ps_test.go

+ 3 - 2
cmd/compose/ps.go

@@ -91,11 +91,12 @@ func psCommand(p *projectOptions, backend api.Service) *cobra.Command {
 }
 
 func runPs(ctx context.Context, backend api.Service, services []string, opts psOptions) error {
-	projectName, err := opts.toProjectName()
+	project, name, err := opts.projectOrName()
 	if err != nil {
 		return err
 	}
-	containers, err := backend.Ps(ctx, projectName, api.PsOptions{
+	containers, err := backend.Ps(ctx, name, api.PsOptions{
+		Project:  project,
 		All:      opts.All,
 		Services: services,
 	})

+ 1 - 0
pkg/api/api.go

@@ -280,6 +280,7 @@ type ListOptions struct {
 
 // PsOptions group options of the Ps API
 type PsOptions struct {
+	Project  *types.Project
 	All      bool
 	Services []string
 }

+ 13 - 0
pkg/compose/ps.go

@@ -37,6 +37,19 @@ func (s *composeService) Ps(ctx context.Context, projectName string, options api
 		return nil, err
 	}
 
+	project := options.Project
+	if project == nil {
+		project, err = s.getProjectWithResources(ctx, containers, projectName)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(options.Services) == 0 {
+		options.Services = project.ServiceNames()
+	}
+
+	containers = containers.filter(isService(options.Services...))
 	summary := make([]api.ContainerSummary, len(containers))
 	eg, ctx := errgroup.WithContext(ctx)
 	for i, container := range containers {

+ 3 - 0
pkg/compose/ps_test.go

@@ -26,6 +26,7 @@ import (
 
 	moby "github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/filters"
+	"github.com/docker/docker/api/types/volume"
 
 	compose "github.com/docker/compose/v2/pkg/api"
 	"github.com/docker/compose/v2/pkg/mocks"
@@ -48,6 +49,8 @@ func TestPs(t *testing.T) {
 	c2, inspect2 := containerDetails("service1", "456", "running", "", 0)
 	c2.Ports = []moby.Port{{PublicPort: 80, PrivatePort: 90, IP: "localhost"}}
 	c3, inspect3 := containerDetails("service2", "789", "exited", "", 130)
+	api.EXPECT().VolumeList(ctx, gomock.Any()).Return(volume.VolumeListOKBody{}, nil)
+	api.EXPECT().NetworkList(ctx, gomock.Any()).Return([]moby.NetworkResource{}, nil)
 	api.EXPECT().ContainerList(ctx, listOpts).Return([]moby.Container{c1, c2, c3}, nil)
 	api.EXPECT().ContainerInspect(anyCancellableContext(), "123").Return(inspect1, nil)
 	api.EXPECT().ContainerInspect(anyCancellableContext(), "456").Return(inspect2, nil)