Skip to content

Commit 9ce6882

Browse files
committed
New examples added and pipe system integrated.
1 parent 873cca9 commit 9ce6882

File tree

5 files changed

+198
-173
lines changed

5 files changed

+198
-173
lines changed

client/client.go

Lines changed: 85 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package client
22

33
import (
4-
"bytes"
54
"context"
65
"errors"
6+
"fmt"
77
"github.com/docker/docker/api/types"
88
"github.com/docker/docker/api/types/filters"
99
"github.com/docker/docker/client"
@@ -22,6 +22,7 @@ type Client struct {
2222
waitGroup sync.WaitGroup
2323
ctx context.Context
2424
dockerClient *client.Client
25+
UsePipes bool
2526
}
2627

2728
// NewClientWithContext create a new docker compose client with custom context.
@@ -44,6 +45,7 @@ func NewClientWithContext(ctx context.Context, composePath string) (*Client, err
4445
projectName: CompileNames(filepath.Base(composePath)),
4546
dockerClient: dockerClient,
4647
ctx: ctx,
48+
UsePipes: true,
4749
}
4850
return c, nil
4951
}
@@ -59,14 +61,44 @@ func CompileNames(str string) string {
5961
}
6062

6163
// initCmd initialize cmd for docker compose.
62-
func (c *Client) initCmd(ctx context.Context, buffer *bytes.Buffer) *exec.Cmd {
64+
func (c *Client) initCmd(ctx context.Context) *exec.Cmd {
6365
cmd := exec.CommandContext(ctx, c.bin, c.baseArgs...)
6466
cmd.Dir = c.composePath
65-
cmd.Stdout = buffer
66-
cmd.Stderr = buffer
6767
return cmd
6868
}
6969

70+
func (c *Client) runCommand(args ...string) (*Pipes, error) {
71+
cmd := c.initCmd(c.ctx)
72+
var pipes *Pipes
73+
var err error
74+
if c.UsePipes {
75+
stdin, err := cmd.StdinPipe()
76+
if err != nil {
77+
return nil, err
78+
}
79+
stdout, err := cmd.StdoutPipe()
80+
if err != nil {
81+
return nil, err
82+
}
83+
stderr, err := cmd.StderrPipe()
84+
if err != nil {
85+
return nil, err
86+
}
87+
pipes = &Pipes{
88+
Stdin: stdin,
89+
Stdout: stdout,
90+
Stderr: stderr,
91+
}
92+
}
93+
addCmdArgs(cmd, args...)
94+
err = cmd.Start()
95+
if err != nil {
96+
return nil, err
97+
}
98+
c.addWaitForCmd(cmd)
99+
return pipes, nil
100+
}
101+
70102
// addCmdArgs add args to cmd.
71103
func addCmdArgs(cmd *exec.Cmd, args ...string) {
72104
cmd.Args = append(cmd.Args, args...)
@@ -78,125 +110,67 @@ func (c *Client) Wait() {
78110
}
79111

80112
// Up create and start containers.
81-
func (c *Client) Up() (*bytes.Buffer, error) {
82-
stdout := &bytes.Buffer{}
83-
cmd := c.initCmd(c.ctx, stdout)
84-
addCmdArgs(cmd, "up", "-d")
85-
err := cmd.Start()
86-
if err != nil {
87-
return nil, err
88-
}
89-
c.addWaitForCmd(cmd)
90-
return stdout, nil
91-
}
92-
93-
func (c *Client) baseStartStop(start bool, service *string) (*bytes.Buffer, error) {
94-
stdout := &bytes.Buffer{}
95-
cmd := c.initCmd(c.ctx, stdout)
96-
if start {
97-
if service == nil {
98-
addCmdArgs(cmd, "start")
99-
} else {
100-
addCmdArgs(cmd, "start", CompileNames(*service))
101-
}
102-
} else {
103-
if service == nil {
104-
addCmdArgs(cmd, "stop")
105-
} else {
106-
addCmdArgs(cmd, "stop", CompileNames(*service))
107-
}
108-
}
109-
err := cmd.Start()
110-
if err != nil {
111-
return nil, err
112-
}
113-
114-
c.addWaitForCmd(cmd)
115-
return stdout, nil
113+
func (c *Client) Up() (*Pipes, error) {
114+
return c.runCommand("up", "-d")
116115
}
117116

118117
// Start service container.
119-
func (c *Client) Start(service string) (*bytes.Buffer, error) {
120-
return c.baseStartStop(true, &service)
118+
func (c *Client) Start(service string) (*Pipes, error) {
119+
return c.runCommand("start", CompileNames(service))
121120
}
122121

123122
// StartAll start all service containers.
124-
func (c *Client) StartAll() (*bytes.Buffer, error) {
125-
return c.baseStartStop(true, nil)
123+
func (c *Client) StartAll() (*Pipes, error) {
124+
return c.runCommand("start")
126125
}
127126

128127
// Stop service container.
129-
func (c *Client) Stop(service string) (*bytes.Buffer, error) {
130-
return c.baseStartStop(false, &service)
128+
func (c *Client) Stop(service string) (*Pipes, error) {
129+
return c.runCommand("stop", CompileNames(service))
131130
}
132131

133132
// StopAll stop all service containers.
134-
func (c *Client) StopAll() (*bytes.Buffer, error) {
135-
return c.baseStartStop(false, nil)
136-
}
137-
138-
func (c *Client) baseBuild(service *string) (*bytes.Buffer, error) {
139-
stdout := &bytes.Buffer{}
140-
cmd := c.initCmd(c.ctx, stdout)
141-
if service == nil {
142-
addCmdArgs(cmd, "build")
143-
} else {
144-
addCmdArgs(cmd, "build", CompileNames(*service))
145-
}
146-
err := cmd.Start()
147-
if err != nil {
148-
return nil, err
149-
}
150-
151-
c.addWaitForCmd(cmd)
152-
return stdout, nil
133+
func (c *Client) StopAll() (*Pipes, error) {
134+
return c.runCommand("stop")
153135
}
154136

155137
// Build or rebuild services.
156-
func (c *Client) Build(service string) (*bytes.Buffer, error) {
157-
return c.baseBuild(&service)
138+
func (c *Client) Build(service string) (*Pipes, error) {
139+
return c.runCommand("build", CompileNames(service))
158140
}
159141

160142
// BuildAll Build or rebuild services.
161-
func (c *Client) BuildAll() (*bytes.Buffer, error) {
162-
return c.baseBuild(nil)
143+
func (c *Client) BuildAll() (*Pipes, error) {
144+
return c.runCommand("build")
163145
}
164146

165147
// Convert converts the compose file to platform's canonical format.
166-
func (c *Client) Convert() error {
167-
panic("implement me")
148+
func (c *Client) Convert() (*Pipes, error) {
149+
return c.runCommand("convert")
168150
}
169151

170152
func (c *Client) Cp() error {
171153
panic("implement me")
172154
}
173155

174156
// Create creates container for a service.
175-
func (c *Client) Create(service string) error {
176-
panic("implement me")
157+
func (c *Client) Create(service string) (*Pipes, error) {
158+
return c.runCommand("create", CompileNames(service))
177159
}
178160

179161
// CreateAll creates containers for a service.
180-
func (c *Client) CreateAll() error {
181-
panic("implement me")
162+
func (c *Client) CreateAll() (*Pipes, error) {
163+
return c.runCommand("create")
182164
}
183165

184166
// Down stops containers and removes containers, networks, volumes, and images created by up.
185-
func (c *Client) Down() (*bytes.Buffer, error) {
186-
stdout := &bytes.Buffer{}
187-
cmd := c.initCmd(c.ctx, stdout)
188-
addCmdArgs(cmd, "down")
189-
err := cmd.Start()
190-
if err != nil {
191-
return nil, err
192-
}
193-
c.addWaitForCmd(cmd)
194-
return stdout, nil
167+
func (c *Client) Down() (*Pipes, error) {
168+
return c.runCommand("down")
195169
}
196170

197171
// Events displays real time events from containers.
198-
func (c *Client) Events() error {
199-
panic("implement me")
172+
func (c *Client) Events() (*Pipes, error) {
173+
return c.runCommand("events")
200174
}
201175

202176
// Exec execute a command in a running container.
@@ -209,59 +183,39 @@ func (c *Client) Images() error {
209183
panic("implement me")
210184
}
211185

212-
func (c *Client) baseKill(service *string) error {
213-
cmd := c.initCmd(c.ctx, nil)
214-
if service == nil {
215-
addCmdArgs(cmd, "kill")
216-
} else {
217-
addCmdArgs(cmd, "kill", CompileNames(*service))
218-
}
219-
err := cmd.Run()
220-
if err != nil {
221-
return err
222-
}
223-
return nil
224-
}
225-
226186
// Kill stops running container without removing them.
227-
func (c *Client) Kill(service string) error {
228-
return c.baseKill(&service)
187+
func (c *Client) Kill(service string) (*Pipes, error) {
188+
return c.runCommand("kill", CompileNames(service))
229189
}
230190

231191
// KillAll stops running containers without removing them.
232-
func (c *Client) KillAll() error {
233-
return c.baseKill(nil)
192+
func (c *Client) KillAll() (*Pipes, error) {
193+
return c.runCommand("kill")
234194
}
235195

236196
// Logs shows container logs.
237-
func (c *Client) Logs(service string) error {
197+
func (c *Client) Logs(service string) (*Pipes, error) {
238198
panic("implement me")
239199
}
240200

241201
// LogsStream shows container logs as a stream.
242-
func (c *Client) LogsStream(service string) error {
202+
func (c *Client) LogsStream(service string) (*Pipes, error) {
243203
panic("implement me")
244204
}
245205

246206
// LogsAll shows all container logs.
247-
func (c *Client) LogsAll() error {
207+
func (c *Client) LogsAll() (*Pipes, error) {
248208
panic("implement me")
249209
}
250210

251211
// LogsAllStream shows all container logs as a stream.
252-
func (c *Client) LogsAllStream() error {
212+
func (c *Client) LogsAllStream() (*Pipes, error) {
253213
panic("implement me")
254214
}
255215

256216
// Pause pauses container.
257-
func (c *Client) Pause(service string) error {
258-
cmd := c.initCmd(c.ctx, nil)
259-
addCmdArgs(cmd, "pause")
260-
err := cmd.Run()
261-
if err != nil {
262-
return err
263-
}
264-
return nil
217+
func (c *Client) Pause(service string) (*Pipes, error) {
218+
return c.runCommand("pause", CompileNames(service))
265219
}
266220

267221
// PauseAll pauses all containers.
@@ -270,24 +224,18 @@ func (c *Client) PauseAll() error {
270224
}
271225

272226
// Unpause unpauses container.
273-
func (c *Client) Unpause(service string) error {
274-
cmd := c.initCmd(c.ctx, nil)
275-
addCmdArgs(cmd, "unpause")
276-
err := cmd.Run()
277-
if err != nil {
278-
return err
279-
}
280-
return nil
227+
func (c *Client) Unpause(service string) (*Pipes, error) {
228+
return c.runCommand("unpause", CompileNames(service))
281229
}
282230

283231
// UnpauseAll unpauses all containers.
284-
func (c *Client) UnpauseAll() error {
285-
panic("implement me")
232+
func (c *Client) UnpauseAll() (*Pipes, error) {
233+
return c.runCommand("unpause")
286234
}
287235

288236
// Port displays public facing port of the container.
289-
func (c *Client) Port(service string, innerPort uint16) error {
290-
panic("implement me")
237+
func (c *Client) Port(service string, innerPort uint16) (*Pipes, error) {
238+
return c.runCommand("port", CompileNames(service), fmt.Sprintf("%d", innerPort))
291239
}
292240

293241
// Ps lists running containers.
@@ -310,60 +258,28 @@ func (c *Client) Push() error {
310258
panic("implement me")
311259
}
312260

313-
func (c *Client) baseRestart(service *string) (*bytes.Buffer, error) {
314-
stdout := &bytes.Buffer{}
315-
cmd := c.initCmd(c.ctx, stdout)
316-
if service == nil {
317-
addCmdArgs(cmd, "restart")
318-
} else {
319-
addCmdArgs(cmd, "restart", *service)
320-
}
321-
err := cmd.Start()
322-
if err != nil {
323-
return nil, err
324-
}
325-
c.addWaitForCmd(cmd)
326-
return stdout, nil
327-
}
328-
329261
// Restart restart service container.
330-
func (c *Client) Restart(service string) (*bytes.Buffer, error) {
331-
return c.baseRestart(&service)
262+
func (c *Client) Restart(service string) (*Pipes, error) {
263+
return c.runCommand("restart", CompileNames(service))
332264
}
333265

334266
// RestartAll restart service containers.
335-
func (c *Client) RestartAll() (*bytes.Buffer, error) {
336-
return c.baseRestart(nil)
337-
}
338-
339-
func (c *Client) baseRm(service *string) (*bytes.Buffer, error) {
340-
stdout := &bytes.Buffer{}
341-
cmd := c.initCmd(c.ctx, stdout)
342-
if service == nil {
343-
addCmdArgs(cmd, "rm")
344-
} else {
345-
addCmdArgs(cmd, "rm", *service)
346-
}
347-
err := cmd.Start()
348-
if err != nil {
349-
return nil, err
350-
}
351-
c.addWaitForCmd(cmd)
352-
return stdout, nil
267+
func (c *Client) RestartAll() (*Pipes, error) {
268+
return c.runCommand("restart")
353269
}
354270

355271
// Rm removes stopped service containers.
356-
func (c *Client) Rm(service string) (*bytes.Buffer, error) {
357-
return c.baseRm(&service)
272+
func (c *Client) Rm(service string) (*Pipes, error) {
273+
return c.runCommand("rm", CompileNames(service))
358274
}
359275

360276
// RmAll removes all service containers.
361-
func (c *Client) RmAll() (*bytes.Buffer, error) {
362-
return c.baseRm(nil)
277+
func (c *Client) RmAll() (*Pipes, error) {
278+
return c.runCommand("rm")
363279
}
364280

365281
// Run a one-off command on a service.
366-
func (c *Client) Run(service string, commands ...string) (*bytes.Buffer, error) {
282+
func (c *Client) Run(service string, commands ...string) (*Pipes, error) {
367283
panic("implement me")
368284
}
369285

0 commit comments

Comments
 (0)