Skip to content

Commit 8d3ab2b

Browse files
michi-covalentjrfastab
authored andcommitted
Refactor waitCRDs function
Move the logic to wait for CRDs to pkg/manager package to keep main.go slightly cleaner. Signed-off-by: Michi Mutsuzaki <[email protected]>
1 parent 6724499 commit 8d3ab2b

File tree

8 files changed

+56
-304
lines changed

8 files changed

+56
-304
lines changed

cmd/tetragon/main.go

+15-56
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,8 @@ import (
6666
"github.com/spf13/viper"
6767
"google.golang.org/grpc"
6868
"google.golang.org/protobuf/types/known/durationpb"
69-
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
70-
apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
71-
apiextensionsinformer "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
7269
"k8s.io/client-go/kubernetes"
7370
"k8s.io/client-go/rest"
74-
"k8s.io/client-go/tools/cache"
7571
)
7672

7773
var (
@@ -401,8 +397,22 @@ func tetragonExecuteCtx(ctx context.Context, cancel context.CancelFunc, ready fu
401397
// Start controller-runtime manager.
402398
controllerManager = manager.Get()
403399
controllerManager.Start(ctx)
400+
crds := make(map[string]struct{})
401+
if option.Config.EnableTracingPolicyCRD {
402+
crds[v1alpha1.TPName] = struct{}{}
403+
crds[v1alpha1.TPNamespacedName] = struct{}{}
404+
}
405+
if option.Config.EnablePodInfo {
406+
crds[v1alpha1.PIName] = struct{}{}
407+
}
408+
if len(crds) > 0 {
409+
err = controllerManager.WaitCRDs(ctx, crds)
410+
if err != nil {
411+
return err
412+
}
413+
}
404414
// retrieve k8s clients
405-
k8sClient, _, err = watcher.GetK8sClients(waitCRDs)
415+
k8sClient, _, err = watcher.GetK8sClients(func(_ *rest.Config) error { return nil })
406416
if err != nil {
407417
return err
408418
}
@@ -539,57 +549,6 @@ func tetragonExecuteCtx(ctx context.Context, cancel context.CancelFunc, ready fu
539549
return obs.StartReady(ctx, ready)
540550
}
541551

542-
func waitCRDs(config *rest.Config) error {
543-
crds := make(map[string]struct{})
544-
545-
if option.Config.EnableTracingPolicyCRD {
546-
crds[v1alpha1.TPName] = struct{}{}
547-
crds[v1alpha1.TPNamespacedName] = struct{}{}
548-
}
549-
if option.Config.EnablePodInfo {
550-
crds[v1alpha1.PIName] = struct{}{}
551-
}
552-
553-
if len(crds) == 0 {
554-
log.Info("No CRDs are enabled")
555-
return nil
556-
}
557-
558-
log.WithField("crds", crds).Info("Waiting for required CRDs")
559-
var wg sync.WaitGroup
560-
wg.Add(1)
561-
crdClient := apiextensionsclientset.NewForConfigOrDie(config)
562-
crdInformer := apiextensionsinformer.NewCustomResourceDefinitionInformer(crdClient, 0*time.Second, nil)
563-
_, err := crdInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
564-
AddFunc: func(obj interface{}) {
565-
crdObject, ok := obj.(*v1.CustomResourceDefinition)
566-
if !ok {
567-
log.WithField("obj", obj).Warn("Received an invalid object")
568-
return
569-
}
570-
if _, ok := crds[crdObject.Name]; ok {
571-
log.WithField("crd", crdObject.Name).Info("Found CRD")
572-
delete(crds, crdObject.Name)
573-
if len(crds) == 0 {
574-
log.Info("Found all the required CRDs")
575-
wg.Done()
576-
}
577-
}
578-
},
579-
})
580-
if err != nil {
581-
log.WithError(err).Error("failed to add event handler")
582-
return err
583-
}
584-
stop := make(chan struct{})
585-
go func() {
586-
crdInformer.Run(stop)
587-
}()
588-
wg.Wait()
589-
close(stop)
590-
return nil
591-
}
592-
593552
func loadTpFromDir(ctx context.Context, dir string) error {
594553
if _, err := os.Stat(dir); err != nil {
595554
// Do not fail if the default directory doesn't exist,

pkg/manager/manager.go

+41
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ import (
1111
"github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1"
1212
"github.com/cilium/tetragon/pkg/logger"
1313
corev1 "k8s.io/api/core/v1"
14+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/types"
1617
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1718
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
19+
"k8s.io/client-go/tools/cache"
1820
ctrl "sigs.k8s.io/controller-runtime"
1921
"sigs.k8s.io/controller-runtime/pkg/client"
2022
ctrlManager "sigs.k8s.io/controller-runtime/pkg/manager"
@@ -38,6 +40,7 @@ func Get() *ControllerManager {
3840
scheme := runtime.NewScheme()
3941
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
4042
utilruntime.Must(v1alpha1.AddToScheme(scheme))
43+
utilruntime.Must(apiextensionsv1.AddToScheme(scheme))
4144
controllerManager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme})
4245
if err != nil {
4346
panic(err)
@@ -75,3 +78,41 @@ func (cm *ControllerManager) ListNamespaces() ([]corev1.Namespace, error) {
7578
}
7679
return namespaceList.Items, nil
7780
}
81+
82+
func (cm *ControllerManager) WaitCRDs(ctx context.Context, crds map[string]struct{}) error {
83+
log := logger.GetLogger()
84+
log.WithField("crds", crds).Info("Waiting for required CRDs")
85+
var wg sync.WaitGroup
86+
wg.Add(1)
87+
crdInformer, err := cm.Manager.GetCache().GetInformer(ctx, &apiextensionsv1.CustomResourceDefinition{})
88+
if err != nil {
89+
return err
90+
}
91+
_, err = crdInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
92+
AddFunc: func(obj interface{}) {
93+
crdObject, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
94+
if !ok {
95+
log.WithField("obj", obj).Warn("Received an invalid object")
96+
return
97+
}
98+
if _, ok := crds[crdObject.Name]; ok {
99+
log.WithField("crd", crdObject.Name).Info("Found CRD")
100+
delete(crds, crdObject.Name)
101+
if len(crds) == 0 {
102+
log.Info("Found all the required CRDs")
103+
wg.Done()
104+
}
105+
}
106+
},
107+
})
108+
if err != nil {
109+
log.WithError(err).Error("failed to add event handler")
110+
return err
111+
}
112+
wg.Wait()
113+
err = cm.Manager.GetCache().RemoveInformer(ctx, &apiextensionsv1.CustomResourceDefinition{})
114+
if err != nil {
115+
log.WithError(err).Warn("failed to remove CRD informer")
116+
}
117+
return nil
118+
}

vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/customresourcedefinition.go

-89
This file was deleted.

vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/interface.go

-45
This file was deleted.

vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go

-40
This file was deleted.

vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1/customresourcedefinition.go

-48
This file was deleted.

0 commit comments

Comments
 (0)