@@ -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" ))