Skip to content

Commit bceb3c1

Browse files
authored
detect active endpoint trying to remove network and skip with a warning (docker#10555)
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent a14abb9 commit bceb3c1

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

pkg/compose/down.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -181,29 +181,43 @@ func (s *composeService) removeNetwork(ctx context.Context, name string, w progr
181181
eventName := fmt.Sprintf("Network %s", name)
182182
w.Event(progress.RemovingEvent(eventName))
183183

184-
var removed int
184+
var found int
185185
for _, net := range networks {
186-
if net.Name == name {
187-
if err := s.apiClient().NetworkRemove(ctx, net.ID); err != nil {
188-
if errdefs.IsNotFound(err) {
189-
continue
190-
}
191-
w.Event(progress.ErrorEvent(eventName))
192-
return errors.Wrapf(err, fmt.Sprintf("failed to remove network %s", name))
186+
if net.Name != name {
187+
continue
188+
}
189+
network, err := s.apiClient().NetworkInspect(ctx, net.ID, moby.NetworkInspectOptions{})
190+
if errdefs.IsNotFound(err) {
191+
w.Event(progress.NewEvent(eventName, progress.Warning, "No resource found to remove"))
192+
return nil
193+
}
194+
if err != nil {
195+
return err
196+
}
197+
if len(network.Containers) > 0 {
198+
w.Event(progress.NewEvent(eventName, progress.Warning, "Resource is still in use"))
199+
found++
200+
continue
201+
}
202+
203+
if err := s.apiClient().NetworkRemove(ctx, net.ID); err != nil {
204+
if errdefs.IsNotFound(err) {
205+
continue
193206
}
194-
removed++
207+
w.Event(progress.ErrorEvent(eventName))
208+
return errors.Wrapf(err, fmt.Sprintf("failed to remove network %s", name))
195209
}
210+
w.Event(progress.RemovedEvent(eventName))
211+
found++
196212
}
197213

198-
if removed == 0 {
214+
if found == 0 {
199215
// in practice, it's extremely unlikely for this to ever occur, as it'd
200216
// mean the network was present when we queried at the start of this
201217
// method but was then deleted by something else in the interim
202-
w.Event(progress.NewEvent(eventName, progress.Done, "Warning: No resource found to remove"))
218+
w.Event(progress.NewEvent(eventName, progress.Warning, "No resource found to remove"))
203219
return nil
204220
}
205-
206-
w.Event(progress.RemovedEvent(eventName))
207221
return nil
208222
}
209223

pkg/compose/down_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ func TestDown(t *testing.T) {
7979
{ID: "abc123", Name: "myProject_default"},
8080
{ID: "def456", Name: "myProject_default"},
8181
}, nil)
82+
api.EXPECT().NetworkInspect(gomock.Any(), "abc123", gomock.Any()).Return(moby.NetworkResource{ID: "abc123"}, nil)
83+
api.EXPECT().NetworkInspect(gomock.Any(), "def456", gomock.Any()).Return(moby.NetworkResource{ID: "def456"}, nil)
8284
api.EXPECT().NetworkRemove(gomock.Any(), "abc123").Return(nil)
8385
api.EXPECT().NetworkRemove(gomock.Any(), "def456").Return(nil)
8486

@@ -118,6 +120,7 @@ func TestDownRemoveOrphans(t *testing.T) {
118120
api.EXPECT().NetworkList(gomock.Any(), moby.NetworkListOptions{
119121
Filters: filters.NewArgs(filters.Arg("name", "myProject_default")),
120122
}).Return([]moby.NetworkResource{{ID: "abc123", Name: "myProject_default"}}, nil)
123+
api.EXPECT().NetworkInspect(gomock.Any(), "abc123", gomock.Any()).Return(moby.NetworkResource{ID: "abc123"}, nil)
121124
api.EXPECT().NetworkRemove(gomock.Any(), "abc123").Return(nil)
122125

123126
err := tested.Down(context.Background(), strings.ToLower(testProject), compose.DownOptions{RemoveOrphans: true})

0 commit comments

Comments
 (0)