@@ -16,11 +16,14 @@ import (
16
16
"syscall"
17
17
"time"
18
18
19
+ "github.com/docker/docker/api/types"
20
+ "github.com/docker/docker/api/types/network"
19
21
"github.com/docker/docker/client"
20
22
"github.com/pkg/errors"
21
23
"github.com/rs/xid"
22
24
23
25
"gitlab.com/postgres-ai/database-lab/v2/pkg/config"
26
+ "gitlab.com/postgres-ai/database-lab/v2/pkg/config/global"
24
27
"gitlab.com/postgres-ai/database-lab/v2/pkg/estimator"
25
28
"gitlab.com/postgres-ai/database-lab/v2/pkg/log"
26
29
"gitlab.com/postgres-ai/database-lab/v2/pkg/observer"
@@ -33,6 +36,7 @@ import (
33
36
"gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/resources"
34
37
"gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/runners"
35
38
"gitlab.com/postgres-ai/database-lab/v2/pkg/srv"
39
+ "gitlab.com/postgres-ai/database-lab/v2/pkg/util/networks"
36
40
"gitlab.com/postgres-ai/database-lab/v2/version"
37
41
)
38
42
@@ -67,6 +71,63 @@ func main() {
67
71
ctx , cancel := context .WithCancel (context .Background ())
68
72
defer cancel ()
69
73
74
+ hostname := os .Getenv ("HOSTNAME" )
75
+ if hostname == "" {
76
+ log .Err ("hostname is empty" )
77
+ }
78
+
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
+ })
90
+ if err != nil {
91
+ log .Errf (err .Error ())
92
+ return
93
+ }
94
+
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
+ }()
130
+
70
131
// Create a platform service to make requests to Platform.
71
132
platformSvc , err := platform .New (ctx , cfg .Platform )
72
133
if err != nil {
@@ -95,7 +156,7 @@ func main() {
95
156
}
96
157
97
158
// Create a cloning service to provision new clones.
98
- provisionSvc , err := provision .New (ctx , & cfg .Provision , dbCfg , dockerCLI , pm )
159
+ provisionSvc , err := provision .New (ctx , & cfg .Provision , dbCfg , dockerCLI , pm , internalNetwork . ID )
99
160
if err != nil {
100
161
log .Errf (errors .WithMessage (err , `error in the "provision" section of the config` ).Error ())
101
162
}
@@ -113,7 +174,7 @@ func main() {
113
174
114
175
go removeObservingClones (obsCh , obs )
115
176
116
- server := srv .NewServer (& cfg .Server , obs , cloningSvc , platformSvc , dockerCLI , est )
177
+ server := srv .NewServer (& cfg .Server , & cfg . Global , obs , cloningSvc , platformSvc , dockerCLI , est , pm )
117
178
118
179
reloadCh := setReloadListener ()
119
180
@@ -220,7 +281,7 @@ func setShutdownListener() chan os.Signal {
220
281
return c
221
282
}
222
283
223
- func shutdownDatabaseLabEngine (ctx context.Context , dockerCLI * client.Client , global config. Global , fsp * resources.Pool ) {
284
+ func shutdownDatabaseLabEngine (ctx context.Context , dockerCLI * client.Client , global global. Config , fsp * resources.Pool ) {
224
285
log .Msg ("Stopping control containers" )
225
286
226
287
if err := cont .StopControlContainers (ctx , dockerCLI , global .InstanceID , fsp .DataDir ()); err != nil {
0 commit comments