@@ -3,21 +3,19 @@ package main
33import (
44 "archive/tar"
55 "bufio"
6- "encoding/json"
76 "flag"
87 "fmt"
9- "github.com/samalba/ dockerclient"
8+ "github.com/fsouza/go- dockerclient"
109 "io"
1110 "log"
1211 "os"
1312 "path"
1413 "path/filepath"
1514 "strings"
16- // "time"
1715)
1816
1917var cfg struct {
20- Docker * dockerclient. DockerClient
18+ Docker * docker. Client
2119 Paths struct {
2220 Postgres string
2321 Dtmd string
@@ -60,7 +58,7 @@ func get_labels(container_id string) map[string]string {
6058 return info .Config .Labels
6159}
6260
63- func get_containers (morelabels ... string ) []dockerclient. Container {
61+ func get_containers (morelabels ... string ) []docker. APIContainers {
6462 labellist := make ([]string , len (labels ) + len (morelabels ))
6563 i := 0
6664 for k , v := range labels {
@@ -72,12 +70,13 @@ func get_containers(morelabels ...string) []dockerclient.Container {
7270 i += 1
7371 }
7472 filters := map [string ][]string {"label" : labellist }
75- filterstr , err := json .Marshal (filters )
76- if err != nil {
77- log .Fatal (err )
78- }
7973
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 )
8180 if err != nil {
8281 log .Fatal (err )
8382 }
@@ -86,25 +85,22 @@ func get_containers(morelabels ...string) []dockerclient.Container {
8685}
8786
8887func get_ip (container_id string ) (string , bool ) {
89- info , err := cfg .Docker .InspectContainer (container_id )
88+ cont , err := cfg .Docker .InspectContainer (container_id )
9089 if err != nil {
9190 log .Fatal (err )
9291 }
9392
94- net , err := cfg .Docker .InspectNetwork ("contain" )
95- if err != nil {
96- log .Fatal (err )
97- }
93+ ip := cont .NetworkSettings .Networks ["contain" ].IPAddress
9894
99- return net . Containers [ container_id ]. IPv4Address , info .State .Running
95+ return ip , cont .State .Running
10096}
10197
10298func status () {
10399 log .Println ("--- status" )
104100
105101 for _ , c := range get_containers () {
106102 name := c .Names [0 ]
107- ip , running := get_ip (c .Id )
103+ ip , running := get_ip (c .ID )
108104 if running {
109105 fmt .Printf ("%s (%s)\n " , name , ip )
110106 } else {
@@ -206,23 +202,25 @@ func open_as_tar(paths map[string]string) *io.PipeReader {
206202func build_image () {
207203 log .Println ("--- build" )
208204
209- reader := open_as_tar (map [string ]string {
205+ tarstream := open_as_tar (map [string ]string {
210206 "Dockerfile" : "Dockerfile" ,
211207 cfg .Paths .Postgres : "postgres" ,
212208 cfg .Paths .Dtmd : "dtmd" ,
213209 cfg .Paths .DtmBench : "dtmbench" ,
214210 })
215- defer reader .Close ()
211+ defer tarstream .Close ()
216212
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 ,
223221 }
224222
225- buildreader , err := cfg .Docker .BuildImage (config )
223+ err := cfg .Docker .BuildImage (config )
226224 if err != nil {
227225 log .Fatal (err )
228226 }
@@ -237,31 +235,48 @@ func build_image() {
237235 }
238236}
239237
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+
241245 for i := 0 ; i < num ; i ++ {
242- config .Labels ["role" ] = role
243246 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 )
246261 if err != nil {
247262 log .Fatal (err )
248263 }
249264
250- log .Printf ("created container %s (%s...)\n " , name , id [:8 ])
265+ log .Printf ("created container %s (%s...)\n " , name , c . ID [:8 ])
251266 }
252267}
253268
254269func create_network (name string ) {
255- netconfig := dockerclient. NetworkCreate {
270+ opts := docker. CreateNetworkOptions {
256271 Name : name ,
257272 CheckDuplicate : true ,
258273 Driver : "bridge" ,
259274 }
260- response , err := cfg .Docker .CreateNetwork (& netconfig )
275+ net , err := cfg .Docker .CreateNetwork (opts )
261276 if err != nil {
262277 log .Fatal (err )
263278 }
264- log .Printf ("created network %s (%s...)\n " , name , response .ID [:8 ])
279+ log .Printf ("created network %s (%s...)\n " , name , net .ID [:8 ])
265280}
266281
267282func remove_network (name string ) {
@@ -275,38 +290,26 @@ func remove_network(name string) {
275290func create_containers () {
276291 log .Println ("--- create" )
277292
293+ image := "postgrespro:latest"
278294 netname := "contain"
279295 create_network (netname )
280296
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 )
297300}
298301
299302func start_containers () {
300303 log .Println ("--- up" )
301304
302305 for _ , c := range get_containers () {
303306 name := c .Names [0 ]
304- ip , running := get_ip (c .Id )
307+ ip , running := get_ip (c .ID )
305308 if running {
306309 fmt .Printf ("%s (%s)\n " , name , ip )
307310 } else {
308311 log .Printf ("starting %s\n " , name )
309- err := cfg .Docker .StartContainer (c .Id , nil )
312+ err := cfg .Docker .StartContainer (c .ID , nil )
310313 if err != nil {
311314 log .Fatal (err )
312315 }
@@ -319,10 +322,10 @@ func stop_containers() {
319322
320323 for _ , c := range get_containers () {
321324 name := c .Names [0 ]
322- ip , running := get_ip (c .Id )
325+ ip , running := get_ip (c .ID )
323326 if running {
324327 log .Printf ("stopping %s (%s)\n " , name , ip )
325- err := cfg .Docker .StopContainer (c .Id , 5 )
328+ err := cfg .Docker .StopContainer (c .ID , 5 )
326329 if err != nil {
327330 log .Println (err )
328331 }
@@ -335,25 +338,42 @@ func stop_containers() {
335338func run_in_container (container_id string , argv ... string ) {
336339 log .Printf ("run in %s: %v" , container_id [:8 ], argv )
337340
338- config := dockerclient. ExecConfig {
339- AttachStdin : true ,
341+ createopts := docker. CreateExecOptions {
342+ AttachStdin : false ,
340343 AttachStdout : true ,
341344 AttachStderr : true ,
342345 Tty : true ,
343346 Cmd : argv ,
344347 Container : container_id ,
345- Detach : false ,
346348 }
347349
348- execid , err := cfg .Docker .ExecCreate ( & config )
350+ exec , err := cfg .Docker .CreateExec ( createopts )
349351 if err != nil {
350352 log .Fatal (err )
351353 }
352354
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 )
354365 if err != nil {
355366 log .Fatal (err )
356367 }
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+ }
357377}
358378
359379func initdb (container_id string ) {
@@ -365,7 +385,7 @@ func init_data() {
365385 log .Println ("--- init" )
366386
367387 for _ , c := range get_containers ("role=postgres" ) {
368- initdb (c .Id )
388+ initdb (c .ID )
369389 }
370390}
371391
@@ -375,7 +395,14 @@ func clean_all() {
375395 for _ , c := range get_containers () {
376396 name := c .Names [0 ]
377397 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 )
379406 if err != nil {
380407 log .Println (err )
381408 }
@@ -415,7 +442,7 @@ func init() {
415442 cfg .Actions = []string {"status" }
416443 }
417444
418- cfg .Docker , _ = dockerclient . NewDockerClient ( "unix:///var/run/ docker.sock" , nil )
445+ cfg .Docker , _ = docker .NewClientFromEnv ( )
419446 dump_cfg ()
420447
421448 should_exist (path .Join (cfg .Paths .Postgres , "bin" , "postgres" ))
0 commit comments