Skip to content

Commit f6e2d30

Browse files
committed
Add ObservedGeneration to ACK Status Conditions
Observed Generation is a kubernetes standard that persists the latest reconciled generation (metadata.generation) in the resource status condition
1 parent 54860f1 commit f6e2d30

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

apis/core/v1alpha1/conditions.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ type Condition struct {
7272
Type ConditionType `json:"type"`
7373
// Status of the condition, one of True, False, Unknown.
7474
Status corev1.ConditionStatus `json:"status"`
75+
// observedGeneration represents the .metadata.generation that the condition was set based upon.
76+
// For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration
77+
// is 9, the condition is out of date with respect to the current state of the instance.
78+
// +optional
79+
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
7580
// Last time the condition transitioned from one status to another.
7681
// +optional
7782
LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"`

pkg/condition/condition.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func AllOfType(
105105
// SetSynced sets the resource's Condition of type ConditionTypeResourceSynced
106106
// to the supplied status, optional message and reason.
107107
func SetSynced(
108-
subject acktypes.ConditionManager,
108+
subject acktypes.AWSResource,
109109
status corev1.ConditionStatus,
110110
message *string,
111111
reason *string,
@@ -121,6 +121,7 @@ func SetSynced(
121121
now := metav1.Now()
122122
c.LastTransitionTime = &now
123123
c.Status = status
124+
c.ObservedGeneration = subject.MetaObject().GetGeneration()
124125
c.Message = message
125126
c.Reason = reason
126127
subject.ReplaceConditions(allConds)
@@ -129,7 +130,7 @@ func SetSynced(
129130
// SetTerminal sets the resource's Condition of type ConditionTypeTerminal to
130131
// the supplied status, optional message and reason.
131132
func SetTerminal(
132-
subject acktypes.ConditionManager,
133+
subject acktypes.AWSResource,
133134
status corev1.ConditionStatus,
134135
message *string,
135136
reason *string,
@@ -145,6 +146,7 @@ func SetTerminal(
145146
now := metav1.Now()
146147
c.LastTransitionTime = &now
147148
c.Status = status
149+
c.ObservedGeneration = subject.MetaObject().GetGeneration()
148150
c.Message = message
149151
c.Reason = reason
150152
subject.ReplaceConditions(allConds)
@@ -153,7 +155,7 @@ func SetTerminal(
153155
// SetRecoverable sets the resource's Condition of type ConditionTypeRecoverable
154156
// to the supplied status, optional message and reason.
155157
func SetRecoverable(
156-
subject acktypes.ConditionManager,
158+
subject acktypes.AWSResource,
157159
status corev1.ConditionStatus,
158160
message *string,
159161
reason *string,
@@ -169,6 +171,7 @@ func SetRecoverable(
169171
now := metav1.Now()
170172
c.LastTransitionTime = &now
171173
c.Status = status
174+
c.ObservedGeneration = subject.MetaObject().GetGeneration()
172175
c.Message = message
173176
c.Reason = reason
174177
subject.ReplaceConditions(allConds)
@@ -177,7 +180,7 @@ func SetRecoverable(
177180
// SetLateInitialized sets the resource's Condition of type ConditionTypeLateInitialized to
178181
// the supplied status, optional message and reason.
179182
func SetLateInitialized(
180-
subject acktypes.ConditionManager,
183+
subject acktypes.AWSResource,
181184
status corev1.ConditionStatus,
182185
message *string,
183186
reason *string,
@@ -193,6 +196,7 @@ func SetLateInitialized(
193196
now := metav1.Now()
194197
c.LastTransitionTime = &now
195198
c.Status = status
199+
c.ObservedGeneration = subject.MetaObject().GetGeneration()
196200
c.Message = message
197201
c.Reason = reason
198202
subject.ReplaceConditions(allConds)
@@ -201,7 +205,7 @@ func SetLateInitialized(
201205
// SetReferencesResolved sets the resource's Condition of type ConditionTypeReferencesResolved
202206
// to the supplied status, optional message and reason.
203207
func SetReferencesResolved(
204-
subject acktypes.ConditionManager,
208+
subject acktypes.AWSResource,
205209
status corev1.ConditionStatus,
206210
message *string,
207211
reason *string,
@@ -217,6 +221,7 @@ func SetReferencesResolved(
217221
now := metav1.Now()
218222
c.LastTransitionTime = &now
219223
c.Status = status
224+
c.ObservedGeneration = subject.MetaObject().GetGeneration()
220225
c.Message = message
221226
c.Reason = reason
222227
subject.ReplaceConditions(allConds)

pkg/condition/condition_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
ackerr "github.com/aws-controllers-k8s/runtime/pkg/errors"
2626
corev1 "k8s.io/api/core/v1"
2727

28+
metav1mocks "github.com/aws-controllers-k8s/runtime/mocks/apimachinery/pkg/apis/meta/v1"
2829
ackmocks "github.com/aws-controllers-k8s/runtime/mocks/pkg/types"
2930
)
3031

@@ -111,7 +112,10 @@ func TestConditionGetters(t *testing.T) {
111112
func TestConditionSetters(t *testing.T) {
112113
r := &ackmocks.AWSResource{}
113114
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
114-
115+
metaObject := &metav1mocks.Object{}
116+
var observedGeneration int64 = 1
117+
r.On("MetaObject").Return(metaObject)
118+
metaObject.On("GetGeneration").Return(observedGeneration)
115119
// Ensure that if there is no synced condition, it gets added...
116120
r.On(
117121
"ReplaceConditions",
@@ -132,6 +136,8 @@ func TestConditionSetters(t *testing.T) {
132136

133137
// Ensure that SetSynced doesn't overwrite any other conditions...
134138
r = &ackmocks.AWSResource{}
139+
r.On("MetaObject").Return(metaObject)
140+
metaObject.On("GetGeneration").Return(observedGeneration)
135141
r.On("Conditions").Return(
136142
[]*ackv1alpha1.Condition{
137143
&ackv1alpha1.Condition{
@@ -157,6 +163,8 @@ func TestConditionSetters(t *testing.T) {
157163

158164
// Ensure that SetSynced overwrites an existing synced condition...
159165
r = &ackmocks.AWSResource{}
166+
r.On("MetaObject").Return(metaObject)
167+
metaObject.On("GetGeneration").Return(observedGeneration)
160168
r.On("Conditions").Return(
161169
[]*ackv1alpha1.Condition{
162170
&ackv1alpha1.Condition{
@@ -183,6 +191,8 @@ func TestConditionSetters(t *testing.T) {
183191

184192
// Ensure that if there is no terminal condition, it gets added...
185193
r = &ackmocks.AWSResource{}
194+
r.On("MetaObject").Return(metaObject)
195+
metaObject.On("GetGeneration").Return(observedGeneration)
186196
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
187197
r.On(
188198
"ReplaceConditions",
@@ -204,6 +214,8 @@ func TestConditionSetters(t *testing.T) {
204214
// ReferencesResolved condition
205215
// SetReferencesResolved
206216
r = &ackmocks.AWSResource{}
217+
r.On("MetaObject").Return(metaObject)
218+
metaObject.On("GetGeneration").Return(observedGeneration)
207219
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
208220
r.On(
209221
"ReplaceConditions",
@@ -219,6 +231,8 @@ func TestConditionSetters(t *testing.T) {
219231

220232
//RemoveReferencesResolved
221233
r = &ackmocks.AWSResource{}
234+
r.On("MetaObject").Return(metaObject)
235+
metaObject.On("GetGeneration").Return(observedGeneration)
222236
r.On("Conditions").Return(
223237
[]*ackv1alpha1.Condition{
224238
&ackv1alpha1.Condition{
@@ -246,6 +260,8 @@ func TestConditionSetters(t *testing.T) {
246260
//WithReferencesResolvedCondition
247261
// Without Error
248262
r = &ackmocks.AWSResource{}
263+
r.On("MetaObject").Return(metaObject)
264+
metaObject.On("GetGeneration").Return(observedGeneration)
249265
r.On("DeepCopy").Return(r)
250266
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
251267
r.On(
@@ -263,6 +279,8 @@ func TestConditionSetters(t *testing.T) {
263279
errorMsg := "error message"
264280
err := errors.New(errorMsg)
265281
r = &ackmocks.AWSResource{}
282+
r.On("MetaObject").Return(metaObject)
283+
metaObject.On("GetGeneration").Return(observedGeneration)
266284
r.On("DeepCopy").Return(r)
267285
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
268286
r.On(
@@ -280,6 +298,8 @@ func TestConditionSetters(t *testing.T) {
280298
// With Terminal Error
281299
terminalError := ackerr.ResourceReferenceTerminal
282300
r = &ackmocks.AWSResource{}
301+
r.On("MetaObject").Return(metaObject)
302+
metaObject.On("GetGeneration").Return(observedGeneration)
283303
r.On("DeepCopy").Return(r)
284304
r.On("Conditions").Return([]*ackv1alpha1.Condition{})
285305
r.On(

0 commit comments

Comments
 (0)