fix kustomization observed generation logic

Signed-off-by: yike21 <yike21@qq.com>
This commit is contained in:
yike21 2024-06-22 23:21:02 +08:00
parent 5e354971c7
commit 8547843d01
4 changed files with 83 additions and 12 deletions

View File

@ -22,22 +22,42 @@ spec:
statusAggregation:
luaScript: >
function AggregateStatus(desiredObj, statusItems)
if desiredObj.status == nil then
desiredObj.status = {}
end
if desiredObj.metadata.generation == nil then
desiredObj.metadata.generation = 0
end
if desiredObj.status.observedGeneration == nil then
desiredObj.status.observedGeneration = 0
end
-- Initialize status fields if status doest not exist
-- If the Kustomization is not spread to any cluster, its status also should be aggregated
if statusItems == nil then
desiredObj.status.observedGeneration = desiredObj.metadata.generation
desiredObj.status.lastAttemptedRevision = ''
desiredObj.status.lastAppliedRevision = ''
desiredObj.status.conditions = {}
return desiredObj
end
desiredObj.status = {}
desiredObj.status.conditions = {}
conditions = {}
local conditions = {}
local generation = desiredObj.metadata.generation
local lastAppliedRevision = desiredObj.status.lastAppliedRevision
local lastAttemptedRevision = desiredObj.status.lastAttemptedRevision
local observedGeneration = desiredObj.status.observedGeneration
-- Count all members that their status is updated to the latest generation
local observedResourceTemplateGenerationCount = 0
local conditionsIndex = 1
for i = 1, #statusItems do
if statusItems[i].status ~= nil and statusItems[i].status.lastAttemptedRevision ~= nil and statusItems[i].status.lastAttemptedRevision ~= '' then
desiredObj.status.lastAttemptedRevision = statusItems[i].status.lastAttemptedRevision
lastAttemptedRevision = statusItems[i].status.lastAttemptedRevision
end
if statusItems[i].status ~= nil and statusItems[i].status.lastAppliedRevision ~= nil and statusItems[i].status.lastAppliedRevision ~= '' then
desiredObj.status.lastAppliedRevision = statusItems[i].status.lastAppliedRevision
end
if statusItems[i].status ~= nil and statusItems[i].status.lastHandledReconcileAt ~= nil and statusItems[i].status.lastHandledReconcileAt ~= '' then
desiredObj.status.lastHandledReconcileAt = statusItems[i].status.lastHandledReconcileAt
lastAppliedRevision = statusItems[i].status.lastAppliedRevision
end
if statusItems[i].status ~= nil and statusItems[i].status.conditions ~= nil then
for conditionIndex = 1, #statusItems[i].status.conditions do
@ -56,9 +76,35 @@ spec:
end
end
end
-- Check if the member's status is updated to the latest generation
local resourceTemplateGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.resourceTemplateGeneration ~= nil then
resourceTemplateGeneration = statusItems[i].status.resourceTemplateGeneration
end
local memberGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.generation ~= nil then
memberGeneration = statusItems[i].status.generation
end
local memberObservedGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil then
memberObservedGeneration = statusItems[i].status.observedGeneration
end
if resourceTemplateGeneration == generation and memberGeneration == memberObservedGeneration then
observedResourceTemplateGenerationCount = observedResourceTemplateGenerationCount + 1
end
end
desiredObj.status.observedGeneration = desiredObj.metadata.generation
-- Update the observed generation based on the observedResourceTemplateGenerationCount
if observedResourceTemplateGenerationCount == #statusItems then
desiredObj.status.observedGeneration = generation
else
desiredObj.status.observedGeneration = observedGeneration
end
desiredObj.status.conditions = conditions
desiredObj.status.lastAppliedRevision = lastAppliedRevision
desiredObj.status.lastAttemptedRevision = lastAttemptedRevision
return desiredObj
end
retention:
@ -72,14 +118,29 @@ spec:
statusReflection:
luaScript: >
function ReflectStatus (observedObj)
status = {}
if observedObj == nil or observedObj.status == nil then
local status = {}
if observedObj == nil or observedObj.status == nil then
return status
end
status.conditions = observedObj.status.conditions
status.lastAppliedRevision = observedObj.status.lastAppliedRevision
status.lastAttemptedRevision = observedObj.status.lastAttemptedRevision
status.lastHandledReconcileAt = observedObj.status.lastHandledReconcileAt
status.observedGeneration = observedObj.status.observedGeneration
-- handle resource generation report
if observedObj.metadata == nil then
return status
end
status.generation = observedObj.metadata.generation
if observedObj.metadata.annotations == nil then
return status
end
local resourceTemplateGeneration = tonumber(observedObj.metadata.annotations["resourcetemplate.karmada.io/generation"])
if resourceTemplateGeneration ~= nil then
status.resourceTemplateGeneration = resourceTemplateGeneration
end
return status
end
dependencyInterpretation:

View File

@ -3,6 +3,7 @@ kind: Kustomization
metadata:
name: sample
namespace: test-kustomization
generation: 1
spec:
interval: 10m
targetNamespace: test-kustomization

View File

@ -1,8 +1,11 @@
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
annotations:
resourcetemplate.karmada.io/generation: "1"
name: sample
namespace: test-kustomization
generation: 1
spec:
interval: 10m
targetNamespace: test-kustomization

View File

@ -9,8 +9,11 @@ status:
reason: ReconciliationSucceeded
status: "True"
type: Ready
generation: 1
lastAppliedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
lastAttemptedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
observedGeneration: 1
resourceTemplateGeneration: 1
---
applied: true
clusterName: member3
@ -23,5 +26,8 @@ status:
reason: ReconciliationSucceeded
status: "True"
type: Ready
generation: 1
lastAppliedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
lastAttemptedRevision: master@sha1:0647aea75b85755411b007a290b9321668370be5
observedGeneration: 1
resourceTemplateGeneration: 1