Skip to content

Commit 874e6d5

Browse files
committed
Merge branch '276-clean-up-networks' into 'master'
fix: clean up a custom Docker network on DLE failure (#276) Closes #276 See merge request postgres-ai/database-lab!327
2 parents 6e8ce23 + ab9b252 commit 874e6d5

File tree

2 files changed

+81
-67
lines changed

2 files changed

+81
-67
lines changed

cmd/database-lab/main.go

+17-67
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import (
1616
"syscall"
1717
"time"
1818

19-
"github.com/docker/docker/api/types"
20-
"github.com/docker/docker/api/types/network"
2119
"github.com/docker/docker/client"
2220
"github.com/pkg/errors"
2321
"github.com/rs/xid"
@@ -76,57 +74,13 @@ func main() {
7674
log.Err("hostname is empty")
7775
}
7876

79-
networkID := "network_" + instanceID
80-
81-
internalNetwork, err := dockerCLI.NetworkCreate(ctx, networkID, types.NetworkCreate{
82-
Labels: map[string]string{
83-
"instance": instanceID,
84-
"app": networks.DLEApp,
85-
"type": networks.InternalType,
86-
},
87-
Attachable: true,
88-
Internal: true,
89-
})
77+
internalNetwork, err := networks.Setup(ctx, dockerCLI, instanceID, hostname)
9078
if err != nil {
9179
log.Errf(err.Error())
9280
return
9381
}
9482

95-
defer func() {
96-
networkInspect, err := dockerCLI.NetworkInspect(context.Background(), internalNetwork.ID, types.NetworkInspectOptions{})
97-
if err != nil {
98-
log.Errf(err.Error())
99-
return
100-
}
101-
102-
for _, resource := range networkInspect.Containers {
103-
log.Dbg("Disconnecting container: ", resource.Name)
104-
105-
if err := dockerCLI.NetworkDisconnect(context.Background(), internalNetwork.ID, resource.Name, true); err != nil {
106-
log.Errf(err.Error())
107-
return
108-
}
109-
}
110-
111-
if err := dockerCLI.NetworkRemove(context.Background(), internalNetwork.ID); err != nil {
112-
log.Errf(err.Error())
113-
return
114-
}
115-
}()
116-
117-
log.Dbg("New network: ", internalNetwork.ID)
118-
119-
if err := dockerCLI.NetworkConnect(ctx, internalNetwork.ID, hostname, &network.EndpointSettings{}); err != nil {
120-
log.Errf(err.Error())
121-
return
122-
}
123-
124-
defer func() {
125-
if err := dockerCLI.NetworkDisconnect(context.Background(), internalNetwork.ID, hostname, true); err != nil {
126-
log.Errf(err.Error())
127-
return
128-
}
129-
}()
83+
defer networks.Stop(dockerCLI, internalNetwork.ID)
13084

13185
// Create a platform service to make requests to Platform.
13286
platformSvc, err := platform.New(ctx, cfg.Platform)
@@ -181,23 +135,10 @@ func main() {
181135
go removeObservingClones(obsCh, obs)
182136

183137
server := srv.NewServer(&cfg.Server, &cfg.Global, obs, cloningSvc, platformSvc, dockerCLI, est, pm)
184-
185-
reloadCh := setReloadListener()
186-
187-
go func() {
188-
for range reloadCh {
189-
log.Msg("Reloading configuration")
190-
191-
if err := reloadConfig(ctx, instanceID, provisionSvc, retrievalSvc, pm, cloningSvc, platformSvc, est, server); err != nil {
192-
log.Err("Failed to reload configuration", err)
193-
}
194-
195-
log.Msg("Configuration has been reloaded")
196-
}
197-
}()
198-
199138
shutdownCh := setShutdownListener()
200139

140+
go setReloadListener(ctx, instanceID, provisionSvc, retrievalSvc, pm, cloningSvc, platformSvc, est, server)
141+
201142
server.InitHandlers()
202143

203144
go func() {
@@ -273,11 +214,20 @@ func reloadConfig(ctx context.Context, instanceID string, provisionSvc *provisio
273214
return nil
274215
}
275216

276-
func setReloadListener() chan os.Signal {
277-
c := make(chan os.Signal, 1)
278-
signal.Notify(c, syscall.SIGHUP)
217+
func setReloadListener(ctx context.Context, instanceID string, provisionSvc *provision.Provisioner, retrievalSvc *retrieval.Retrieval,
218+
pm *pool.Manager, cloningSvc cloning.Cloning, platformSvc *platform.Service, est *estimator.Estimator, server *srv.Server) {
219+
reloadCh := make(chan os.Signal, 1)
220+
signal.Notify(reloadCh, syscall.SIGHUP)
279221

280-
return c
222+
for range reloadCh {
223+
log.Msg("Reloading configuration")
224+
225+
if err := reloadConfig(ctx, instanceID, provisionSvc, retrievalSvc, pm, cloningSvc, platformSvc, est, server); err != nil {
226+
log.Err("Failed to reload configuration", err)
227+
}
228+
229+
log.Msg("Configuration has been reloaded")
230+
}
281231
}
282232

283233
func setShutdownListener() chan os.Signal {

pkg/util/networks/networks.go

+64
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,74 @@
55
// Package networks describes custom network elements.
66
package networks
77

8+
import (
9+
"context"
10+
11+
"github.com/docker/docker/api/types"
12+
"github.com/docker/docker/api/types/network"
13+
"github.com/docker/docker/client"
14+
15+
"gitlab.com/postgres-ai/database-lab/v2/pkg/log"
16+
)
17+
818
const (
919
// DLEApp contains name of the Database Lab Engine network.
1020
DLEApp = "DLE"
1121

1222
// InternalType contains name of the internal network type.
1323
InternalType = "internal"
24+
25+
// networkPrefix defines a distinctive prefix for internal DLE networks.
26+
networkPrefix = "network_"
1427
)
28+
29+
// Setup creates a new internal Docker network and connects container to it.
30+
func Setup(ctx context.Context, dockerCLI *client.Client, instanceID, containerID string) (*types.NetworkCreateResponse, error) {
31+
networkID := networkPrefix + instanceID
32+
33+
internalNetwork, err := dockerCLI.NetworkCreate(ctx, networkID, types.NetworkCreate{
34+
Labels: map[string]string{
35+
"instance": instanceID,
36+
"app": DLEApp,
37+
"type": InternalType,
38+
},
39+
Attachable: true,
40+
Internal: true,
41+
})
42+
if err != nil {
43+
return nil, err
44+
}
45+
46+
log.Dbg("New network: ", internalNetwork.ID)
47+
48+
if err := dockerCLI.NetworkConnect(ctx, internalNetwork.ID, containerID, &network.EndpointSettings{}); err != nil {
49+
return nil, err
50+
}
51+
52+
return &internalNetwork, nil
53+
}
54+
55+
// Stop disconnect all containers from the network and removes it.
56+
func Stop(dockerCLI *client.Client, internalNetworkID string) {
57+
networkInspect, err := dockerCLI.NetworkInspect(context.Background(), internalNetworkID, types.NetworkInspectOptions{})
58+
if err != nil {
59+
log.Errf(err.Error())
60+
return
61+
}
62+
63+
for _, resource := range networkInspect.Containers {
64+
log.Dbg("Disconnecting container: ", resource.Name)
65+
66+
if err := dockerCLI.NetworkDisconnect(context.Background(), internalNetworkID, resource.Name, true); err != nil {
67+
log.Errf(err.Error())
68+
return
69+
}
70+
71+
log.Dbg("Container has been disconnected: ", resource.Name)
72+
}
73+
74+
if err := dockerCLI.NetworkRemove(context.Background(), internalNetworkID); err != nil {
75+
log.Errf(err.Error())
76+
return
77+
}
78+
}

0 commit comments

Comments
 (0)