Skip to content

Commit 8fc3a1e

Browse files
fix: restore update network settings for dockercompat (runfinch#286)
Signed-off-by: shubhranshu153 <[email protected]>
1 parent beee954 commit 8fc3a1e

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

internal/service/container/inspect.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,18 @@ package container
55

66
import (
77
"context"
8+
"encoding/json"
89
"fmt"
10+
"strconv"
11+
"strings"
912

13+
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
14+
"github.com/containerd/nerdctl/v2/pkg/labels"
1015
"github.com/runfinch/finch-daemon/api/types"
1116
)
1217

18+
const networkPrefix = "unknown-eth"
19+
1320
func (s *service) Inspect(ctx context.Context, cid string, sizeFlag bool) (*types.Container, error) {
1421
c, err := s.getContainer(ctx, cid)
1522
if err != nil {
@@ -58,6 +65,12 @@ func (s *service) Inspect(ctx context.Context, cid string, sizeFlag bool) (*type
5865
Labels: inspect.Config.Labels,
5966
}
6067

68+
l, err := c.Labels(ctx)
69+
if err != nil {
70+
return nil, fmt.Errorf("failed to get container labels: %s", err)
71+
}
72+
updateNetworkSettings(ctx, cont.NetworkSettings, l)
73+
6174
// make sure it passes the default time value for time fields otherwise the goclient fails.
6275
if inspect.Created == "" {
6376
cont.Created = "0001-01-01T00:00:00Z"
@@ -69,3 +82,46 @@ func (s *service) Inspect(ctx context.Context, cid string, sizeFlag bool) (*type
6982

7083
return &cont, nil
7184
}
85+
86+
// updateNetworkSettings updates the settings in the network to match that
87+
// of docker as docker identifies networks by their name in "NetworkSettings",
88+
// but nerdctl uses a sequential ordering "unknown-eth0", "unknown-eth1",...
89+
// we use container labels to find corresponding name for each network in "NetworkSettings".
90+
func updateNetworkSettings(ctx context.Context, ns *dockercompat.NetworkSettings, labels map[string]string) error {
91+
if ns != nil && ns.Networks != nil {
92+
networks := map[string]*dockercompat.NetworkEndpointSettings{}
93+
94+
for network, settings := range ns.Networks {
95+
networkName := getNetworkName(labels, network)
96+
networks[networkName] = settings
97+
}
98+
ns.Networks = networks
99+
}
100+
return nil
101+
}
102+
103+
// getNetworkName gets network name from container labels using the index specified by the network prefix.
104+
// returns the default prefix if network name was not found.
105+
func getNetworkName(lab map[string]string, network string) string {
106+
namesJSON, ok := lab[labels.Networks]
107+
if !ok {
108+
return network
109+
}
110+
var names []string
111+
if err := json.Unmarshal([]byte(namesJSON), &names); err != nil {
112+
return network
113+
}
114+
115+
if strings.HasPrefix(network, networkPrefix) {
116+
prefixLen := len(networkPrefix)
117+
index, err := strconv.ParseUint(network[prefixLen:], 10, 64)
118+
if err != nil {
119+
return network
120+
}
121+
if int(index) < len(names) {
122+
return names[index]
123+
}
124+
}
125+
126+
return network
127+
}

internal/service/container/inspect_test.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ var _ = Describe("Container Inspect API ", func() {
8686

8787
ncClient.EXPECT().InspectContainer(gomock.Any(), con, sizeFlag).Return(
8888
&inspect, nil)
89-
89+
90+
con.EXPECT().Labels(gomock.Any()).Return(nil, nil)
9091
result, err := service.Inspect(ctx, cid, sizeFlag)
92+
9193
Expect(*result).Should(Equal(ret))
9294
Expect(err).Should(BeNil())
9395
})
@@ -153,7 +155,8 @@ var _ = Describe("Container Inspect API ", func() {
153155

154156
ncClient.EXPECT().InspectContainer(gomock.Any(), con, sizeFlag).Return(
155157
&inspectWithSize, nil)
156-
158+
159+
con.EXPECT().Labels(gomock.Any()).Return(nil, nil)
157160
result, err := service.Inspect(ctx, cid, sizeFlag)
158161
Expect(err).Should(BeNil())
159162
Expect(result.SizeRw).ShouldNot(BeNil())
@@ -170,7 +173,8 @@ var _ = Describe("Container Inspect API ", func() {
170173

171174
ncClient.EXPECT().InspectContainer(gomock.Any(), con, sizeFlag).Return(
172175
&inspect, nil)
173-
176+
177+
con.EXPECT().Labels(gomock.Any()).Return(nil, nil)
174178
result, err := service.Inspect(ctx, cid, sizeFlag)
175179
Expect(err).Should(BeNil())
176180
Expect(result.SizeRw).Should(BeZero())

internal/service/container/list.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ func (s *service) List(ctx context.Context, listOpts ncTypes.ContainerListOption
4242
Mounts: ci.Mounts,
4343
}
4444

45+
l, err := c.Labels(ctx)
46+
if err != nil {
47+
return nil, fmt.Errorf("failed to get container labels: %s", err)
48+
}
49+
updateNetworkSettings(ctx, cli.NetworkSettings, l)
50+
4551
containers = append(containers, cli)
4652
}
4753
return containers, nil

0 commit comments

Comments
 (0)