/
docker.go
88 lines (76 loc) · 2.53 KB
/
docker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package bdd
import (
"fmt"
"os/exec"
"strings"
)
// DockerHelper helper for docker specific functions
type DockerHelper interface {
GetIPAddress(containerID string) (string, error)
RemoveContainersWithNamePrefix(namePrefix string) error
}
// NewDockerCmdlineHelper returns a new command line DockerHelper instance
func NewDockerCmdlineHelper() (DockerHelper, error) {
dockerCmdlineHelper := &dockerCmdlineHelper{}
return dockerCmdlineHelper, nil
}
type dockerCmdlineHelper struct {
}
func splitDockerCommandResults(cmdOutput string) (linesToReturn []string) {
lines := strings.Split(cmdOutput, "\n")
for _, line := range lines {
if len(line) > 0 {
linesToReturn = append(linesToReturn, line)
}
}
return linesToReturn
}
func (d *dockerCmdlineHelper) issueDockerCommand(cmdArgs []string) (string, error) {
var cmdOut []byte
var err error
cmd := exec.Command("docker", cmdArgs...) //nolint: gosec
//cmd.Env = append(cmd.Env, c.getEnv()...)
cmdOut, err = cmd.CombinedOutput()
return string(cmdOut), err
}
func (d *dockerCmdlineHelper) getContainerIDsWithNamePrefix(namePrefix string) ([]string, error) {
cmdOutput, err := d.issueDockerCommand([]string{"ps", "--filter", fmt.Sprintf("name=%s", namePrefix), "-qa"})
if err != nil {
return nil, fmt.Errorf("Error getting containers with name prefix '%s': %s", namePrefix, err)
}
containerIDs := splitDockerCommandResults(cmdOutput)
return containerIDs, err
}
func (d *dockerCmdlineHelper) GetIPAddress(containerID string) (ipAddress string, err error) {
var (
cmdOutput string
lines []string
)
errRetFunc := func() error {
return fmt.Errorf("Error getting IPAddress for container '%s': %s", containerID, err)
}
if cmdOutput, err = d.issueDockerCommand([]string{"inspect", "--format", "{{ .NetworkSettings.IPAddress }}", containerID}); err != nil {
return "", errRetFunc()
}
if lines = splitDockerCommandResults(cmdOutput); len(lines) != 1 {
err = fmt.Errorf("unexpected length on inspect output")
return "", errRetFunc()
}
ipAddress = lines[0]
return ipAddress, nil
}
func (d *dockerCmdlineHelper) RemoveContainersWithNamePrefix(namePrefix string) error {
containers, err := d.getContainerIDsWithNamePrefix(namePrefix)
if err != nil {
return fmt.Errorf("Error removing containers with name prefix (%s): %s", namePrefix, err)
}
for _, id := range containers {
fmt.Printf("container: %s", id)
_, _ = d.issueDockerCommand([]string{"rm", "-f", id})
}
return nil
}