From cb138ee9fbace11035919ced20fd457cc60899ed Mon Sep 17 00:00:00 2001
From: kaiyou <dev@kaiyou.fr>
Date: Wed, 26 Apr 2023 22:45:50 +0200
Subject: [PATCH] Enable volume management controllers

---
 services/cm.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 3 deletions(-)

diff --git a/services/cm.go b/services/cm.go
index 1009573..6fc47d5 100644
--- a/services/cm.go
+++ b/services/cm.go
@@ -24,10 +24,15 @@ import (
 	"k8s.io/kubernetes/pkg/controller/serviceaccount"
 	"k8s.io/kubernetes/pkg/controller/ttl"
 	"k8s.io/kubernetes/pkg/controller/ttlafterfinished"
+	"k8s.io/kubernetes/pkg/controller/volume/attachdetach"
 	"k8s.io/kubernetes/pkg/controller/volume/ephemeral"
+	"k8s.io/kubernetes/pkg/controller/volume/persistentvolume"
 	"k8s.io/kubernetes/pkg/controller/volume/pvcprotection"
 	"k8s.io/kubernetes/pkg/controller/volume/pvprotection"
+	"k8s.io/kubernetes/pkg/proxy/util"
 	"k8s.io/kubernetes/pkg/quota/v1/install"
+	"k8s.io/kubernetes/pkg/volume"
+	"k8s.io/kubernetes/pkg/volume/csi"
 )
 
 var kubeControllerManager = &Unit{
@@ -37,7 +42,7 @@ var kubeControllerManager = &Unit{
 		// Used as a replacement for InformersStarted in vanilla code
 		allReady := make(chan struct{})
 
-		clients, err := newClients(c, c.networking.NodeAddress.IP, c.masterCerts.SchedulerAPI)
+		clients, err := newClients(c, c.networking.NodeAddress.IP, c.masterCerts.ControllersAPI)
 		if err != nil {
 			return err
 		}
@@ -157,7 +162,7 @@ var kubeControllerManager = &Unit{
 
 		// TODO: improve performance if required (see vanilla code)
 		// Namespace controller
-		namespace.NewNamespaceController(
+		go namespace.NewNamespaceController(
 			clients.Client, clients.MetadataClient,
 			clients.Client.Discovery().ServerPreferredNamespacedResources,
 			clients.Informer.Core().V1().Namespaces(),
@@ -175,7 +180,7 @@ var kubeControllerManager = &Unit{
 		if err != nil {
 			return fmt.Errorf("could not initialize sa controller: %w", err)
 		}
-		saController.Run(ctx, 1)
+		go saController.Run(ctx, 1)
 
 		// TTL controller
 		go ttl.NewTTLController(
@@ -225,6 +230,53 @@ var kubeControllerManager = &Unit{
 		go gc.Run(ctx, 1)
 		go gc.Sync(clients.Client.DiscoveryClient, 30*time.Second, ctx.Done())
 
+		// Volume binder
+		dialOptions := util.FilteredDialOptions{DialHostCIDRDenylist: []*net.IPNet{}, AllowLocalLoopback: true}
+		bindable := []volume.VolumePlugin{}
+		bindable = append(bindable, csi.ProbeVolumePlugins()...)
+		volumeController, err := persistentvolume.NewController(persistentvolume.ControllerParameters{
+			KubeClient:                clients.Client,
+			SyncPeriod:                15 * time.Second, // default
+			ClusterName:               c.settings.Name,
+			VolumeInformer:            clients.Informer.Core().V1().PersistentVolumes(),
+			ClaimInformer:             clients.Informer.Core().V1().PersistentVolumeClaims(),
+			ClassInformer:             clients.Informer.Storage().V1().StorageClasses(),
+			PodInformer:               clients.Informer.Core().V1().Pods(),
+			NodeInformer:              clients.Informer.Core().V1().Nodes(),
+			EnableDynamicProvisioning: false,
+			VolumePlugins:             bindable,
+			FilteredDialOptions:       &dialOptions,
+		})
+		if err != nil {
+			return fmt.Errorf("could not initialize volume binder: %w", err)
+		}
+		go volumeController.Run(ctx)
+
+		// Volume attacher
+		attachable := []volume.VolumePlugin{}
+		attachable = append(attachable, csi.ProbeVolumePlugins()...)
+		attachController, err := attachdetach.NewAttachDetachController(
+			clients.Client,
+			clients.Informer.Core().V1().Pods(),
+			clients.Informer.Core().V1().Nodes(),
+			clients.Informer.Core().V1().PersistentVolumeClaims(),
+			clients.Informer.Core().V1().PersistentVolumes(),
+			clients.Informer.Storage().V1().CSINodes(),
+			clients.Informer.Storage().V1().CSIDrivers(),
+			clients.Informer.Storage().V1().VolumeAttachments(),
+			nil,            // cloud provider
+			attachable,     // volume plugins
+			nil,            // dynamic plugin prober
+			false,          // disable attach detach reconciler
+			60*time.Second, // default
+			attachdetach.DefaultTimerConfig,
+			&dialOptions,
+		)
+		if err != nil {
+			return fmt.Errorf("could not initialize volume attacher: %w", err)
+		}
+		go attachController.Run(ctx.Done())
+
 		close(allReady)
 		return nil
 	},
-- 
GitLab