Skip to content

Commit 7c45e3d

Browse files
committed
fix: include filtered containers in network inspect
Signed-off-by: Arjun Raja Yogidas <[email protected]>
1 parent 356ed67 commit 7c45e3d

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

internal/backend/containerd.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type ContainerdClient interface {
3333
GetClient() *containerd.Client
3434
GetContainerStatus(ctx context.Context, c containerd.Container) containerd.ProcessStatus
3535
SearchContainer(ctx context.Context, searchText string) (containers []containerd.Container, err error)
36+
GetContainers(ctx context.Context, filters ...string) (containers []containerd.Container, err error)
3637
GetImage(ctx context.Context, ref string) (containerd.Image, error)
3738
SearchImage(ctx context.Context, searchText string) ([]images.Image, error)
3839
ParsePlatform(platform string) (ocispec.Platform, error)
@@ -110,6 +111,12 @@ func (w *ContainerdClientWrapper) SearchContainer(ctx context.Context, searchTex
110111
return containers, err
111112
}
112113

114+
// GetContainers returns the list of containers that match the given filters.
115+
func (w *ContainerdClientWrapper) GetContainers(ctx context.Context, filters ...string) (containers []containerd.Container, err error) {
116+
containers, err = w.client.Containers(ctx, filters...)
117+
return containers, err
118+
}
119+
113120
// GetImage returns an image with given reference.
114121
func (w *ContainerdClientWrapper) GetImage(ctx context.Context, ref string) (containerd.Image, error) {
115122
return w.client.GetImage(ctx, ref)

internal/backend/network.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ package backend
66
import (
77
"context"
88
"encoding/json"
9+
"fmt"
910

11+
containerd "github.com/containerd/containerd/v2/client"
1012
"github.com/containerd/nerdctl/v2/pkg/api/types"
13+
"github.com/containerd/nerdctl/v2/pkg/containerinspector"
1114
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
1215
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/native"
16+
"github.com/containerd/nerdctl/v2/pkg/labels"
1317
"github.com/containerd/nerdctl/v2/pkg/netutil"
1418
"github.com/containernetworking/cni/libcni"
1519
cnitypes "github.com/containernetworking/cni/pkg/types"
@@ -54,11 +58,18 @@ func (w *NerdctlWrapper) RemoveNetwork(networkConfig *netutil.NetworkConfig) err
5458
}
5559

5660
func (w *NerdctlWrapper) InspectNetwork(ctx context.Context, networkConfig *netutil.NetworkConfig) (*dockercompat.Network, error) {
61+
// Get containers associated with this network
62+
containers, err := getContainersFromNetConfig(ctx, networkConfig, w.clientWrapper)
63+
if err != nil {
64+
return nil, fmt.Errorf("failed to get containers for network: %w", err)
65+
}
66+
5767
network := &native.Network{
5868
CNI: json.RawMessage(networkConfig.Bytes),
5969
NerdctlID: networkConfig.NerdctlID,
6070
NerdctlLabels: networkConfig.NerdctlLabels,
6171
File: networkConfig.File,
72+
Containers: containers,
6273
}
6374
return dockercompat.NetworkFromNative(network)
6475
}
@@ -74,3 +85,27 @@ func (w *NerdctlWrapper) NetconfPath() string {
7485
func (w *NerdctlWrapper) Namespace() string {
7586
return w.netClient.Namespace
7687
}
88+
89+
// getContainersFromNetConfig returns containers associated with the given network
90+
func getContainersFromNetConfig(ctx context.Context, networkConfig *netutil.NetworkConfig, client ContainerdClient) ([]*native.Container, error) {
91+
filters := []string{fmt.Sprintf(`labels.%q~="\\\"%s\\\""`, labels.Networks, networkConfig.Name)}
92+
filteredContainers, err := client.GetContainers(ctx, filters...)
93+
if err != nil {
94+
return nil, err
95+
}
96+
97+
var containers []*native.Container
98+
for _, container := range filteredContainers {
99+
nativeContainer, err := containerinspector.Inspect(ctx, container)
100+
if err != nil {
101+
continue
102+
}
103+
if nativeContainer.Process == nil || nativeContainer.Process.Status.Status != containerd.Running {
104+
continue
105+
}
106+
107+
containers = append(containers, nativeContainer)
108+
}
109+
110+
return containers, nil
111+
}

mocks/mocks_backend/containerdclient.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)