Skip to content

Commit 03e7335

Browse files
authored
Merge pull request #5084 from yike21/generation-kustomization
Align federated Kustomization's observedGeneration semantics with its native
2 parents 1255a08 + 8547843 commit 03e7335

File tree

4 files changed

+83
-12
lines changed

4 files changed

+83
-12
lines changed

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/kustomize.toolkit.fluxcd.io/v1/Kustomization/customizations.yaml

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,42 @@ spec:
2222
statusAggregation:
2323
luaScript: >
2424
function AggregateStatus(desiredObj, statusItems)
25+
if desiredObj.status == nil then
26+
desiredObj.status = {}
27+
end
28+
if desiredObj.metadata.generation == nil then
29+
desiredObj.metadata.generation = 0
30+
end
31+
if desiredObj.status.observedGeneration == nil then
32+
desiredObj.status.observedGeneration = 0
33+
end
34+
35+
-- Initialize status fields if status doest not exist
36+
-- If the Kustomization is not spread to any cluster, its status also should be aggregated
2537
if statusItems == nil then
38+
desiredObj.status.observedGeneration = desiredObj.metadata.generation
39+
desiredObj.status.lastAttemptedRevision = ''
40+
desiredObj.status.lastAppliedRevision = ''
41+
desiredObj.status.conditions = {}
2642
return desiredObj
2743
end
28-
desiredObj.status = {}
29-
desiredObj.status.conditions = {}
30-
conditions = {}
44+
45+
local conditions = {}
46+
local generation = desiredObj.metadata.generation
47+
local lastAppliedRevision = desiredObj.status.lastAppliedRevision
48+
local lastAttemptedRevision = desiredObj.status.lastAttemptedRevision
49+
local observedGeneration = desiredObj.status.observedGeneration
50+
51+
-- Count all members that their status is updated to the latest generation
52+
local observedResourceTemplateGenerationCount = 0
53+
3154
local conditionsIndex = 1
3255
for i = 1, #statusItems do
3356
if statusItems[i].status ~= nil and statusItems[i].status.lastAttemptedRevision ~= nil and statusItems[i].status.lastAttemptedRevision ~= '' then
34-
desiredObj.status.lastAttemptedRevision = statusItems[i].status.lastAttemptedRevision
57+
lastAttemptedRevision = statusItems[i].status.lastAttemptedRevision
3558
end
3659
if statusItems[i].status ~= nil and statusItems[i].status.lastAppliedRevision ~= nil and statusItems[i].status.lastAppliedRevision ~= '' then
37-
desiredObj.status.lastAppliedRevision = statusItems[i].status.lastAppliedRevision
38-
end
39-
if statusItems[i].status ~= nil and statusItems[i].status.lastHandledReconcileAt ~= nil and statusItems[i].status.lastHandledReconcileAt ~= '' then
40-
desiredObj.status.lastHandledReconcileAt = statusItems[i].status.lastHandledReconcileAt
60+
lastAppliedRevision = statusItems[i].status.lastAppliedRevision
4161
end
4262
if statusItems[i].status ~= nil and statusItems[i].status.conditions ~= nil then
4363
for conditionIndex = 1, #statusItems[i].status.conditions do
@@ -56,9 +76,35 @@ spec:
5676
end
5777
end
5878
end
79+
80+
-- Check if the member's status is updated to the latest generation
81+
local resourceTemplateGeneration = 0
82+
if statusItems[i].status ~= nil and statusItems[i].status.resourceTemplateGeneration ~= nil then
83+
resourceTemplateGeneration = statusItems[i].status.resourceTemplateGeneration
84+
end
85+
local memberGeneration = 0
86+
if statusItems[i].status ~= nil and statusItems[i].status.generation ~= nil then
87+
memberGeneration = statusItems[i].status.generation
88+
end
89+
local memberObservedGeneration = 0
90+
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil then
91+
memberObservedGeneration = statusItems[i].status.observedGeneration
92+
end
93+
if resourceTemplateGeneration == generation and memberGeneration == memberObservedGeneration then
94+
observedResourceTemplateGenerationCount = observedResourceTemplateGenerationCount + 1
95+
end
5996
end
60-
desiredObj.status.observedGeneration = desiredObj.metadata.generation
97+
98+
-- Update the observed generation based on the observedResourceTemplateGenerationCount
99+
if observedResourceTemplateGenerationCount == #statusItems then
100+
desiredObj.status.observedGeneration = generation
101+
else
102+
desiredObj.status.observedGeneration = observedGeneration
103+
end
104+
61105
desiredObj.status.conditions = conditions
106+
desiredObj.status.lastAppliedRevision = lastAppliedRevision
107+
desiredObj.status.lastAttemptedRevision = lastAttemptedRevision
62108
return desiredObj
63109
end
64110
retention:
@@ -72,14 +118,29 @@ spec:
72118
statusReflection:
73119
luaScript: >
74120
function ReflectStatus (observedObj)
75-
status = {}
76-
if observedObj == nil or observedObj.status == nil then
121+
local status = {}
122+
if observedObj == nil or observedObj.status == nil then
77123
return status
78124
end
79125
status.conditions = observedObj.status.conditions
80126
status.lastAppliedRevision = observedObj.status.lastAppliedRevision
81127
status.lastAttemptedRevision = observedObj.status.lastAttemptedRevision
82-
status.lastHandledReconcileAt = observedObj.status.lastHandledReconcileAt
128+
status.observedGeneration = observedObj.status.observedGeneration
129+
130+
-- handle resource generation report
131+
if observedObj.metadata == nil then
132+
return status
133+
end
134+
status.generation = observedObj.metadata.generation
135+
136+
if observedObj.metadata.annotations == nil then
137+
return status
138+
end
139+
local resourceTemplateGeneration = tonumber(observedObj.metadata.annotations["resourcetemplate.karmada.io/generation"])
140+
if resourceTemplateGeneration ~= nil then
141+
status.resourceTemplateGeneration = resourceTemplateGeneration
142+
end
143+
83144
return status
84145
end
85146
dependencyInterpretation:

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/kustomize.toolkit.fluxcd.io/v1/Kustomization/testdata/desired-kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ kind: Kustomization
33
metadata:
44
name: sample
55
namespace: test-kustomization
6+
generation: 1
67
spec:
78
interval: 10m
89
targetNamespace: test-kustomization

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/kustomize.toolkit.fluxcd.io/v1/Kustomization/testdata/observed-kustomization.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
apiVersion: kustomize.toolkit.fluxcd.io/v1
22
kind: Kustomization
33
metadata:
4+
annotations:
5+
resourcetemplate.karmada.io/generation: "1"
46
name: sample
57
namespace: test-kustomization
8+
generation: 1
69
spec:
710
interval: 10m
811
targetNamespace: test-kustomization

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/kustomize.toolkit.fluxcd.io/v1/Kustomization/testdata/status-file.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ status:
99
reason: ReconciliationSucceeded
1010
status: "True"
1111
type: Ready
12+
generation: 1
1213
lastAppliedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
1314
lastAttemptedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
15+
observedGeneration: 1
16+
resourceTemplateGeneration: 1
1417
---
1518
applied: true
1619
clusterName: member3
@@ -23,5 +26,8 @@ status:
2326
reason: ReconciliationSucceeded
2427
status: "True"
2528
type: Ready
29+
generation: 1
2630
lastAppliedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
2731
lastAttemptedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
32+
observedGeneration: 1
33+
resourceTemplateGeneration: 1

0 commit comments

Comments
 (0)