55// TODO(anatoly):
66// - Validate configs in all components.
77// - Tests.
8- // - Don't kill clones on shutdown/start.
98
109package main
1110
@@ -18,7 +17,6 @@ import (
1817
1918 "github.com/docker/docker/client"
2019 "github.com/pkg/errors"
21- "github.com/rs/xid"
2220
2321 "gitlab.com/postgres-ai/database-lab/v2/pkg/config"
2422 "gitlab.com/postgres-ai/database-lab/v2/pkg/config/global"
@@ -35,25 +33,20 @@ import (
3533 "gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/runners"
3634 "gitlab.com/postgres-ai/database-lab/v2/pkg/srv"
3735 "gitlab.com/postgres-ai/database-lab/v2/pkg/util/networks"
38- "gitlab.com/postgres-ai/database-lab/v2/version"
3936)
4037
4138const (
4239 shutdownTimeout = 30 * time .Second
4340)
4441
4542func main () {
46- log .Msg ("Database Lab version: " , version .GetVersion ())
47-
48- instanceID := xid .New ().String ()
49-
50- log .Msg ("Database Lab Instance ID:" , instanceID )
51-
52- cfg , err := config .LoadConfiguration (instanceID )
43+ cfg , err := config .LoadConfiguration ()
5344 if err != nil {
5445 log .Fatal (errors .WithMessage (err , "failed to parse config" ))
5546 }
5647
48+ log .Msg ("Database Lab Instance ID:" , cfg .Global .InstanceID )
49+
5750 runner := runners .NewLocalRunner (cfg .Provision .UseSudo )
5851
5952 pm := pool .NewPoolManager (& cfg .PoolManager , runner )
@@ -74,13 +67,13 @@ func main() {
7467 log .Err ("hostname is empty" )
7568 }
7669
77- internalNetwork , err := networks .Setup (ctx , dockerCLI , instanceID , hostname )
70+ internalNetworkID , err := networks .Setup (ctx , dockerCLI , cfg . Global . InstanceID , hostname )
7871 if err != nil {
7972 log .Errf (err .Error ())
8073 return
8174 }
8275
83- defer networks .Stop (dockerCLI , internalNetwork . ID )
76+ defer networks .Stop (dockerCLI , internalNetworkID , hostname )
8477
8578 // Create a platform service to make requests to Platform.
8679 platformSvc , err := platform .New (ctx , cfg .Platform )
@@ -89,6 +82,11 @@ func main() {
8982 return
9083 }
9184
85+ dbCfg := & resources.DB {
86+ Username : cfg .Global .Database .User (),
87+ DBName : cfg .Global .Database .Name (),
88+ }
89+
9290 emergencyShutdown := func () {
9391 cancel ()
9492
@@ -104,40 +102,37 @@ func main() {
104102 if err := retrievalSvc .Run (ctx ); err != nil {
105103 log .Err ("Failed to run the data retrieval service:" , err )
106104 emergencyShutdown ()
105+
107106 return
108107 }
109108
110109 defer retrievalSvc .Stop ()
111110
112- dbCfg := & resources.DB {
113- Username : cfg .Global .Database .User (),
114- DBName : cfg .Global .Database .Name (),
115- }
116-
117111 // Create a cloning service to provision new clones.
118- provisionSvc , err := provision .New (ctx , & cfg .Provision , dbCfg , dockerCLI , pm , internalNetwork . ID )
112+ provisionSvc , err := provision .New (ctx , & cfg .Provision , dbCfg , dockerCLI , pm , internalNetworkID )
119113 if err != nil {
120114 log .Errf (errors .WithMessage (err , `error in the "provision" section of the config` ).Error ())
121115 }
122116
123- obsCh := make (chan string , 1 )
117+ observingChan := make (chan string , 1 )
124118
125- cloningSvc := cloning .NewBase (& cfg .Cloning , provisionSvc , obsCh )
119+ cloningSvc := cloning .NewBase (& cfg .Cloning , provisionSvc , observingChan )
126120 if err = cloningSvc .Run (ctx ); err != nil {
127121 log .Err (err )
128122 emergencyShutdown ()
123+
129124 return
130125 }
131126
132127 obs := observer .NewObserver (dockerCLI , & cfg .Observer , platformSvc .Client , pm )
133128 est := estimator .NewEstimator (& cfg .Estimator )
134129
135- go removeObservingClones (obsCh , obs )
130+ go removeObservingClones (observingChan , obs )
136131
137132 server := srv .NewServer (& cfg .Server , & cfg .Global , obs , cloningSvc , platformSvc , dockerCLI , est , pm )
138133 shutdownCh := setShutdownListener ()
139134
140- go setReloadListener (ctx , instanceID , provisionSvc , retrievalSvc , pm , cloningSvc , platformSvc , est , server )
135+ go setReloadListener (ctx , provisionSvc , retrievalSvc , pm , cloningSvc , platformSvc , est , server )
141136
142137 server .InitHandlers ()
143138
@@ -159,11 +154,12 @@ func main() {
159154 }
160155
161156 shutdownDatabaseLabEngine (shutdownCtx , dockerCLI , cfg .Global , pm .Active ().Pool ())
157+ cloningSvc .SaveClonesState ()
162158}
163159
164- func reloadConfig (ctx context.Context , instanceID string , provisionSvc * provision.Provisioner , retrievalSvc * retrieval.Retrieval ,
160+ func reloadConfig (ctx context.Context , provisionSvc * provision.Provisioner , retrievalSvc * retrieval.Retrieval ,
165161 pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , server * srv.Server ) error {
166- cfg , err := config .LoadConfiguration (instanceID )
162+ cfg , err := config .LoadConfiguration ()
167163 if err != nil {
168164 return err
169165 }
@@ -200,15 +196,15 @@ func reloadConfig(ctx context.Context, instanceID string, provisionSvc *provisio
200196 return nil
201197}
202198
203- func setReloadListener (ctx context.Context , instanceID string , provisionSvc * provision.Provisioner , retrievalSvc * retrieval.Retrieval ,
199+ func setReloadListener (ctx context.Context , provisionSvc * provision.Provisioner , retrievalSvc * retrieval.Retrieval ,
204200 pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , server * srv.Server ) {
205201 reloadCh := make (chan os.Signal , 1 )
206202 signal .Notify (reloadCh , syscall .SIGHUP )
207203
208204 for range reloadCh {
209205 log .Msg ("Reloading configuration" )
210206
211- if err := reloadConfig (ctx , instanceID , provisionSvc , retrievalSvc , pm , cloningSvc , platformSvc , est , server ); err != nil {
207+ if err := reloadConfig (ctx , provisionSvc , retrievalSvc , pm , cloningSvc , platformSvc , est , server ); err != nil {
212208 log .Err ("Failed to reload configuration" , err )
213209 }
214210
0 commit comments