/
config.go
123 lines (108 loc) · 3.02 KB
/
config.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
package main
import (
"bytes"
"fmt"
"sort"
"strings"
"text/template"
"golang.org/x/exp/maps"
"github.com/dagger/dagger/ci/consts"
"github.com/dagger/dagger/ci/internal/dagger"
)
const (
engineTomlPath = "/etc/dagger/engine.toml"
engineEntrypointPath = "/usr/local/bin/dagger-entrypoint.sh"
)
const engineEntrypointTmpl = `#!/bin/sh
set -e
cat $0
# cgroup v2: enable nesting
# see https://github.com/moby/moby/blob/38805f20f9bcc5e87869d6c79d432b166e1c88b4/hack/dind#L28
if [ -f /sys/fs/cgroup/cgroup.controllers ]; then
# move the processes from the root group to the /init group,
# otherwise writing subtree_control fails with EBUSY.
# An error during moving non-existent process (i.e., "cat") is ignored.
mkdir -p /sys/fs/cgroup/init
xargs -rn1 < /sys/fs/cgroup/cgroup.procs > /sys/fs/cgroup/init/cgroup.procs || :
# enable controllers
sed -e 's/ / +/g' -e 's/^/+/' < /sys/fs/cgroup/cgroup.controllers \
> /sys/fs/cgroup/cgroup.subtree_control
fi
exec {{.EngineBin}} --config {{.EngineConfig}} {{ range $key := .EntrypointArgKeys -}}--{{ $key }}="{{ index $.EntrypointArgs $key }}" {{ end -}} "$@"
`
const engineConfigTmpl = `
debug = true
trace = {{.Trace}}
insecure-entitlements = ["security.insecure"]
{{ range $key := .ConfigKeys }}
[{{ $key }}]
{{ index $.ConfigEntries $key }}
{{ end -}}
`
func generateEntrypoint(kvs []string) (*File, error) {
opts := map[string]string{}
for _, kv := range kvs {
k, v, ok := strings.Cut(kv, "=")
if !ok {
return nil, fmt.Errorf("no value for key %q", k)
}
opts[k] = v
}
keys := maps.Keys(opts)
sort.Strings(keys)
type entrypointTmplParams struct {
Bridge string
EngineBin string
EngineConfig string
EntrypointArgs map[string]string
EntrypointArgKeys []string
}
tmpl := template.Must(template.New("entrypoint").Parse(engineEntrypointTmpl))
buf := new(bytes.Buffer)
err := tmpl.Execute(buf, entrypointTmplParams{
EngineBin: consts.EngineServerPath,
EngineConfig: engineTomlPath,
EntrypointArgs: opts,
EntrypointArgKeys: keys,
})
if err != nil {
panic(err)
}
entrypoint := dag.Directory().
WithNewFile("dagger-entrypoint.sh", buf.String(), dagger.DirectoryWithNewFileOpts{
Permissions: 0o755,
}).
File("dagger-entrypoint.sh")
return entrypoint, nil
}
func generateConfig(trace bool, kvs []string) (*File, error) {
opts := map[string]string{}
for _, kv := range kvs {
k, v, ok := strings.Cut(kv, "=")
if !ok {
return nil, fmt.Errorf("no value for key %q", k)
}
opts[k] = v
}
keys := maps.Keys(opts)
sort.Strings(keys)
type configTmplParams struct {
Trace bool
ConfigEntries map[string]string
ConfigKeys []string
}
tmpl := template.Must(template.New("config").Parse(engineConfigTmpl))
buf := new(bytes.Buffer)
err := tmpl.Execute(buf, configTmplParams{
Trace: trace,
ConfigEntries: opts,
ConfigKeys: keys,
})
if err != nil {
panic(err)
}
config := dag.Directory().
WithNewFile("engine.toml", buf.String()).
File("engine.toml")
return config, nil
}