@@ -19,18 +19,17 @@ package workloads
19
19
import (
20
20
"context"
21
21
"fmt"
22
- apierrors "k8s.io/apimachinery/pkg/api/errors"
23
- "k8s.io/apimachinery/pkg/util/errors"
24
22
"reflect"
25
- lwsv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
26
-
27
- "k8s.io/apimachinery/pkg/runtime/schema"
23
+ "sync"
28
24
29
25
appsv1 "k8s.io/api/apps/v1"
30
26
corev1 "k8s.io/api/core/v1"
27
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
31
28
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
29
"k8s.io/apimachinery/pkg/runtime"
30
+ "k8s.io/apimachinery/pkg/runtime/schema"
33
31
"k8s.io/apimachinery/pkg/types"
32
+ "k8s.io/apimachinery/pkg/util/errors"
34
33
"k8s.io/client-go/tools/record"
35
34
"k8s.io/klog/v2"
36
35
ctrl "sigs.k8s.io/controller-runtime"
@@ -40,12 +39,23 @@ import (
40
39
"sigs.k8s.io/controller-runtime/pkg/event"
41
40
"sigs.k8s.io/controller-runtime/pkg/log"
42
41
"sigs.k8s.io/controller-runtime/pkg/predicate"
42
+ "sigs.k8s.io/controller-runtime/pkg/reconcile"
43
+ lwsv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
43
44
workloadsv1alpha1 "sigs.k8s.io/rbgs/api/workloads/v1alpha1"
44
45
"sigs.k8s.io/rbgs/pkg/dependency"
45
46
"sigs.k8s.io/rbgs/pkg/reconciler"
46
47
"sigs.k8s.io/rbgs/pkg/utils"
47
48
)
48
49
50
+ var (
51
+ runtimeController * builder.TypedBuilder [reconcile.Request ]
52
+ watchedWorkload sync.Map
53
+ )
54
+
55
+ func init () {
56
+ watchedWorkload = sync.Map {}
57
+ }
58
+
49
59
// RoleBasedGroupReconciler reconciles a RoleBasedGroup object
50
60
type RoleBasedGroupReconciler struct {
51
61
client client.Client
@@ -94,6 +104,8 @@ func (r *RoleBasedGroupReconciler) Reconcile(ctx context.Context, req ctrl.Reque
94
104
var roleStatuses []workloadsv1alpha1.RoleStatus
95
105
var updateStatus bool
96
106
for _ , role := range sortedRoles {
107
+ // first check whether watch lws cr
108
+ dynamicWatchCustomCRD (ctx , role .Workload )
97
109
// Check dependencies first
98
110
ready , err := dependencyManager .CheckDependencyReady (ctx , rbg , role )
99
111
if err != nil {
@@ -229,20 +241,21 @@ func (r *RoleBasedGroupReconciler) updateRBGStatus(ctx context.Context, rbg *wor
229
241
230
242
// SetupWithManager sets up the controller with the Manager.
231
243
func (r * RoleBasedGroupReconciler ) SetupWithManager (mgr ctrl.Manager , options controller.Options ) error {
232
- controller : = ctrl .NewControllerManagedBy (mgr ).
244
+ runtimeController = ctrl .NewControllerManagedBy (mgr ).
233
245
WithOptions (options ).
234
246
For (& workloadsv1alpha1.RoleBasedGroup {}, builder .WithPredicates (RBGPredicate ())).
235
247
Owns (& appsv1.StatefulSet {}, builder .WithPredicates (WorkloadPredicate ())).
236
248
Owns (& appsv1.Deployment {}, builder .WithPredicates (WorkloadPredicate ())).
237
249
Owns (& corev1.Service {}).
238
250
Named ("workloads-rolebasedgroup" )
239
251
240
- err := utils .CheckCrdExists (r .apiReader , "leaderworkersets.leaderworkerset.x-k8s.io" )
252
+ err := utils .CheckCrdExists (r .apiReader , reconciler . LwsCrdName )
241
253
if err == nil {
242
- controller = controller .Owns (& lwsv1.LeaderWorkerSet {}, builder .WithPredicates (WorkloadPredicate ()))
254
+ watchedWorkload .LoadOrStore (reconciler .LwsCrdName , struct {}{})
255
+ runtimeController .Owns (& lwsv1.LeaderWorkerSet {}, builder .WithPredicates (WorkloadPredicate ()))
243
256
}
244
257
245
- return controller .Complete (r )
258
+ return runtimeController .Complete (r )
246
259
}
247
260
248
261
// CheckCrdExists checks if the specified Custom Resource Definition (CRD) exists in the Kubernetes cluster.
@@ -357,3 +370,20 @@ func hasValidOwnerRef(obj client.Object, targetGVK schema.GroupVersionKind) bool
357
370
func getRbgGVK () schema.GroupVersionKind {
358
371
return schema .FromAPIVersionAndKind (workloadsv1alpha1 .GroupVersion .String (), "RoleBasedGroup" )
359
372
}
373
+
374
+ func getLwsGVK () schema.GroupVersionKind {
375
+ return schema .FromAPIVersionAndKind (lwsv1 .GroupVersion .String (), "LeaderWorkerSet" )
376
+ }
377
+
378
+ func dynamicWatchCustomCRD (ctx context.Context , workload workloadsv1alpha1.WorkloadSpec ) {
379
+ logger := log .FromContext (ctx )
380
+ switch workload .Kind {
381
+ case getLwsGVK ().Kind :
382
+ _ , lwsExist := watchedWorkload .Load (reconciler .LwsCrdName )
383
+ if ! lwsExist {
384
+ watchedWorkload .LoadOrStore (reconciler .LwsCrdName , struct {}{})
385
+ runtimeController .Owns (& lwsv1.LeaderWorkerSet {}, builder .WithPredicates (WorkloadPredicate ()))
386
+ logger .Info ("rbgs controller watch LeaderWorkerSet CRD" )
387
+ }
388
+ }
389
+ }
0 commit comments