add --controllers option in ks-controller-manager

imple controller enable/disable check logic
add unittest for selective controller enable/disable
move all controllers init code to a single place
This commit is contained in:
live77
2021-12-01 23:38:30 +08:00
parent 6ed02d3059
commit 81db894741
7 changed files with 618 additions and 374 deletions

View File

@@ -18,11 +18,11 @@ package helmcategory
import (
"context"
ctrl "sigs.k8s.io/controller-runtime"
"time"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/record"
@@ -46,15 +46,6 @@ const (
HelmCategoryFinalizer = "helmcategories.application.kubesphere.io"
)
func Add(mgr manager.Manager) error {
return add(mgr, newReconciler(mgr))
}
// newReconciler returns a new reconcile.Reconciler
func newReconciler(mgr manager.Manager) reconcile.Reconciler {
return &ReconcileHelmCategory{Client: mgr.GetClient(), Scheme: mgr.GetScheme()}
}
// add adds a new Controller to mgr with r as the reconcile.Reconciler
func add(mgr manager.Manager, r reconcile.Reconciler) error {
// Create a new controller
@@ -185,11 +176,16 @@ var _ reconcile.Reconciler = &ReconcileHelmCategory{}
// ReconcileWorkspace reconciles a Workspace object
type ReconcileHelmCategory struct {
client.Client
Scheme *runtime.Scheme
//Scheme *runtime.Scheme
recorder record.EventRecorder
config *rest.Config
}
func (r *ReconcileHelmCategory) SetupWithManager(mgr ctrl.Manager) error {
r.Client = mgr.GetClient()
return add(mgr, r)
}
// Reconcile reads that state of the cluster for a helmcategories object and makes changes based on the state read
// and what is in the helmreleases.Spec
// +kubebuilder:rbac:groups=application.kubesphere.io,resources=helmcategories,verbs=get;list;watch;create;update;patch;delete

View File

@@ -19,6 +19,7 @@ package helmrepo
import (
"context"
"math"
ctrl "sigs.k8s.io/controller-runtime"
"time"
"k8s.io/apimachinery/pkg/api/errors"
@@ -57,20 +58,6 @@ const (
HelmRepoFinalizer = "helmrepo.application.kubesphere.io"
)
// Add creates a new Workspace Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller
// and Start it when the Manager is Started.
func Add(mgr manager.Manager) error {
return add(mgr, newReconciler(mgr))
}
// newReconciler returns a new reconcile.Reconciler
func newReconciler(mgr manager.Manager) reconcile.Reconciler {
return &ReconcileHelmRepo{Client: mgr.GetClient(), scheme: mgr.GetScheme(),
recorder: mgr.GetEventRecorderFor("workspace-controller"),
config: mgr.GetConfig(),
}
}
// add adds a new Controller to mgr with r as the reconcile.Reconciler
func add(mgr manager.Manager, r reconcile.Reconciler) error {
// Create a new controller
@@ -98,6 +85,13 @@ type ReconcileHelmRepo struct {
config *rest.Config
}
func (r *ReconcileHelmRepo) SetupWithManager(mgr ctrl.Manager) error {
r.scheme = mgr.GetScheme()
r.recorder = mgr.GetEventRecorderFor("workspace-controller")
r.config = mgr.GetConfig()
return add(mgr, r)
}
// Reconcile reads that state of the cluster for a helmrepoes object and makes changes based on the state read
// and what is in the helmreleases.Spec
// +kubebuilder:rbac:groups=application.kubesphere.io,resources=helmrepos,verbs=get;list;watch;create;update;patch;delete

View File

@@ -70,32 +70,34 @@ type Reconciler struct {
client.Client
logger logr.Logger
recorder record.EventRecorder
maxConcurrentReconciles int
// Knows how to calculate usage
registry quotav1.Registry
MaxConcurrentReconciles int
// Controls full recalculation of quota usage
resyncPeriod time.Duration
ResyncPeriod time.Duration
InformerFactory k8sinformers.SharedInformerFactory
scheme *runtime.Scheme
}
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, maxConcurrentReconciles int, resyncPeriod time.Duration, informerFactory k8sinformers.SharedInformerFactory) error {
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
r.logger = ctrl.Log.WithName("controllers").WithName(ControllerName)
r.recorder = mgr.GetEventRecorderFor(ControllerName)
r.scheme = mgr.GetScheme()
r.registry = generic.NewRegistry(install.NewQuotaConfigurationForControllers(generic.ListerFuncForResourceFunc(informerFactory.ForResource)).Evaluators())
r.registry = generic.NewRegistry(install.NewQuotaConfigurationForControllers(
generic.ListerFuncForResourceFunc(r.InformerFactory.ForResource)).Evaluators())
if r.Client == nil {
r.Client = mgr.GetClient()
}
if maxConcurrentReconciles > 0 {
r.maxConcurrentReconciles = maxConcurrentReconciles
} else {
r.maxConcurrentReconciles = DefaultMaxConcurrentReconciles
if r.MaxConcurrentReconciles <= 0 {
r.MaxConcurrentReconciles = DefaultMaxConcurrentReconciles
}
r.resyncPeriod = time.Duration(math.Max(float64(resyncPeriod), float64(DefaultResyncPeriod)))
r.ResyncPeriod = time.Duration(math.Max(float64(r.ResyncPeriod), float64(DefaultResyncPeriod)))
c, err := ctrl.NewControllerManagedBy(mgr).
Named(ControllerName).
WithOptions(controller.Options{
MaxConcurrentReconciles: r.maxConcurrentReconciles,
MaxConcurrentReconciles: r.MaxConcurrentReconciles,
}).
For(&quotav1alpha2.ResourceQuota{}).
WithEventFilter(predicate.GenerationChangedPredicate{
@@ -206,7 +208,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
}
r.recorder.Event(resourceQuota, corev1.EventTypeNormal, "Synced", "Synced successfully")
return ctrl.Result{RequeueAfter: r.resyncPeriod}, nil
return ctrl.Result{RequeueAfter: r.ResyncPeriod}, nil
}
func (r *Reconciler) bindWorkspace(resourceQuota *quotav1alpha2.ResourceQuota) error {