-
Notifications
You must be signed in to change notification settings - Fork 277
/
docker.go
134 lines (115 loc) Β· 3.9 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package executables
import (
"context"
"fmt"
"strconv"
"strings"
"github.com/aws/eks-anywhere/pkg/logger"
)
const (
dockerPath = "docker"
defaultRegistry = "public.ecr.aws"
)
type Docker struct {
Executable
}
func NewDocker(executable Executable) *Docker {
return &Docker{Executable: executable}
}
func (d *Docker) GetDockerLBPort(ctx context.Context, clusterName string) (port string, err error) {
clusterLBName := fmt.Sprintf("%s-lb", clusterName)
if stdout, err := d.Execute(ctx, "port", clusterLBName, "6443/tcp"); err != nil {
return "", err
} else {
return strings.Split(stdout.String(), ":")[1], nil
}
}
func (d *Docker) PullImage(ctx context.Context, image string) error {
logger.V(2).Info("Pulling docker image", "image", image)
if _, err := d.Execute(ctx, "pull", image); err != nil {
return err
} else {
return nil
}
}
func (d *Docker) SetUpCLITools(ctx context.Context, image string) error {
logger.V(1).Info("Setting up cli docker dependencies")
if err := d.PullImage(ctx, image); err != nil {
return err
} else {
return nil
}
}
func (d *Docker) Version(ctx context.Context) (int, error) {
cmdOutput, err := d.Execute(ctx, "version", "--format", "{{.Client.Version}}")
if err != nil {
return 0, fmt.Errorf("please check if docker is installed and running %v", err)
}
dockerVersion := strings.TrimSpace(cmdOutput.String())
versionSplit := strings.Split(dockerVersion, ".")
installedMajorVersion := versionSplit[0]
installedMajorVersionInt, err := strconv.Atoi(installedMajorVersion)
if err != nil {
return 0, err
}
return installedMajorVersionInt, nil
}
func (d *Docker) AllocatedMemory(ctx context.Context) (uint64, error) {
cmdOutput, err := d.Execute(ctx, "info", "--format", "'{{json .MemTotal}}'")
if err != nil {
return 0, fmt.Errorf("please check if docker is installed and running %v", err)
}
totalMemory := cmdOutput.String()
totalMemory = totalMemory[1 : len(totalMemory)-2]
return strconv.ParseUint(totalMemory, 10, 64)
}
func (d *Docker) CgroupVersion(ctx context.Context) (int, error) {
cmdOutput, err := d.Execute(ctx, "info", "--format", "'{{json .CgroupVersion}}'")
if err != nil {
return 0, fmt.Errorf("please check if docker is installed and running %v", err)
}
cgroupVersion := strings.TrimSpace(cmdOutput.String())
cgroupVersion = strings.Trim(cgroupVersion, "\"'")
version, err := strconv.Atoi(cgroupVersion)
if err != nil {
return 0, err
}
return version, nil
}
func (d *Docker) TagImage(ctx context.Context, image string, endpoint string) error {
localImage := strings.ReplaceAll(image, defaultRegistry, endpoint)
logger.Info("Tagging image", "image", image, "local image", localImage)
if _, err := d.Execute(ctx, "tag", image, localImage); err != nil {
return err
}
return nil
}
func (d *Docker) PushImage(ctx context.Context, image string, endpoint string) error {
localImage := strings.ReplaceAll(image, defaultRegistry, endpoint)
logger.Info("Pushing", "image", localImage)
if _, err := d.Execute(ctx, "push", localImage); err != nil {
return err
}
return nil
}
func (d *Docker) Login(ctx context.Context, endpoint, username, password string) error {
params := []string{"login", endpoint, "--username", username, "--password-stdin"}
logger.Info(fmt.Sprintf("Logging in to docker registry %s", endpoint))
_, err := d.ExecuteWithStdin(ctx, []byte(password), params...)
return err
}
func (d *Docker) LoadFromFile(ctx context.Context, filepath string) error {
if _, err := d.Execute(ctx, "load", "-i", filepath); err != nil {
return fmt.Errorf("loading images from file: %v", err)
}
return nil
}
func (d *Docker) SaveToFile(ctx context.Context, filepath string, images ...string) error {
params := make([]string, 0, 3+len(images))
params = append(params, "save", "-o", filepath)
params = append(params, images...)
if _, err := d.Execute(ctx, params...); err != nil {
return fmt.Errorf("saving images to file: %v", err)
}
return nil
}