forked from awslabs/amazon-eks-ami
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.go
More file actions
83 lines (71 loc) · 2.37 KB
/
config.go
File metadata and controls
83 lines (71 loc) · 2.37 KB
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
package containerd
import (
"bytes"
_ "embed"
"text/template"
"github.com/awslabs/amazon-eks-ami/nodeadm/internal/api"
"github.com/awslabs/amazon-eks-ami/nodeadm/internal/util"
"github.com/pelletier/go-toml/v2"
"go.uber.org/zap"
)
const ContainerRuntimeEndpoint = "unix:///run/containerd/containerd.sock"
const (
containerdConfigFile = "/etc/containerd/config.toml"
containerdConfigPerm = 0644
)
var (
//go:embed config.template.toml
containerdConfigTemplateData string
containerdConfigTemplate = template.Must(template.New(containerdConfigFile).Parse(containerdConfigTemplateData))
)
type containerdTemplateVars struct {
SandboxImage string
RuntimeName string
RuntimeBinaryName string
}
type modifier interface {
// Modify mutates a given containerd template configuration.
Modify(*containerdTemplateVars)
// Matches determines whether the configurator is relevant to the current instance.
Matches(*api.NodeConfig) bool
}
func writeContainerdConfig(cfg *api.NodeConfig) error {
containerdConfig, err := generateContainerdConfig(cfg)
if err != nil {
return err
}
// because the logic in containerd's import merge decides to completely
// overwrite entire sections, we want to implement this merging ourselves.
// see: https://github.com/containerd/containerd/blob/a91b05d99ceac46329be06eb43f7ae10b89aad45/cmd/containerd/server/config/config.go#L407-L431
if len(cfg.Spec.Containerd.Config) > 0 {
containerdConfigMap, err := util.Merge(containerdConfig, []byte(cfg.Spec.Containerd.Config), toml.Marshal, toml.Unmarshal)
if err != nil {
return err
}
containerdConfig, err = toml.Marshal(containerdConfigMap)
if err != nil {
return err
}
}
zap.L().Info("Writing containerd config to file..", zap.String("path", containerdConfigFile))
return util.WriteFileWithDir(containerdConfigFile, containerdConfig, containerdConfigPerm)
}
func generateContainerdConfig(cfg *api.NodeConfig) ([]byte, error) {
configVars := containerdTemplateVars{
SandboxImage: cfg.Status.Defaults.SandboxImage,
RuntimeBinaryName: "/usr/sbin/runc",
RuntimeName: "runc",
}
for _, configurator := range []modifier{
NewNvidiaModifier(),
} {
if configurator.Matches(cfg) {
configurator.Modify(&configVars)
}
}
var buf bytes.Buffer
if err := containerdConfigTemplate.Execute(&buf, configVars); err != nil {
return nil, err
}
return buf.Bytes(), nil
}