From da2af644d2b66b6168b27339dd58c13dbfaed44d Mon Sep 17 00:00:00 2001 From: Nick Baker Date: Fri, 19 Jan 2024 18:55:09 +0000 Subject: [PATCH] move file writes to a helper --- nodeadm/internal/containerd/config.go | 7 +------ nodeadm/internal/daemon/systemd.go | 9 +++------ nodeadm/internal/kubelet/cert.go | 8 ++------ nodeadm/internal/kubelet/config.go | 13 +++---------- .../internal/kubelet/image-credential-provider.go | 6 ++---- nodeadm/internal/kubelet/kubeconfig.go | 9 +++------ nodeadm/internal/util/sys.go | 11 +++++++++++ 7 files changed, 25 insertions(+), 38 deletions(-) diff --git a/nodeadm/internal/containerd/config.go b/nodeadm/internal/containerd/config.go index bf22968a1..982580c14 100644 --- a/nodeadm/internal/containerd/config.go +++ b/nodeadm/internal/containerd/config.go @@ -4,8 +4,6 @@ import ( "bytes" "context" _ "embed" - "os" - "path" "text/template" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" @@ -33,10 +31,7 @@ func writeContainerdConfig(cfg *api.NodeConfig) error { if err != nil { return err } - if err := os.MkdirAll(path.Dir(containerdConfigFile), containerdConfigPerm); err != nil { - return err - } - return os.WriteFile(containerdConfigFile, containerdConfig, containerdConfigPerm) + return util.WriteFileWithDir(containerdConfigFile, containerdConfig, containerdConfigPerm) } func generateContainerdConfig(cfg *api.NodeConfig) ([]byte, error) { diff --git a/nodeadm/internal/daemon/systemd.go b/nodeadm/internal/daemon/systemd.go index bcc1a6752..eb8d5ded7 100644 --- a/nodeadm/internal/daemon/systemd.go +++ b/nodeadm/internal/daemon/systemd.go @@ -6,9 +6,9 @@ import ( "context" "fmt" "io/fs" - "os" "path" + "github.com/awslabs/amazon-eks-ami/nodeadm/internal/util" "github.com/coreos/go-systemd/dbus" ) @@ -114,13 +114,10 @@ const servicesRoot = "/etc/systemd/system" func WriteSystemdServiceUnitDropIn(serviceName, fileName, fileContent string, filePerms fs.FileMode) error { dropInPath := path.Join(servicesRoot, getServiceUnitDropInDir(serviceName), fileName) - if err := os.MkdirAll(path.Dir(dropInPath), filePerms); err != nil { - return err - } - return os.WriteFile(dropInPath, []byte(fileContent), filePerms) + return util.WriteFileWithDir(dropInPath, []byte(fileContent), filePerms) } func WriteSystemdServiceUnit(serviceName, unitContent string, filePerms fs.FileMode) error { serviceUnitPath := path.Join(servicesRoot, getServiceUnitName(serviceName)) - return os.WriteFile(serviceUnitPath, []byte(unitContent), filePerms) + return util.WriteFileWithDir(serviceUnitPath, []byte(unitContent), filePerms) } diff --git a/nodeadm/internal/kubelet/cert.go b/nodeadm/internal/kubelet/cert.go index 670ee2c2a..dd1f82f32 100644 --- a/nodeadm/internal/kubelet/cert.go +++ b/nodeadm/internal/kubelet/cert.go @@ -1,8 +1,7 @@ package kubelet import ( - "os" - "path" + "github.com/awslabs/amazon-eks-ami/nodeadm/internal/util" ) const caCertificatePath = "/etc/kubernetes/pki/ca.crt" @@ -10,8 +9,5 @@ const caCertificatePath = "/etc/kubernetes/pki/ca.crt" // Write the cluster certifcate authority to the filesystem where // both kubelet and kubeconfig can read it func writeClusterCaCert(caCert []byte) error { - if err := os.MkdirAll(path.Dir(caCertificatePath), kubeletConfigPerm); err != nil { - return err - } - return os.WriteFile(caCertificatePath, caCert, kubeletConfigPerm) + return util.WriteFileWithDir(caCertificatePath, caCert, kubeletConfigPerm) } diff --git a/nodeadm/internal/kubelet/config.go b/nodeadm/internal/kubelet/config.go index ee9367413..ecf66a271 100644 --- a/nodeadm/internal/kubelet/config.go +++ b/nodeadm/internal/kubelet/config.go @@ -25,6 +25,7 @@ import ( "github.com/awslabs/amazon-eks-ami/nodeadm/internal/api" featuregates "github.com/awslabs/amazon-eks-ami/nodeadm/internal/feature-gates" + "github.com/awslabs/amazon-eks-ami/nodeadm/internal/util" ) const ( @@ -284,14 +285,10 @@ func (k *kubelet) GenerateKubeletConfig(cfg *api.NodeConfig) (*kubeletSubConfig, // - kubeletConfigOverrides should be passed in the order of application func (k *kubelet) writeKubeletConfigToFile(kubeletConfig []byte) error { configPath := path.Join(kubeletConfigRoot, kubeletConfigFile) - if err := os.MkdirAll(path.Dir(configPath), kubeletConfigPerm); err != nil { - return err - } - k.additionalArguments["config"] = configPath zap.L().Info("Writing kubelet config to file..", zap.String("path", configPath)) - return os.WriteFile(configPath, kubeletConfig, kubeletConfigPerm) + return util.WriteFileWithDir(configPath, kubeletConfig, kubeletConfigPerm) } // WriteKubeletConfigToDir writes the kubelet config to a directory for drop-in @@ -299,10 +296,6 @@ func (k *kubelet) writeKubeletConfigToFile(kubeletConfig []byte) error { // see: https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/#kubelet-conf-d func (k *kubelet) writeKubeletConfigToDir(kubeletConfig []byte) error { dirPath := path.Join(kubeletConfigRoot, kubeletConfigDir) - if err := os.MkdirAll(dirPath, kubeletConfigPerm); err != nil { - return err - } - k.additionalArguments["config-dir"] = dirPath zap.L().Info("Enabling kubelet config drop-in dir..") @@ -310,7 +303,7 @@ func (k *kubelet) writeKubeletConfigToDir(kubeletConfig []byte) error { filePath := path.Join(dirPath, "10-defaults.conf") zap.L().Info("Writing kubelet config to drop-in file..", zap.String("path", filePath)) - return os.WriteFile(filePath, kubeletConfig, kubeletConfigPerm) + return util.WriteFileWithDir(filePath, kubeletConfig, kubeletConfigPerm) } func getProviderId(availabilityZone, instanceId string) string { diff --git a/nodeadm/internal/kubelet/image-credential-provider.go b/nodeadm/internal/kubelet/image-credential-provider.go index 6e334a731..3de768d52 100644 --- a/nodeadm/internal/kubelet/image-credential-provider.go +++ b/nodeadm/internal/kubelet/image-credential-provider.go @@ -10,6 +10,7 @@ import ( "text/template" "github.com/awslabs/amazon-eks-ami/nodeadm/internal/api" + "github.com/awslabs/amazon-eks-ami/nodeadm/internal/util" "go.uber.org/zap" "golang.org/x/mod/semver" ) @@ -48,10 +49,7 @@ func (k *kubelet) writeImageCredentialProviderConfig(cfg *api.NodeConfig) error k.additionalArguments["image-credential-provider-bin-dir"] = path.Dir(ecrCredentialProviderBinPath) k.additionalArguments["image-credential-provider-config"] = imageCredentialProviderConfigPath - if err := os.MkdirAll(imageCredentialProviderRoot, imageCredentialProviderPerm); err != nil { - return err - } - return os.WriteFile(imageCredentialProviderConfigPath, config, imageCredentialProviderPerm) + return util.WriteFileWithDir(imageCredentialProviderConfigPath, config, imageCredentialProviderPerm) } type imageCredentialProviderTemplateVars struct { diff --git a/nodeadm/internal/kubelet/kubeconfig.go b/nodeadm/internal/kubelet/kubeconfig.go index 6bd4d8fd0..822e1a497 100644 --- a/nodeadm/internal/kubelet/kubeconfig.go +++ b/nodeadm/internal/kubelet/kubeconfig.go @@ -3,11 +3,11 @@ package kubelet import ( "bytes" _ "embed" - "os" "path" "text/template" "github.com/awslabs/amazon-eks-ami/nodeadm/internal/api" + "github.com/awslabs/amazon-eks-ami/nodeadm/internal/util" ) const ( @@ -30,18 +30,15 @@ func (k *kubelet) writeKubeconfig(cfg *api.NodeConfig) error { if err != nil { return err } - if err := os.MkdirAll(kubeconfigRoot, kubeconfigPerm); err != nil { - return err - } if enabled := cfg.Spec.Cluster.EnableOutpost; enabled != nil && *enabled { // kubelet bootstrap kubeconfig uses aws-iam-authenticator with cluster id to authenticate to cluster // - if "aws eks describe-cluster" is bypassed, for local outpost, the value of CLUSTER_NAME parameter will be cluster id. // - otherwise, the cluster id will use the id returned by "aws eks describe-cluster". k.additionalArguments["bootstrap-kubeconfig"] = kubeconfigBootstrapPath - return os.WriteFile(kubeconfigBootstrapPath, kubeconfig, kubeconfigPerm) + return util.WriteFileWithDir(kubeconfigBootstrapPath, kubeconfig, kubeconfigPerm) } else { k.additionalArguments["kubeconfig"] = kubeconfigPath - return os.WriteFile(kubeconfigPath, kubeconfig, kubeconfigPerm) + return util.WriteFileWithDir(kubeconfigPath, kubeconfig, kubeconfigPerm) } } diff --git a/nodeadm/internal/util/sys.go b/nodeadm/internal/util/sys.go index f95195d9f..b74f5144b 100644 --- a/nodeadm/internal/util/sys.go +++ b/nodeadm/internal/util/sys.go @@ -2,14 +2,25 @@ package util import ( "errors" + "io/fs" "os" "os/exec" + "path" "strconv" "strings" ) const trimChars = " \n\t" +// Wraps os.WriteFile to automatically create parent directories such that the +// caller does not need to ensure the existence of the file's directory +func WriteFileWithDir(filePath string, data []byte, perm fs.FileMode) error { + if err := os.MkdirAll(path.Dir(filePath), perm); err != nil { + return err + } + return os.WriteFile(filePath, data, perm) +} + func isHostPresent(host string) (bool, error) { output, err := exec.Command("getent", "hosts", host).Output() if err != nil {