From 543d978778bc5d02f21046e7a8f333ed11e9616d Mon Sep 17 00:00:00 2001
From: kaiyou <dev@kaiyou.fr>
Date: Sun, 16 Oct 2022 20:12:02 +0200
Subject: [PATCH] More generic function for writing config files

---
 pkg/cluster/env.go        |  9 +------
 pkg/cluster/kubeconfig.go | 54 ++++++++++++++++++++++-----------------
 pkg/cluster/services.go   | 16 ++++--------
 3 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/pkg/cluster/env.go b/pkg/cluster/env.go
index 65e4b43..5305533 100644
--- a/pkg/cluster/env.go
+++ b/pkg/cluster/env.go
@@ -37,19 +37,12 @@ func (c *Cluster) initEnv() {
 	}
 	// Create the admin kubeconfig on master only
 	if c.node.Role == Master {
-		err = os.MkdirAll(path.Join(homeDir, ".kube"), 0o755)
-		if err != nil {
-			logrus.Fatal(err)
-		}
 		rootConfig := KubeConfig{
 			URL:        fmt.Sprintf("https://[%s]:6443", c.networking.NodeAddress.IP.String()),
 			CACert:     c.pki.TLS.CertPath(),
 			ClientKey:  c.masterCerts.RootClient.KeyPath(),
 			ClientCert: c.masterCerts.RootClient.CertPath(),
 		}
-		err = rootConfig.Write(path.Join(homeDir, ".kube/config"))
-		if err != nil {
-			logrus.Fatal(err)
-		}
+		WriteConfig(rootConfig, path.Join(homeDir, ".kube/config"))
 	}
 }
diff --git a/pkg/cluster/kubeconfig.go b/pkg/cluster/kubeconfig.go
index 05e0da5..c5c945c 100644
--- a/pkg/cluster/kubeconfig.go
+++ b/pkg/cluster/kubeconfig.go
@@ -2,9 +2,33 @@ package cluster
 
 import (
 	"os"
+  "path"
 	"text/template"
+
+  "github.com/sirupsen/logrus"
 )
 
+type WriteableConfig interface {
+  Template() string
+}
+
+func WriteConfig(c WriteableConfig, dest string) {
+  t, _ := template.New("template").Parse(c.Template())
+  err := os.MkdirAll(path.Dir(dest), 0o755)
+  if err != nil {
+    logrus.Fatal(err)
+  }
+  file, err := os.Create(dest)
+  if err != nil {
+    logrus.Fatal(err)
+  }
+  defer file.Close()
+  err = t.Execute(file, c)
+  if err != nil {
+    logrus.Fatal(err)
+  }
+}
+
 const kubeconfigTemplate = `
 apiVersion: v1
 clusters:
@@ -35,14 +59,8 @@ type KubeConfig struct {
 	ClientKey  string
 }
 
-func (k *KubeConfig) Write(path string) error {
-	t, _ := template.New("kubeconfig").Parse(kubeconfigTemplate)
-	file, err := os.Create(path)
-	if err != nil {
-		return err
-	}
-	defer file.Close()
-	return t.Execute(file, k)
+func (KubeConfig) Template() string {
+  return kubeconfigTemplate
 }
 
 const kubeletConfigTemplate = `
@@ -77,14 +95,8 @@ type KubeletConfig struct {
 	TLSKey  string
 }
 
-func (k *KubeletConfig) Write(path string) error {
-	t, _ := template.New("kubeletconfig").Parse(kubeletConfigTemplate)
-	file, err := os.Create(path)
-	if err != nil {
-		return err
-	}
-	defer file.Close()
-	return t.Execute(file, k)
+func (KubeletConfig) Template() string {
+  return kubeletConfigTemplate
 }
 
 const containerdTemplate = `
@@ -109,12 +121,6 @@ type ContainerdConfig struct {
 	Socket  string
 }
 
-func (c *ContainerdConfig) Write(path string) error {
-	t, _ := template.New("containerd").Parse(containerdTemplate)
-	file, err := os.Create(path)
-	if err != nil {
-		return err
-	}
-	defer file.Close()
-	return t.Execute(file, c)
+func (ContainerdConfig) Template() string {
+  return containerdTemplate
 }
diff --git a/pkg/cluster/services.go b/pkg/cluster/services.go
index 7c34652..1f1e795 100644
--- a/pkg/cluster/services.go
+++ b/pkg/cluster/services.go
@@ -97,10 +97,7 @@ func (s *ClusterServices) startK8sMaster(net *ClusterNetworking, ca *pki.Cluster
 		ClientKey:  certs.ControllersAPI.KeyPath(),
 	}
 	cmConfigPath := "/cm.yaml"
-	err = cmConfig.Write(cmConfigPath)
-	if err != nil {
-		logrus.Fatal(err)
-	}
+  WriteConfig(cmConfig, cmConfigPath)
 	cm, err := wrappers.ControllerManager(s.ctx, []string{
 		"--kubeconfig", cmConfigPath,
 		"--tls-cert-file", certs.ControllersTLS.CertPath(),
@@ -118,10 +115,7 @@ func (s *ClusterServices) startK8sMaster(net *ClusterNetworking, ca *pki.Cluster
 		ClientKey:  certs.SchedulerAPI.KeyPath(),
 	}
 	schedulerConfigPath := "/scheduler.yaml"
-	err = schedulerConfig.Write(schedulerConfigPath)
-	if err != nil {
-		logrus.Fatal(err)
-	}
+	WriteConfig(schedulerConfig, schedulerConfigPath)
 	scheduler, err := wrappers.Scheduler(s.ctx, []string{
 		"--kubeconfig", schedulerConfigPath,
 	})
@@ -140,7 +134,7 @@ func (s *ClusterServices) startK8sNode(master net.IP, ca *pki.ClusterCA, certs *
 		Socket:  "/containerd.sock",
 	}
 	containerdConfigPath := "/containerd.toml"
-	containerdConfig.Write(containerdConfigPath)
+	WriteConfig(containerdConfig, containerdConfigPath)
 	containerd, err := wrappers.Containerd(s.ctx, []string{
 		"--config", containerdConfigPath,
 	})
@@ -155,14 +149,14 @@ func (s *ClusterServices) startK8sNode(master net.IP, ca *pki.ClusterCA, certs *
 		ClientKey:  certs.API.KeyPath(),
 	}
 	kubeletKubeConfigPath := "/kubelet-kubeconfig.yaml"
-	kubeletKubeConfig.Write(kubeletKubeConfigPath)
+	WriteConfig(kubeletKubeConfig, kubeletKubeConfigPath)
 	kubeletConfig := KubeletConfig{
 		CACert:  ca.Kubelet.CertPath(),
 		TLSCert: certs.TLS.CertPath(),
 		TLSKey:  certs.TLS.KeyPath(),
 	}
 	kubeletConfigPath := "/kubelet.yaml"
-	kubeletConfig.Write(kubeletConfigPath)
+	WriteConfig(kubeletConfig, kubeletConfigPath)
 	kubelet, err := wrappers.Kubelet(s.ctx, []string{
 		"--kubeconfig", kubeletKubeConfigPath,
 		"--config", kubeletConfigPath,
-- 
GitLab