-
Notifications
You must be signed in to change notification settings - Fork 8
/
opts.go
148 lines (124 loc) · 3.38 KB
/
opts.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package docker
import (
"fmt"
"github.com/chainguard-dev/terraform-provider-imagetest/internal/containers/provider"
"github.com/chainguard-dev/terraform-provider-imagetest/internal/harnesses/base"
"github.com/chainguard-dev/terraform-provider-imagetest/internal/harnesses/container"
"github.com/google/go-containerregistry/pkg/authn"
"github.com/google/go-containerregistry/pkg/name"
)
type HarnessDockerOptions struct {
ImageRef name.Reference
ManagedVolumes []container.ConfigMount
Networks []string
Mounts []container.ConfigMount
HostSocketPath string
Envs provider.Env
Registries map[string]*RegistryOpt
ConfigVolumeName string
}
type RegistryOpt struct {
Auth *base.RegistryAuthOpt
Tls *base.RegistryTlsOpt
}
type Option func(*HarnessDockerOptions) error
func WithImageRef(ref name.Reference) Option {
return func(opt *HarnessDockerOptions) error {
opt.ImageRef = ref
return nil
}
}
func WithManagedVolumes(volumes ...container.ConfigMount) Option {
return func(opt *HarnessDockerOptions) error {
if volumes != nil {
opt.ManagedVolumes = append(opt.ManagedVolumes, volumes...)
}
return nil
}
}
func WithMounts(mounts ...container.ConfigMount) Option {
return func(opt *HarnessDockerOptions) error {
if mounts != nil {
opt.Mounts = append(opt.Mounts, mounts...)
}
return nil
}
}
func WithNetworks(networks ...string) Option {
return func(opt *HarnessDockerOptions) error {
opt.Networks = append(opt.Networks, networks...)
return nil
}
}
func WithAuthFromStatic(registry, username, password, auth string) Option {
return func(opt *HarnessDockerOptions) error {
if opt.Registries == nil {
opt.Registries = make(map[string]*RegistryOpt)
}
if _, ok := opt.Registries[registry]; !ok {
opt.Registries[registry] = &RegistryOpt{}
}
opt.Registries[registry].Auth = &base.RegistryAuthOpt{
Username: username,
Password: password,
Auth: auth,
}
return nil
}
}
func WithAuthFromKeychain(registry string) Option {
return func(opt *HarnessDockerOptions) error {
if opt.Registries == nil {
opt.Registries = make(map[string]*RegistryOpt)
}
if _, ok := opt.Registries[registry]; !ok {
opt.Registries[registry] = &RegistryOpt{}
}
r, err := name.NewRegistry(registry)
if err != nil {
return fmt.Errorf("invalid registry name: %w", err)
}
a, err := authn.DefaultKeychain.Resolve(r)
if err != nil {
return fmt.Errorf("resolving keychain for registry %s: %w", r.String(), err)
}
acfg, err := a.Authorization()
if err != nil {
return fmt.Errorf("getting authorization for registry %s: %w", r.String(), err)
}
opt.Registries[registry].Auth = &base.RegistryAuthOpt{
Username: acfg.Username,
Password: acfg.Password,
Auth: acfg.Auth,
}
return nil
}
}
func WithEnvs(env ...provider.Env) Option {
return func(opt *HarnessDockerOptions) error {
if env == nil {
return nil
}
if opt.Envs == nil {
opt.Envs = make(provider.Env)
}
for _, envItem := range env {
for k, v := range envItem {
opt.Envs[k] = v
}
}
return nil
}
}
func WithHostSocketPath(socketPath string) Option {
return func(opt *HarnessDockerOptions) error {
opt.HostSocketPath = socketPath
return nil
}
}
func WithConfigVolumeName(configVolumeName string) Option {
return func(opt *HarnessDockerOptions) error {
opt.ConfigVolumeName = configVolumeName
return nil
}
}