Skip to content

Commit c0c5569

Browse files
authored
Merge pull request #5094 from zhy76/feat/sts
Align federated StatefulSet's observedGeneration semantics with its native
2 parents 2271a41 + d7d28ea commit c0c5569

File tree

4 files changed

+82
-18
lines changed

4 files changed

+82
-18
lines changed

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/customizations.yaml

Lines changed: 75 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,46 @@ spec:
2424
statusAggregation:
2525
luaScript: >
2626
function AggregateStatus(desiredObj, statusItems)
27-
if statusItems == nil then
28-
return desiredObj
29-
end
3027
if desiredObj.status == nil then
3128
desiredObj.status = {}
3229
end
3330
if desiredObj.metadata.generation == nil then
3431
desiredObj.metadata.generation = 0
3532
end
36-
generation = desiredObj.metadata.generation
37-
replicas = 0
38-
readyReplicas = 0
39-
currentReplicas = 0
40-
updatedReplicas = 0
41-
availableReplicas = 0
42-
updatedReadyReplicas = 0
43-
updateRevision = ''
44-
currentRevision = ''
33+
if desiredObj.status.observedGeneration == nil then
34+
desiredObj.status.observedGeneration = 0
35+
end
36+
37+
-- Initialize status fields if status doest not exist
38+
-- If the StatefulSet is not spread to any cluster, its status also should be aggregated
39+
if statusItems == nil then
40+
desiredObj.status.observedGeneration = desiredObj.metadata.generation
41+
desiredObj.status.replicas = 0
42+
desiredObj.status.readyReplicas = 0
43+
desiredObj.status.currentReplicas = 0
44+
desiredObj.status.updatedReplicas = 0
45+
desiredObj.status.availableReplicas = 0
46+
desiredObj.status.updatedReadyReplicas = 0
47+
desiredObj.status.updateRevision = ''
48+
desiredObj.status.currentRevision = ''
49+
return desiredObj
50+
end
51+
52+
local generation = desiredObj.metadata.generation
53+
local observedGeneration = desiredObj.status.observedGeneration
54+
local replicas = 0
55+
local readyReplicas = 0
56+
local currentReplicas = 0
57+
local updatedReplicas = 0
58+
local availableReplicas = 0
59+
local updatedReadyReplicas = 0
60+
local updateRevision = ''
61+
local currentRevision = ''
62+
local labelSelector = ''
63+
64+
-- Count all members that their status is updated to the latest generation
65+
local observedResourceTemplateGenerationCount = 0
66+
4567
for i = 1, #statusItems do
4668
if statusItems[i].status ~= nil and statusItems[i].status.replicas ~= nil then
4769
replicas = replicas + statusItems[i].status.replicas
@@ -67,11 +89,32 @@ spec:
6789
if statusItems[i].status ~= nil and statusItems[i].status.currentRevision ~= nil and statusItems[i].status.currentRevision ~= '' then
6890
currentRevision = statusItems[i].status.currentRevision
6991
end
70-
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil and statusItems[i].status.observedGeneration ~= '' then
71-
generation = statusItems[i].status.observedGeneration
72-
end
92+
93+
-- Check if the member's status is updated to the latest generation
94+
local resourceTemplateGeneration = 0
95+
if statusItems[i].status ~= nil and statusItems[i].status.resourceTemplateGeneration ~= nil then
96+
resourceTemplateGeneration = statusItems[i].status.resourceTemplateGeneration
97+
end
98+
local memberGeneration = 0
99+
if statusItems[i].status ~= nil and statusItems[i].status.generation ~= nil then
100+
memberGeneration = statusItems[i].status.generation
101+
end
102+
local memberObservedGeneration = 0
103+
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil then
104+
memberObservedGeneration = statusItems[i].status.observedGeneration
105+
end
106+
if resourceTemplateGeneration == generation and memberGeneration == memberObservedGeneration then
107+
observedResourceTemplateGenerationCount = observedResourceTemplateGenerationCount + 1
108+
end
73109
end
74-
desiredObj.status.observedGeneration = generation
110+
111+
-- Update the observed generation based on the observedResourceTemplateGenerationCount
112+
if observedResourceTemplateGenerationCount == #statusItems then
113+
desiredObj.status.observedGeneration = generation
114+
else
115+
desiredObj.status.observedGeneration = observedGeneration
116+
end
117+
75118
desiredObj.status.replicas = replicas
76119
desiredObj.status.readyReplicas = readyReplicas
77120
desiredObj.status.currentReplicas = currentReplicas
@@ -84,8 +127,8 @@ spec:
84127
end
85128
statusReflection:
86129
luaScript: >
87-
function ReflectStatus (observedObj)
88-
status = {}
130+
function ReflectStatus(observedObj)
131+
local status = {}
89132
if observedObj == nil or observedObj.status == nil then
90133
return status
91134
end
@@ -98,6 +141,20 @@ spec:
98141
status.currentRevision = observedObj.status.currentRevision
99142
status.updatedReadyReplicas = observedObj.status.updatedReadyReplicas
100143
status.observedGeneration = observedObj.status.observedGeneration
144+
145+
-- handle resource generation report
146+
if observedObj.metadata == nil then
147+
return status
148+
end
149+
status.generation = observedObj.metadata.generation
150+
151+
if observedObj.metadata.annotations == nil then
152+
return status
153+
end
154+
local resourceTemplateGeneration = tonumber(observedObj.metadata.annotations["resourcetemplate.karmada.io/generation"])
155+
if resourceTemplateGeneration ~= nil then
156+
status.resourceTemplateGeneration = resourceTemplateGeneration
157+
end
101158
return status
102159
end
103160
healthInterpretation:

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/desired-statefulset-nginx.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ kind: StatefulSet
33
metadata:
44
name: sample
55
namespace: test-statefulset
6+
generation: 1
67
spec:
78
replicas: 2
89
serviceName: sample-statefulset-headless-service

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/observed-statefulset-nginx.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
apiVersion: apps.kruise.io/v1beta1
22
kind: StatefulSet
33
metadata:
4+
annotations:
5+
resourcetemplate.karmada.io/generation: "1"
46
name: sample
57
namespace: test-statefulset
68
generation: 1

pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/status-file.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ status:
55
availableReplicas: 2
66
currentReplicas: 2
77
currentRevision: sample-5675547df7
8+
generation: 1
9+
resourceTemplateGeneration: 1
810
observedGeneration: 1
911
readyReplicas: 2
1012
replicas: 2
@@ -19,7 +21,9 @@ status:
1921
availableReplicas: 2
2022
currentReplicas: 2
2123
currentRevision: sample-5675547df7
24+
generation: 1
2225
observedGeneration: 1
26+
resourceTemplateGeneration: 1
2327
readyReplicas: 2
2428
replicas: 2
2529
updateRevision: sample-5675547df7

0 commit comments

Comments
 (0)