Skip to content

Commit

Permalink
Only clean up containerd hosts dirs managed by k3s
Browse files Browse the repository at this point in the history
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
(cherry picked from commit 270f85e)
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
  • Loading branch information
brandond committed Sep 6, 2024
1 parent 4c8ef7f commit 2caa785
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
47 changes: 46 additions & 1 deletion pkg/agent/containerd/config.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package containerd

import (
"bufio"
"fmt"
"net"
"net/url"
Expand Down Expand Up @@ -46,7 +47,9 @@ func writeContainerdHosts(cfg *config.Node, containerdConfig templates.Container
hosts := getHostConfigs(containerdConfig.PrivateRegistryConfig, containerdConfig.NoDefaultEndpoint, mirrorAddr)

// Clean up previous configuration templates
os.RemoveAll(cfg.Containerd.Registry)
if err := cleanContainerdHosts(cfg.Containerd.Registry, hosts); err != nil {
return err
}

// Write out new templates
for host, config := range hosts {
Expand All @@ -67,6 +70,48 @@ func writeContainerdHosts(cfg *config.Node, containerdConfig templates.Container
return nil
}

// cleanContainerdHosts removes any registry host config dirs containing a hosts.toml file
// with a header that indicates it was created by k3s, or directories where a hosts.toml
// is about to be written. Unmanaged directories not containing this file, or containing
// a file without the header, are left alone.
func cleanContainerdHosts(dir string, hosts HostConfigs) error {
// clean directories for any registries that we are about to generate a hosts.toml for
for host := range hosts {
hostsDir := filepath.Join(dir, host)
os.RemoveAll(hostsDir)
}

// clean directories that contain a hosts.toml with a header indicating it was created by k3s
ents, err := os.ReadDir(dir)
if err != nil && !os.IsNotExist(err) {
return err
}

for _, ent := range ents {
if !ent.IsDir() {
continue
}
hostsFile := filepath.Join(dir, ent.Name(), "hosts.toml")
file, err := os.Open(hostsFile)
if err != nil {
if os.IsNotExist(err) {
continue
}
return err
}
line, err := bufio.NewReader(file).ReadString('\n')
if err != nil {
continue
}
if line == templates.HostsTomlHeader {
hostsDir := filepath.Join(dir, ent.Name())
os.RemoveAll(hostsDir)
}
}

return nil
}

// getHostConfigs merges the registry mirrors/configs into HostConfig template structs
func getHostConfigs(registry *registries.Registry, noDefaultEndpoint bool, mirrorAddr string) HostConfigs {
hosts := map[string]templates.HostConfig{}
Expand Down
3 changes: 3 additions & 0 deletions pkg/agent/templates/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/rancher/wharfie/pkg/registries"

"github.com/k3s-io/k3s/pkg/daemons/config"
"github.com/k3s-io/k3s/pkg/version"
)

type ContainerdRuntimeConfig struct {
Expand Down Expand Up @@ -40,6 +41,8 @@ type HostConfig struct {
Endpoints []RegistryEndpoint
}

var HostsTomlHeader = "# File generated by " + version.Program + ". DO NOT EDIT."

const HostsTomlTemplate = `
{{- /* */ -}}
# File generated by {{ .Program }}. DO NOT EDIT.
Expand Down

0 comments on commit 2caa785

Please sign in to comment.