@@ -26,6 +26,7 @@ import (
26
26
apierrors "k8s.io/apimachinery/pkg/api/errors"
27
27
"k8s.io/apimachinery/pkg/runtime"
28
28
"k8s.io/apimachinery/pkg/types"
29
+ "k8s.io/client-go/tools/record"
29
30
ctrl "sigs.k8s.io/controller-runtime"
30
31
"sigs.k8s.io/controller-runtime/pkg/builder"
31
32
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -47,6 +48,7 @@ type DedicatedCLBListenerReconciler struct {
47
48
client.Client
48
49
Scheme * runtime.Scheme
49
50
APIReader client.Reader
51
+ Recorder record.EventRecorder
50
52
}
51
53
52
54
// +kubebuilder:rbac:groups=networking.cloud.tencent.com,resources=dedicatedclblisteners,verbs=get;list;watch;create;update;patch;delete
@@ -76,6 +78,7 @@ func (r *DedicatedCLBListenerReconciler) Reconcile(ctx context.Context, req ctrl
76
78
lis .Status .State = networkingv1alpha1 .DedicatedCLBListenerStatePending
77
79
if err := r .Status ().Update (ctx , lis ); err != nil {
78
80
log .Error (err , "failed to update status to Pending" )
81
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "UpdateStatusFailed" , err .Error ())
79
82
return ctrl.Result {}, err
80
83
}
81
84
}
@@ -86,6 +89,7 @@ func (r *DedicatedCLBListenerReconciler) Reconcile(ctx context.Context, req ctrl
86
89
if ! controllerutil .ContainsFinalizer (lis , finalizerName ) && controllerutil .AddFinalizer (lis , finalizerName ) {
87
90
if err := r .Update (ctx , lis ); err != nil {
88
91
log .Error (err , "failed to add finalizer" )
92
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "AddFinalizerFailed" , err .Error ())
89
93
}
90
94
}
91
95
if err := r .sync (ctx , log , lis ); err != nil {
@@ -355,9 +359,12 @@ func (r *DedicatedCLBListenerReconciler) ensureListener(ctx context.Context, log
355
359
// 监听器已创建,检查监听器
356
360
listenerId := lis .Status .ListenerId
357
361
if listenerId == "" { // 不应该没有监听器ID,重建监听器
358
- log .Info ("listener id not found from status, try to recreate" , "state" , lis .Status .State )
362
+ msg := fmt .Sprintf ("listener is %s state but no id not found in status, try to recreate" , lis .Status .State )
363
+ log .Info (msg )
364
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "ListenerIDNotFound" , msg )
359
365
lis .Status .State = networkingv1alpha1 .DedicatedCLBListenerStatePending
360
366
if err := r .Status ().Update (ctx , lis ); err != nil {
367
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "UpdateStatusFailed" , err .Error ())
361
368
return err
362
369
}
363
370
return r .createListener (ctx , log , lis )
@@ -366,16 +373,22 @@ func (r *DedicatedCLBListenerReconciler) ensureListener(ctx context.Context, log
366
373
log .V (5 ).Info ("ensure listener" , "listenerId" , listenerId )
367
374
listener , err := clb .GetListenerByPort (ctx , lis .Spec .LbRegion , lis .Spec .LbId , lis .Spec .LbPort , lis .Spec .Protocol )
368
375
if err != nil {
376
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "GetListenerByPort" , err .Error ())
369
377
return err
370
378
}
371
379
if listener == nil { // 监听器不存在,重建监听器
372
- log .Info ("listener not found, try to recreate" , "listenerId" , listenerId )
380
+ msg := "listener not found, try to recreate"
381
+ log .Info (msg , "listenerId" , listenerId )
382
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "ListenerNotFound" , msg )
373
383
return r .createListener (ctx , log , lis )
374
384
}
375
385
if listener .ListenerId != listenerId { // 监听器ID不匹配,更新监听器ID
376
- log .Info ("listener id not match, update listenerId in status" , "realListenerId" , listener .ListenerId )
386
+ msg := fmt .Sprintf ("listener id from status (%s) is not equal with the real listener id (%s)" , listenerId , listener .ListenerId )
387
+ log .Info (msg )
388
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "ListenerIdNotMatch" , msg )
377
389
lis .Status .ListenerId = listener .ListenerId
378
390
if err := r .Status ().Update (ctx , lis ); err != nil {
391
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "UpdateStatusFailed" , err .Error ())
379
392
return err
380
393
}
381
394
}
@@ -390,36 +403,46 @@ func (r *DedicatedCLBListenerReconciler) createListener(ctx context.Context, log
390
403
if apierrors .IsNotFound (err ) {
391
404
config = nil
392
405
} else {
406
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "CreateListener" , err .Error ())
393
407
return err
394
408
}
395
409
}
396
410
}
397
411
existedLis , err := clb .GetListenerByPort (ctx , lis .Spec .LbRegion , lis .Spec .LbId , lis .Spec .LbPort , lis .Spec .Protocol )
398
412
if err != nil {
413
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "CreateListener" , err .Error ())
399
414
return err
400
415
}
401
416
var listenerId string
402
417
if existedLis != nil { // 端口冲突,如果是控制器创建的,则直接复用,如果不是,则报错引导用户人工确认手动清理冲突的监听器(避免直接重建误删用户有用的监听器)
403
418
log = log .WithValues ("listenerId" , existedLis .ListenerId , "port" , lis .Spec .LbPort , "protocol" , lis .Spec .Protocol )
404
419
log .Info ("lb port already existed" , "listenerName" , existedLis .ListenerName )
405
420
if existedLis .ListenerName == clb .TkePodListenerName { // 已经创建了,直接复用
406
- log .Info ("reuse already existed listener" )
421
+ msg := "reuse already existed listener"
422
+ log .Info (msg )
423
+ r .Recorder .Event (lis , corev1 .EventTypeNormal , "CreateListener" , msg )
407
424
listenerId = existedLis .ListenerId
408
425
} else {
409
426
err = errors .New ("lb port already existed, but not created by tke, please confirm and delete the conficted listener manually" )
410
427
log .Error (err , "listenerName" , existedLis .ListenerName )
428
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "CreateListener" , err .Error ())
411
429
return err
412
430
}
413
431
} else { // 没有端口冲突,创建监听器
414
432
log .V (5 ).Info ("try to create listener" )
415
433
id , err := clb .CreateListener (ctx , lis .Spec .LbRegion , config .Spec .CreateListenerRequest (lis .Spec .LbId , lis .Spec .LbPort , lis .Spec .Protocol ))
416
434
if err != nil {
435
+ r .Recorder .Event (lis , corev1 .EventTypeWarning , "CreateListener" , err .Error ())
417
436
return err
418
437
}
438
+ msg := "listener successfully created"
419
439
log .V (5 ).Info ("listener successfully created" , "listenerId" , id )
440
+ r .Recorder .Event (lis , corev1 .EventTypeNormal , "CreateListener" , msg )
420
441
listenerId = id
421
442
}
422
- log .V (5 ).Info ("listener ready, set state to available" )
443
+ msg := "listener ready, set state to available"
444
+ log .V (5 ).Info (msg )
445
+ r .Recorder .Event (lis , corev1 .EventTypeNormal , "UpdateStatus" , msg )
423
446
lis .Status .State = networkingv1alpha1 .DedicatedCLBListenerStateAvailable
424
447
lis .Status .ListenerId = listenerId
425
448
return r .Status ().Update (ctx , lis )
0 commit comments