From ff7dd6f2a9aa804392755ab1b57d9812bd5d76b7 Mon Sep 17 00:00:00 2001
From: kaiyou <dev@kaiyou.fr>
Date: Sun, 2 Apr 2023 12:35:01 +0200
Subject: [PATCH] Inject the data directory into the service modules

---
 cmd/hepto/config.go    |  8 +-------
 cmd/hepto/service.go   |  1 +
 services/certs.go      |  8 +++-----
 services/containerd.go | 14 ++++++--------
 services/etcd.go       |  5 ++---
 services/k8s.go        | 15 ++++++++++-----
 services/manager.go    |  4 +++-
 7 files changed, 26 insertions(+), 29 deletions(-)

diff --git a/cmd/hepto/config.go b/cmd/hepto/config.go
index b8c2e76..603ce94 100644
--- a/cmd/hepto/config.go
+++ b/cmd/hepto/config.go
@@ -51,13 +51,7 @@ func (c *Config) SetupContainer() error {
 		return err
 	}
 	// Setup data persistence mounts
-	c.Container.Mounts[services.CertsPath] = path.Join(c.Container.Data, "/certs")
-	if c.Node.Role == "master" || c.Node.Role == "full" {
-		c.Container.Mounts[services.EtcdPath] = path.Join(c.Container.Data, "/etcd")
-	}
-	if c.Node.Role == "node" || c.Node.Role == "full" {
-		c.Container.Mounts[services.ContainerdPath] = path.Join(c.Container.Data, "/containerd")
-	}
+	c.Container.Mounts[c.Cluster.DataDir] = c.Container.Data
 	// Set the container IP mask if required, defaults to /64
 	if len(c.Container.IP.Mask) == 0 {
 		mask := c.Container.IP.IP.DefaultMask()
diff --git a/cmd/hepto/service.go b/cmd/hepto/service.go
index ba85280..6a34a10 100644
--- a/cmd/hepto/service.go
+++ b/cmd/hepto/service.go
@@ -23,6 +23,7 @@ var Hepto = &cobra.Command{
 	Long: `Hepto is a Kubernetes distribution designed for geo-distributed
 	deployments, including across links with noticeable latency.`,
 	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
+		config.Cluster.DataDir = "/data"
 		// Print version if requested, verflag flags are declared
 		// by init() functions deep in k8s code
 		verflag.PrintAndExitIfRequested()
diff --git a/services/certs.go b/services/certs.go
index 6499759..8f7a654 100644
--- a/services/certs.go
+++ b/services/certs.go
@@ -8,8 +8,6 @@ import (
 	"go.acides.org/pekahi"
 )
 
-const CertsPath = "/certs"
-
 // Cluster PKI is made of three different CAs
 type ClusterCA struct {
 	// Signs services exposed over the cluster
@@ -52,7 +50,7 @@ type NodeCerts struct {
 var pkiManager = &Unit{
 	Name: "pki-manager",
 	Start: func(u *Unit, c *Cluster, ctx context.Context) error {
-		bundle, err := pekahi.NewFileBundle(path.Join(CertsPath, "pki"))
+		bundle, err := pekahi.NewFileBundle(path.Join(c.settings.DataDir, "pki/ca"))
 		if err != nil {
 			return err
 		}
@@ -103,7 +101,7 @@ var pkiMaster = &Unit{
 	Dependencies: []*Unit{pkiManager},
 	Start: func(u *Unit, c *Cluster, ctx context.Context) error {
 		// See: https://kubernetes.io/docs/setup/best-practices/certificates/
-		bundle, err := pekahi.NewFileBundle(path.Join(CertsPath, "master"))
+		bundle, err := pekahi.NewFileBundle(path.Join(c.settings.DataDir, "pki/master"))
 		if err != nil {
 			return err
 		}
@@ -187,7 +185,7 @@ var pkiNode = &Unit{
 	Name: "pki-node",
 	Start: func(u *Unit, c *Cluster, ctx context.Context) error {
 		// See: https://kubernetes.io/docs/setup/best-practices/certificates/
-		bundle, err := pekahi.NewFileBundle(path.Join(CertsPath, "node"))
+		bundle, err := pekahi.NewFileBundle(path.Join(c.settings.DataDir, "pki/node"))
 		if err != nil {
 			return err
 		}
diff --git a/services/containerd.go b/services/containerd.go
index 244f526..f6becc2 100644
--- a/services/containerd.go
+++ b/services/containerd.go
@@ -3,6 +3,7 @@ package services
 import (
 	"context"
 	"os"
+	"path"
 	"strings"
 
 	"github.com/containerd/containerd/defaults"
@@ -41,11 +42,8 @@ import (
 )
 
 const (
-	ContainerdPath       = "/containerd"
-	ContainerdSocket     = "/run/containerd.sock"
-	ContainerdTTRPC      = "/run/containerd.sock.ttrpc"
-	ContainerdState      = "/run/containerd"
-	ContainerdTempMounts = "/run/containerd/tmpmounts"
+	ContainerdSocket = "/containerd.sock"
+	ContainerdTTRPC  = "/containerd.sock.ttrpc"
 )
 
 var containerd = &Unit{
@@ -60,8 +58,8 @@ var containerd = &Unit{
 		}
 		cfg := &config.Config{
 			Version: 2,
-			Root:    ContainerdPath,
-			State:   ContainerdState,
+			Root:    path.Join(c.settings.DataDir, "containerd"),
+			State:   "/containerd",
 			GRPC: config.GRPCConfig{
 				Address:        ContainerdSocket,
 				MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize,
@@ -76,7 +74,7 @@ var containerd = &Unit{
 		if err != nil {
 			return err
 		}
-		err = mount.SetTempMountLocation(ContainerdTempMounts)
+		err = mount.SetTempMountLocation("/containerd/mounts")
 		if err != nil {
 			return err
 		}
diff --git a/services/etcd.go b/services/etcd.go
index e390ede..bcbfd0d 100644
--- a/services/etcd.go
+++ b/services/etcd.go
@@ -3,18 +3,17 @@ package services
 import (
 	"context"
 	"fmt"
+	"path"
 
 	"go.etcd.io/etcd/server/v3/embed"
 )
 
-var EtcdPath = "/etcd"
-
 var etcd = &Unit{
 	Name:         "etcd",
 	Dependencies: []*Unit{pkiMaster},
 	Run: func(u *Unit, c *Cluster, ctx context.Context) error {
 		config := embed.NewConfig()
-		config.Dir = EtcdPath
+		config.Dir = path.Join(c.settings.DataDir, "etcd")
 		config.AuthToken = fmt.Sprintf("jwt,priv-key=%s,sign-method=ES256", c.masterCerts.EtcdTokens.KeyPath())
 		config.ZapLoggerBuilder = embed.NewZapLoggerBuilder(c.settings.ZapLogger)
 		server, err := embed.StartEtcd(config)
diff --git a/services/k8s.go b/services/k8s.go
index d99caee..97ff677 100644
--- a/services/k8s.go
+++ b/services/k8s.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"path"
+	"time"
 
 	"github.com/spf13/pflag"
 	"go.acides.org/hepto/utils"
@@ -30,8 +31,6 @@ import (
 	"k8s.io/kubernetes/pkg/util/filesystem"
 )
 
-var configPath = "/etc"
-
 var kubeLogger = &Unit{
 	Name: "kube-logger",
 	Start: func(u *Unit, c *Cluster, ctx context.Context) error {
@@ -124,7 +123,7 @@ var kubeControllerManager = &Unit{
 			ClientCert: c.masterCerts.ControllersAPI.CertPath(),
 			ClientKey:  c.masterCerts.ControllersAPI.KeyPath(),
 		}
-		cmConfigPath := path.Join(configPath, "controller-manager.yaml")
+		cmConfigPath := "/controller-manager.yaml"
 		err := utils.WriteConfig(cmConfig, cmConfigPath)
 		if err != nil {
 			return err
@@ -211,28 +210,32 @@ var kubeKubelet = &Unit{
 	Name:         "kubelet",
 	Dependencies: []*Unit{masterDiscovery, containerdGRPC, containerdTTRPC, pkiCA, pkiNode, kubeLogger},
 	Run: func(u *Unit, c *Cluster, ctx context.Context) error {
+		time.Sleep(10 * time.Second)
+		dataPath := path.Join(c.settings.DataDir, "kubelet")
 		kubeletKubeConfig := KubeConfig{
 			URL:        fmt.Sprintf("https://[%s]:6443", c.masterNode.VpnIP.String()),
 			CACert:     c.pki.TLS.CertPath(),
 			ClientCert: c.certs.API.CertPath(),
 			ClientKey:  c.certs.API.KeyPath(),
 		}
-		kubeletKubeConfigPath := path.Join(configPath, "kubelet-kubeconfig.yaml")
+		kubeletKubeConfigPath := "/kubelet-kubeconfig.yaml"
 		err := utils.WriteConfig(kubeletKubeConfig, kubeletKubeConfigPath)
 		if err != nil {
 			return err
 		}
 		kubeletConfig := KubeletConfig{
+			Data:    dataPath,
 			CACert:  c.pki.Kubelet.CertPath(),
 			TLSCert: c.certs.TLS.CertPath(),
 			TLSKey:  c.certs.TLS.KeyPath(),
 		}
-		kubeletConfigPath := path.Join(configPath, "kubelet.yaml")
+		kubeletConfigPath := "/kubelet.yaml"
 		err = utils.WriteConfig(kubeletConfig, kubeletConfigPath)
 		if err != nil {
 			return err
 		}
 		args := []string{
+			"--root-dir", dataPath,
 			"--kubeconfig", kubeletKubeConfigPath,
 			"--config", kubeletConfigPath,
 			"--container-runtime-endpoint", "unix://" + ContainerdSocket,
@@ -351,9 +354,11 @@ fileCheckFrequency: 1m
 httpCheckFrequency: 1m
 nodeStatusUpdateFrequency: 20s
 nodeStatusReportFrequency: 5m
+volumePluginDir: "{{.Data}}/volume-plugins"
 `
 
 type KubeletConfig struct {
+	Data    string
 	CACert  string
 	TLSCert string
 	TLSKey  string
diff --git a/services/manager.go b/services/manager.go
index 2a1e04b..6954a5e 100644
--- a/services/manager.go
+++ b/services/manager.go
@@ -18,6 +18,8 @@ import (
 )
 
 type ClusterSettings struct {
+	// Data storage path
+	DataDir string
 	// Logger interface
 	Logger logr.Logger
 	// Concrete zap logger for etcd
@@ -74,7 +76,7 @@ type Unit = daeman.Unit[*Cluster]
 func NewManager(settings *ClusterSettings, node *NodeSettings, logger logr.Logger) (*daeman.Manager[*Cluster], error) {
 	networking := NewClusterNetworking(settings.Name, node.Name)
 	// Initialize an empty pki for discovery
-	bundle, err := pekahi.NewFileBundle(path.Join(CertsPath, "pki"))
+	bundle, err := pekahi.NewFileBundle(path.Join(settings.DataDir, "pki/ca"))
 	if err != nil {
 		return nil, err
 	}
-- 
GitLab