Skip to content

Commit d08727f

Browse files
committed
feat: add RecordErrorConditions in StatusRecordOptions
1 parent b728f15 commit d08727f

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

pkg/frame/controller/consts.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,14 @@ const (
3030
EnsureEmployerCleanFinalizerFailed = "EnsureEmployerCleanFinalizerFailed"
3131
EnsureEmployerCleanFinalizerSucceed = "EnsureEmployerCleanFinalizerSucceed"
3232
EnsureExpectedFinalizerFailed = "EnsureExpectedFinalizerFailed"
33+
GetExpectedEmployerFailed = "GetExpectedEmployerFailed"
34+
GetCurrentEmployerFailed = "GetCurrentEmployerFailed"
3335
SyncEmployerFailed = "SyncEmployerFailed"
36+
GetExpectedEmployeesFailed = "GetExpectedEmployeesFailed"
37+
GetCurrentEmployeesFailed = "GetCurrentEmployeesFailed"
3438
SyncEmployeesFailed = "SyncEmployeesFailed"
3539
CleanEmployerCleanFinalizerFailed = "CleanEmployerCleanFinalizerFailed"
3640
CleanEmployerCleanFinalizerSucceed = "CleanEmployerCleanFinalizerSucceed"
41+
RecordStatusesFailed = "RecordStatusesFailed"
42+
RecordErrorConditionsFailed = "RecordErrorConditionsFailed"
3743
)

pkg/frame/controller/resourceconsist_controller.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ func (r *Consist) Reconcile(ctx context.Context, request reconcile.Request) (rec
159159
return reconcile.Result{}, err
160160
}
161161

162+
defer func() {
163+
if err != nil {
164+
if recordOptions, ok := r.adapter.(StatusRecordOptions); ok {
165+
err = recordOptions.RecordErrorConditions(ctx, employer, err)
166+
if err != nil {
167+
logger.Error(err, "record error conditions failed")
168+
r.recorder.Eventf(employer, corev1.EventTypeWarning, RecordErrorConditionsFailed,
169+
"record error conditions failed: %s", err.Error())
170+
}
171+
}
172+
}
173+
}()
174+
162175
// Ensure employer-clean finalizer firstly, employer-clean finalizer should be cleaned at the end
163176
updated, err := r.ensureEmployerCleanFlz(ctx, employer)
164177
if err != nil {
@@ -186,11 +199,15 @@ func (r *Consist) Reconcile(ctx context.Context, request reconcile.Request) (rec
186199
expectedEmployer, err := r.adapter.GetExpectedEmployer(ctx, employer)
187200
if err != nil {
188201
logger.Error(err, "get expect employer failed")
202+
r.recorder.Eventf(employer, corev1.EventTypeWarning, GetExpectedEmployerFailed,
203+
"get expect employer failed: %s", err.Error())
189204
return reconcile.Result{}, err
190205
}
191206
currentEmployer, err := r.adapter.GetCurrentEmployer(ctx, employer)
192207
if err != nil {
193208
logger.Error(err, "get current employer failed")
209+
r.recorder.Eventf(employer, corev1.EventTypeWarning, GetCurrentEmployerFailed,
210+
"get current employer failed: %s", err.Error())
194211
return reconcile.Result{}, err
195212
}
196213
isCleanEmployer, syncEmployerFailedExist, cudEmployerResults, err := r.syncEmployer(ctx, employer, expectedEmployer, currentEmployer)
@@ -205,11 +222,15 @@ func (r *Consist) Reconcile(ctx context.Context, request reconcile.Request) (rec
205222
expectedEmployees, err := r.adapter.GetExpectedEmployee(ctx, employer)
206223
if err != nil {
207224
logger.Error(err, "get expect employees failed")
225+
r.recorder.Eventf(employer, corev1.EventTypeWarning, GetExpectedEmployeesFailed,
226+
"get expect employees failed: %s", err.Error())
208227
return reconcile.Result{}, err
209228
}
210229
currentEmployees, err := r.adapter.GetCurrentEmployee(ctx, employer)
211230
if err != nil {
212231
logger.Error(err, "get current employees failed")
232+
r.recorder.Eventf(employer, corev1.EventTypeWarning, GetCurrentEmployeesFailed,
233+
"get current employees failed: %s", err.Error())
213234
return reconcile.Result{}, err
214235
}
215236
isCleanEmployee, syncEmployeeFailedExist, cudEmployeeResults, err := r.syncEmployees(ctx, employer, expectedEmployees, currentEmployees)
@@ -245,6 +266,8 @@ func (r *Consist) Reconcile(ctx context.Context, request reconcile.Request) (rec
245266
err = recordOptions.RecordStatuses(ctx, employer, cudEmployerResults, cudEmployeeResults)
246267
if err != nil {
247268
logger.Error(err, "record status failed")
269+
r.recorder.Eventf(employer, corev1.EventTypeWarning, RecordStatusesFailed,
270+
"record status failed: %s", err.Error())
248271
return reconcile.Result{}, err
249272
}
250273
}

pkg/frame/controller/resourceconsist_controller_suite_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type DemoControllerAdapter struct {
3535

3636
var _ ReconcileAdapter = &DemoControllerAdapter{}
3737
var _ ReconcileLifecycleOptions = &DemoControllerAdapter{}
38+
var _ StatusRecordOptions = &DemoControllerAdapter{}
3839

3940
var needRecordEmployees = false
4041

@@ -45,6 +46,25 @@ func NewDemoReconcileAdapter(c client.Client, rc *DemoResourceProviderClient) Re
4546
}
4647
}
4748

49+
func (r *DemoControllerAdapter) RecordStatuses(ctx context.Context, employer client.Object,
50+
cudEmployerResults CUDEmployerResults, cudEmployeeResults CUDEmployeeResults) error {
51+
if employer.GetAnnotations()["resource-consist.kusionstack.io/demo-condition"] != "" {
52+
employer.GetAnnotations()["resource-consist.kusionstack.io/demo-condition"] = ""
53+
return r.Update(ctx, employer)
54+
}
55+
return nil
56+
}
57+
58+
func (r *DemoControllerAdapter) RecordErrorConditions(ctx context.Context, employer client.Object, err error) error {
59+
annos := employer.GetAnnotations()
60+
if annos == nil {
61+
annos = make(map[string]string)
62+
}
63+
annos["resource-consist.kusionstack.io/demo-condition"] = err.Error()
64+
employer.SetAnnotations(annos)
65+
return r.Update(ctx, employer)
66+
}
67+
4868
func (r *DemoControllerAdapter) FollowPodOpsLifeCycle() bool {
4969
return true
5070
}

pkg/frame/controller/resourceconsit_controller_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,18 @@ var _ = Describe("resource-consist-controller", func() {
493493
return false
494494
}, 3*time.Second, 100*time.Millisecond).Should(BeTrue())
495495

496+
Eventually(func() bool {
497+
tmp := &corev1.Service{}
498+
err := mgr.GetClient().Get(context.Background(), types.NamespacedName{
499+
Name: svc2.Name,
500+
Namespace: svc2.Namespace,
501+
}, tmp)
502+
if err != nil {
503+
return false
504+
}
505+
return tmp.GetAnnotations()["resource-consist.kusionstack.io/demo-condition"] == "syncCreate failed, err: fake err"
506+
}, 3*time.Second, 100*time.Millisecond).Should(BeTrue())
507+
496508
demoResourceVipStatusInProvider.Store(svc2.Name, DemoServiceDetails{
497509
RemoteVIP: "demo-remote-VIP",
498510
RemoteVIPQPS: 100,
@@ -502,6 +514,18 @@ var _ = Describe("resource-consist-controller", func() {
502514
details, exist := demoResourceVipStatusInProvider.Load(svc2.Name)
503515
return exist && details.(DemoServiceDetails).RemoteVIP == "demo-remote-VIP" && details.(DemoServiceDetails).RemoteVIPQPS == 100
504516
}, 3*time.Second, 100*time.Millisecond).Should(BeTrue())
517+
518+
Eventually(func() bool {
519+
tmp := &corev1.Service{}
520+
err := mgr.GetClient().Get(context.Background(), types.NamespacedName{
521+
Name: svc2.Name,
522+
Namespace: svc2.Namespace,
523+
}, tmp)
524+
if err != nil {
525+
return false
526+
}
527+
return tmp.GetAnnotations()["resource-consist.kusionstack.io/demo-condition"] == ""
528+
}, 3*time.Second, 100*time.Millisecond).Should(BeTrue())
505529
})
506530

507531
It("create rs resp failed, but actually created in backend provider", func() {

pkg/frame/controller/types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,14 @@ type ExpectedFinalizerRecordOptions interface {
6868

6969
// StatusRecordOptions defines methods of record something for adapters
7070
type StatusRecordOptions interface {
71+
// RecordStatuses records statuses of employer and employees, called at the end of successful reconcile.
72+
// cudEmployerResults and cudEmployeeResults are the results of create/update/delete operations on employer and employees
7173
RecordStatuses(ctx context.Context, employer client.Object,
7274
cudEmployerResults CUDEmployerResults, cudEmployeeResults CUDEmployeeResults) error
75+
76+
// RecordErrorConditions records error conditions, called at the end of failed reconcile.
77+
// usually, something recorded in RecordErrorConditions should be erased in RecordStatuses.
78+
RecordErrorConditions(ctx context.Context, employer client.Object, err error) error
7379
}
7480

7581
// ReconcileLifecycleOptions defines whether PodOpsLifecycle followed

0 commit comments

Comments
 (0)