@@ -3,21 +3,19 @@ package main
3
3
import (
4
4
"archive/tar"
5
5
"bufio"
6
- "encoding/json"
7
6
"flag"
8
7
"fmt"
9
- "github.com/samalba/ dockerclient"
8
+ "github.com/fsouza/go- dockerclient"
10
9
"io"
11
10
"log"
12
11
"os"
13
12
"path"
14
13
"path/filepath"
15
14
"strings"
16
- // "time"
17
15
)
18
16
19
17
var cfg struct {
20
- Docker * dockerclient. DockerClient
18
+ Docker * docker. Client
21
19
Paths struct {
22
20
Postgres string
23
21
Dtmd string
@@ -60,7 +58,7 @@ func get_labels(container_id string) map[string]string {
60
58
return info .Config .Labels
61
59
}
62
60
63
- func get_containers (morelabels ... string ) []dockerclient. Container {
61
+ func get_containers (morelabels ... string ) []docker. APIContainers {
64
62
labellist := make ([]string , len (labels ) + len (morelabels ))
65
63
i := 0
66
64
for k , v := range labels {
@@ -72,12 +70,13 @@ func get_containers(morelabels ...string) []dockerclient.Container {
72
70
i += 1
73
71
}
74
72
filters := map [string ][]string {"label" : labellist }
75
- filterstr , err := json .Marshal (filters )
76
- if err != nil {
77
- log .Fatal (err )
78
- }
79
73
80
- containers , err := cfg .Docker .ListContainers (true , true , string (filterstr ))
74
+ opts := docker.ListContainersOptions {
75
+ All : true ,
76
+ Size : false ,
77
+ Filters : filters ,
78
+ }
79
+ containers , err := cfg .Docker .ListContainers (opts )
81
80
if err != nil {
82
81
log .Fatal (err )
83
82
}
@@ -86,25 +85,22 @@ func get_containers(morelabels ...string) []dockerclient.Container {
86
85
}
87
86
88
87
func get_ip (container_id string ) (string , bool ) {
89
- info , err := cfg .Docker .InspectContainer (container_id )
88
+ cont , err := cfg .Docker .InspectContainer (container_id )
90
89
if err != nil {
91
90
log .Fatal (err )
92
91
}
93
92
94
- net , err := cfg .Docker .InspectNetwork ("contain" )
95
- if err != nil {
96
- log .Fatal (err )
97
- }
93
+ ip := cont .NetworkSettings .Networks ["contain" ].IPAddress
98
94
99
- return net . Containers [ container_id ]. IPv4Address , info .State .Running
95
+ return ip , cont .State .Running
100
96
}
101
97
102
98
func status () {
103
99
log .Println ("--- status" )
104
100
105
101
for _ , c := range get_containers () {
106
102
name := c .Names [0 ]
107
- ip , running := get_ip (c .Id )
103
+ ip , running := get_ip (c .ID )
108
104
if running {
109
105
fmt .Printf ("%s (%s)\n " , name , ip )
110
106
} else {
@@ -206,23 +202,25 @@ func open_as_tar(paths map[string]string) *io.PipeReader {
206
202
func build_image () {
207
203
log .Println ("--- build" )
208
204
209
- reader := open_as_tar (map [string ]string {
205
+ tarstream := open_as_tar (map [string ]string {
210
206
"Dockerfile" : "Dockerfile" ,
211
207
cfg .Paths .Postgres : "postgres" ,
212
208
cfg .Paths .Dtmd : "dtmd" ,
213
209
cfg .Paths .DtmBench : "dtmbench" ,
214
210
})
215
- defer reader .Close ()
211
+ defer tarstream .Close ()
216
212
217
- config := & dockerclient.BuildImage {
218
- Context : reader ,
219
- RepoName : "postgrespro" ,
220
- SuppressOutput : false ,
221
- ForceRemove : true ,
222
- Remove : true ,
213
+ buildreader , buildstream := io .Pipe ()
214
+ config := docker.BuildImageOptions {
215
+ InputStream : tarstream ,
216
+ OutputStream : buildstream ,
217
+ Name : "postgrespro" ,
218
+ SuppressOutput : false ,
219
+ ForceRmTmpContainer : true ,
220
+ RmTmpContainer : true ,
223
221
}
224
222
225
- buildreader , err := cfg .Docker .BuildImage (config )
223
+ err := cfg .Docker .BuildImage (config )
226
224
if err != nil {
227
225
log .Fatal (err )
228
226
}
@@ -237,31 +235,48 @@ func build_image() {
237
235
}
238
236
}
239
237
240
- func create_bulk_containers (config dockerclient.ContainerConfig , role string , num int ) {
238
+ func create_bulk_containers (image string , netname string , role string , num int ) {
239
+ clabels := make (map [string ]string )
240
+ for k , v := range labels {
241
+ clabels [k ] = v
242
+ }
243
+ clabels ["role" ] = role
244
+
241
245
for i := 0 ; i < num ; i ++ {
242
- config .Labels ["role" ] = role
243
246
name := fmt .Sprintf ("%s%d" , role , i )
244
- config .Hostname = name
245
- id , err := cfg .Docker .CreateContainer (& config , name , nil )
247
+ opts := docker.CreateContainerOptions {
248
+ Name : name ,
249
+ Config : & docker.Config {
250
+ Hostname : name ,
251
+ Labels : clabels ,
252
+ Tty : true ,
253
+ Image : image ,
254
+ },
255
+ HostConfig : & docker.HostConfig {
256
+ Privileged : true ,
257
+ NetworkMode : netname ,
258
+ },
259
+ }
260
+ c , err := cfg .Docker .CreateContainer (opts )
246
261
if err != nil {
247
262
log .Fatal (err )
248
263
}
249
264
250
- log .Printf ("created container %s (%s...)\n " , name , id [:8 ])
265
+ log .Printf ("created container %s (%s...)\n " , name , c . ID [:8 ])
251
266
}
252
267
}
253
268
254
269
func create_network (name string ) {
255
- netconfig := dockerclient. NetworkCreate {
270
+ opts := docker. CreateNetworkOptions {
256
271
Name : name ,
257
272
CheckDuplicate : true ,
258
273
Driver : "bridge" ,
259
274
}
260
- response , err := cfg .Docker .CreateNetwork (& netconfig )
275
+ net , err := cfg .Docker .CreateNetwork (opts )
261
276
if err != nil {
262
277
log .Fatal (err )
263
278
}
264
- log .Printf ("created network %s (%s...)\n " , name , response .ID [:8 ])
279
+ log .Printf ("created network %s (%s...)\n " , name , net .ID [:8 ])
265
280
}
266
281
267
282
func remove_network (name string ) {
@@ -275,38 +290,26 @@ func remove_network(name string) {
275
290
func create_containers () {
276
291
log .Println ("--- create" )
277
292
293
+ image := "postgrespro:latest"
278
294
netname := "contain"
279
295
create_network (netname )
280
296
281
- clabels := make (map [string ]string )
282
- for k , v := range labels {
283
- clabels [k ] = v
284
- }
285
-
286
- config := dockerclient.ContainerConfig {
287
- Image : "postgrespro:latest" ,
288
- Tty : true ,
289
- Labels : clabels ,
290
- }
291
- config .HostConfig .Privileged = true
292
- config .HostConfig .NetworkMode = netname
293
-
294
- create_bulk_containers (config , "postgres" , cfg .NodesAs .Postgres )
295
- create_bulk_containers (config , "dtmd" , cfg .NodesAs .Dtmd )
296
- create_bulk_containers (config , "dtmbench" , cfg .NodesAs .DtmBench )
297
+ create_bulk_containers (image , netname , "postgres" , cfg .NodesAs .Postgres )
298
+ create_bulk_containers (image , netname , "dtmd" , cfg .NodesAs .Dtmd )
299
+ create_bulk_containers (image , netname , "dtmbench" , cfg .NodesAs .DtmBench )
297
300
}
298
301
299
302
func start_containers () {
300
303
log .Println ("--- up" )
301
304
302
305
for _ , c := range get_containers () {
303
306
name := c .Names [0 ]
304
- ip , running := get_ip (c .Id )
307
+ ip , running := get_ip (c .ID )
305
308
if running {
306
309
fmt .Printf ("%s (%s)\n " , name , ip )
307
310
} else {
308
311
log .Printf ("starting %s\n " , name )
309
- err := cfg .Docker .StartContainer (c .Id , nil )
312
+ err := cfg .Docker .StartContainer (c .ID , nil )
310
313
if err != nil {
311
314
log .Fatal (err )
312
315
}
@@ -319,10 +322,10 @@ func stop_containers() {
319
322
320
323
for _ , c := range get_containers () {
321
324
name := c .Names [0 ]
322
- ip , running := get_ip (c .Id )
325
+ ip , running := get_ip (c .ID )
323
326
if running {
324
327
log .Printf ("stopping %s (%s)\n " , name , ip )
325
- err := cfg .Docker .StopContainer (c .Id , 5 )
328
+ err := cfg .Docker .StopContainer (c .ID , 5 )
326
329
if err != nil {
327
330
log .Println (err )
328
331
}
@@ -335,25 +338,42 @@ func stop_containers() {
335
338
func run_in_container (container_id string , argv ... string ) {
336
339
log .Printf ("run in %s: %v" , container_id [:8 ], argv )
337
340
338
- config := dockerclient. ExecConfig {
339
- AttachStdin : true ,
341
+ createopts := docker. CreateExecOptions {
342
+ AttachStdin : false ,
340
343
AttachStdout : true ,
341
344
AttachStderr : true ,
342
345
Tty : true ,
343
346
Cmd : argv ,
344
347
Container : container_id ,
345
- Detach : false ,
346
348
}
347
349
348
- execid , err := cfg .Docker .ExecCreate ( & config )
350
+ exec , err := cfg .Docker .CreateExec ( createopts )
349
351
if err != nil {
350
352
log .Fatal (err )
351
353
}
352
354
353
- err = cfg .Docker .ExecStart (execid , & config )
355
+ reader , writer := io .Pipe ()
356
+
357
+ startopts := docker.StartExecOptions {
358
+ Detach : false ,
359
+ Tty : true ,
360
+ OutputStream : writer ,
361
+ ErrorStream : writer ,
362
+ }
363
+
364
+ err = cfg .Docker .StartExec (exec .ID , startopts )
354
365
if err != nil {
355
366
log .Fatal (err )
356
367
}
368
+
369
+ scanner := bufio .NewScanner (reader )
370
+ for scanner .Scan () {
371
+ fmt .Println (scanner .Text ())
372
+ }
373
+
374
+ if err := scanner .Err (); err != nil {
375
+ log .Fatal (err )
376
+ }
357
377
}
358
378
359
379
func initdb (container_id string ) {
@@ -365,7 +385,7 @@ func init_data() {
365
385
log .Println ("--- init" )
366
386
367
387
for _ , c := range get_containers ("role=postgres" ) {
368
- initdb (c .Id )
388
+ initdb (c .ID )
369
389
}
370
390
}
371
391
@@ -375,7 +395,14 @@ func clean_all() {
375
395
for _ , c := range get_containers () {
376
396
name := c .Names [0 ]
377
397
log .Printf ("removing %s\n " , name )
378
- err := cfg .Docker .RemoveContainer (c .Id , true , true )
398
+
399
+ opts := docker.RemoveContainerOptions {
400
+ ID : c .ID ,
401
+ RemoveVolumes : true ,
402
+ Force : true ,
403
+ }
404
+
405
+ err := cfg .Docker .RemoveContainer (opts )
379
406
if err != nil {
380
407
log .Println (err )
381
408
}
@@ -415,7 +442,7 @@ func init() {
415
442
cfg .Actions = []string {"status" }
416
443
}
417
444
418
- cfg .Docker , _ = dockerclient . NewDockerClient ( "unix:///var/run/ docker.sock" , nil )
445
+ cfg .Docker , _ = docker .NewClientFromEnv ( )
419
446
dump_cfg ()
420
447
421
448
should_exist (path .Join (cfg .Paths .Postgres , "bin" , "postgres" ))
0 commit comments