From c0dff563784f78a9be3b9d463adc3162222f772a Mon Sep 17 00:00:00 2001 From: Pavel Sviderski Date: Wed, 4 Dec 2024 15:37:52 +1000 Subject: [PATCH] fix filter unmarshalling for list containers --- internal/machine/docker/client.go | 4 ++++ internal/machine/docker/server.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/internal/machine/docker/client.go b/internal/machine/docker/client.go index 79352361..8d60df46 100644 --- a/internal/machine/docker/client.go +++ b/internal/machine/docker/client.go @@ -126,6 +126,10 @@ func (c *Client) ListContainers(ctx context.Context, opts container.ListOptions) machineContainers := make([]MachineContainers, len(resp.Messages)) for i, msg := range resp.Messages { machineContainers[i].Metadata = msg.Metadata + if msg.Metadata != nil && msg.Metadata.Error != "" { + continue + } + if err = json.Unmarshal(msg.Containers, &machineContainers[i].Containers); err != nil { return nil, fmt.Errorf("unmarshal containers: %w", err) } diff --git a/internal/machine/docker/server.go b/internal/machine/docker/server.go index 64317365..fcd66aa5 100644 --- a/internal/machine/docker/server.go +++ b/internal/machine/docker/server.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" @@ -87,6 +88,20 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque if err := json.Unmarshal(req.Options, &opts); err != nil { return nil, status.Errorf(codes.InvalidArgument, "unmarshal options: %v", err) } + + // Handle filters separately because they implement custom JSON unmarshalling. + var raw map[string]json.RawMessage + if err := json.Unmarshal(req.Options, &raw); err != nil { + return nil, status.Errorf(codes.InvalidArgument, "unmarshal options to raw map: %v", err) + } + + if filtersBytes, ok := raw["Filters"]; ok { + args, err := filters.FromJSON(string(filtersBytes)) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "unmarshal filters: %v", err) + } + opts.Filters = args + } } containers, err := s.client.ContainerList(ctx, opts)