Only clean up containerd hosts dirs managed by k3s

Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
(cherry picked from commit 270f85e468)
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
pull/10873/head
Brad Davidson 2024-09-04 22:13:00 +00:00 committed by Brad Davidson
parent d506595074
commit 1dacf77599
2 changed files with 49 additions and 1 deletions

View File

@ -1,6 +1,7 @@
package containerd
import (
"bufio"
"fmt"
"net"
"net/url"
@ -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 {
@ -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{}

View File

@ -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 {
@ -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.