Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
iltyty committed Sep 30, 2024
1 parent bdcc943 commit d9be60d
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 46 deletions.
6 changes: 1 addition & 5 deletions cmd/csi-external-health-monitor-controller/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,7 @@ func main() {
logger,
clientset,
csiConn,
factory.Core().V1().PersistentVolumes(),
factory.Core().V1().PersistentVolumeClaims(),
factory.Core().V1().Pods(),
factory.Core().V1().Nodes(),
factory.Core().V1().Events(),
factory,
eventRecorder,
&option,
)
Expand Down
104 changes: 63 additions & 41 deletions pkg/controller/pv_monitor_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import (
apierrs "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/wait"
coreinformers "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
corelisters "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/cache"
Expand Down Expand Up @@ -100,15 +100,10 @@ func NewPVMonitorController(
logger klog.Logger,
client kubernetes.Interface,
conn *grpc.ClientConn,
pvInformer coreinformers.PersistentVolumeInformer,
pvcInformer coreinformers.PersistentVolumeClaimInformer,
podInformer coreinformers.PodInformer,
nodeInformer coreinformers.NodeInformer,
eventInformer coreinformers.EventInformer,
factory informers.SharedInformerFactory,
eventRecorder record.EventRecorder,
option *PVMonitorOptions,
) *PVMonitorController {

ctrl := &PVMonitorController{
csiConn: conn,
eventRecorder: eventRecorder,
Expand All @@ -125,30 +120,34 @@ func NewPVMonitorController(
PVWorkerExecuteInterval: option.PVWorkerExecuteInterval,
VolumeListAndAddInterval: option.VolumeListAndAddInterval,
}
ctrl.setupPVInformer(factory)
ctrl.setupPVCInformer(factory)
ctrl.setupEventInformer(factory)
ctrl.setupPVChecker(factory, client, conn, option)
ctrl.setupPodNodeInformersIfNecessary(factory, logger, option)
return ctrl
}

// PV informer
pvInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
func (ctrl *PVMonitorController) setupPVInformer(factory informers.SharedInformerFactory) {
informer := factory.Core().V1().PersistentVolumes()
informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: ctrl.pvAdded,
// we do not care about PV changes, so do not need UpdateFunc here.
// deleted PVs will not be readded to the queue, so do not need DeleteFunc here
})
ctrl.pvLister = pvInformer.Lister()
ctrl.pvListerSynced = pvInformer.Informer().HasSynced

// PVC informer
ctrl.pvcLister = pvcInformer.Lister()
ctrl.pvcListerSynced = pvcInformer.Informer().HasSynced
ctrl.pvLister = informer.Lister()
ctrl.pvListerSynced = informer.Informer().HasSynced
}

// Pod informer
podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: ctrl.podAdded,
// UpdateFunc: ctrl.podUpdated, TODO: do we need this ?
DeleteFunc: ctrl.podDeleted,
})
ctrl.podLister = podInformer.Lister()
ctrl.podListerSynced = podInformer.Informer().HasSynced
func (ctrl *PVMonitorController) setupPVCInformer(factory informers.SharedInformerFactory) {
informer := factory.Core().V1().PersistentVolumeClaims()
ctrl.pvcLister = informer.Lister()
ctrl.pvcListerSynced = informer.Informer().HasSynced
}

eventInformer.Informer().AddIndexers(cache.Indexers{
func (ctrl *PVMonitorController) setupEventInformer(factory informers.SharedInformerFactory) {
informer := factory.Core().V1().Events()
informer.Informer().AddIndexers(cache.Indexers{
util.DefaultEventIndexerName: func(obj interface{}) ([]string, error) {
event := obj.(*v1.Event)
if event != nil {
Expand All @@ -159,34 +158,57 @@ func NewPVMonitorController(
}
},
})
}

if ctrl.enableNodeWatcher {
ctrl.nodeWatcher = NewNodeWatcher(
logger,
ctrl.driverName,
ctrl.client,
ctrl.pvLister,
ctrl.pvcLister,
nodeInformer,
ctrl.eventRecorder,
ctrl.pvcToPodsCache,
option.NodeWorkerExecuteInterval,
option.NodeListAndAddInterval,
)
}

func (ctrl *PVMonitorController) setupPVChecker(
factory informers.SharedInformerFactory,
client kubernetes.Interface,
conn *grpc.ClientConn,
option *PVMonitorOptions,
) {
ctrl.pvChecker = handler.NewPVHealthConditionChecker(
option.DriverName,
conn,
client,
option.ContextTimeout,
ctrl.pvcLister,
ctrl.pvLister,
eventInformer,
factory.Core().V1().Events(),
ctrl.eventRecorder,
)
}

return ctrl
func (ctrl *PVMonitorController) setupPodNodeInformersIfNecessary(factory informers.SharedInformerFactory, logger klog.Logger, option *PVMonitorOptions) {
if ctrl.enableNodeWatcher {
ctrl.setupPodInformer(factory)
ctrl.setupNodeWatcher(factory, logger, option)
}
}

func (ctrl *PVMonitorController) setupPodInformer(factory informers.SharedInformerFactory) {
informer := factory.Core().V1().Pods()
informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: ctrl.podAdded,
// UpdateFunc: ctrl.podUpdated, TODO: do we need this ?
DeleteFunc: ctrl.podDeleted,
})
ctrl.podLister = informer.Lister()
ctrl.podListerSynced = informer.Informer().HasSynced
}

func (ctrl *PVMonitorController) setupNodeWatcher(factory informers.SharedInformerFactory, logger klog.Logger, option *PVMonitorOptions) {
ctrl.nodeWatcher = NewNodeWatcher(
logger,
ctrl.driverName,
ctrl.client,
ctrl.pvLister,
ctrl.pvcLister,
factory.Core().V1().Nodes(),
ctrl.eventRecorder,
ctrl.pvcToPodsCache,
option.NodeWorkerExecuteInterval,
option.NodeListAndAddInterval,
)
}

// Run runs the volume health condition checking method
Expand Down

0 comments on commit d9be60d

Please sign in to comment.