Align federated helmcharts.source.toolkit.fluxcd.io observedGeneration semantics with its native

Signed-off-by: yike21 <yike21@qq.com>
This commit is contained in:
yike21 2024-07-14 01:48:16 +08:00
parent d3adcf68ef
commit b92029cc63
4 changed files with 95 additions and 17 deletions

View File

@ -24,28 +24,52 @@ spec:
statusAggregation: statusAggregation:
luaScript: > luaScript: >
function AggregateStatus(desiredObj, statusItems) 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 HelmChart is not spread to any cluster, its status also should be aggregated
if statusItems == nil then if statusItems == nil then
desiredObj.status.artifact = {}
desiredObj.status.conditions = {}
desiredObj.status.observedChartName = ''
desiredObj.status.observedGeneration = desiredObj.metadata.generation
desiredObj.status.observedSourceArtifactRevision = ''
desiredObj.status.url = ''
return desiredObj return desiredObj
end end
desiredObj.status = {}
desiredObj.status.conditions = {} local artifact = {}
conditions = {} local conditions = {}
local generation = desiredObj.metadata.generation
local observedChartName = ''
local observedGeneration = desiredObj.status.observedGeneration
local observedSourceArtifactRevision = ''
local url = ''
-- Count all members that their status is updated to the latest generation
local observedResourceTemplateGenerationCount = 0
local conditionsIndex = 1 local conditionsIndex = 1
for i = 1, #statusItems do for i = 1, #statusItems do
if statusItems[i].status ~= nil and statusItems[i].status.artifact ~= nil then if statusItems[i].status ~= nil and statusItems[i].status.artifact ~= nil then
desiredObj.status.artifact = statusItems[i].status.artifact artifact = statusItems[i].status.artifact
end end
if statusItems[i].status ~= nil and statusItems[i].status.observedSourceArtifactRevision ~= nil and statusItems[i].status.observedSourceArtifactRevision ~= '' then if statusItems[i].status ~= nil and statusItems[i].status.observedSourceArtifactRevision ~= nil and statusItems[i].status.observedSourceArtifactRevision ~= '' then
desiredObj.status.observedSourceArtifactRevision = statusItems[i].status.observedSourceArtifactRevision observedSourceArtifactRevision = statusItems[i].status.observedSourceArtifactRevision
end end
if statusItems[i].status ~= nil and statusItems[i].status.observedChartName ~= nil and statusItems[i].status.observedChartName ~= '' then if statusItems[i].status ~= nil and statusItems[i].status.observedChartName ~= nil and statusItems[i].status.observedChartName ~= '' then
desiredObj.status.observedChartName = statusItems[i].status.observedChartName observedChartName = statusItems[i].status.observedChartName
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
end end
if statusItems[i].status ~= nil and statusItems[i].status.url ~= nil and statusItems[i].status.url ~= '' then if statusItems[i].status ~= nil and statusItems[i].status.url ~= nil and statusItems[i].status.url ~= '' then
desiredObj.status.url = statusItems[i].status.url url = statusItems[i].status.url
end end
if statusItems[i].status ~= nil and statusItems[i].status.conditions ~= nil then if statusItems[i].status ~= nil and statusItems[i].status.conditions ~= nil then
for conditionIndex = 1, #statusItems[i].status.conditions do for conditionIndex = 1, #statusItems[i].status.conditions do
@ -64,9 +88,37 @@ spec:
end end
end 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 end
desiredObj.status.observedGeneration = desiredObj.metadata.generation 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
-- Update the observed generation based on the observedResourceTemplateGenerationCount
if observedResourceTemplateGenerationCount == #statusItems then
desiredObj.status.observedGeneration = generation
else
desiredObj.status.observedGeneration = observedGeneration
end
desiredObj.status.artifact = artifact
desiredObj.status.conditions = conditions desiredObj.status.conditions = conditions
desiredObj.status.observedChartName = observedChartName
desiredObj.status.observedSourceArtifactRevision = observedSourceArtifactRevision
desiredObj.status.url = url
return desiredObj return desiredObj
end end
retention: retention:
@ -80,16 +132,32 @@ spec:
statusReflection: statusReflection:
luaScript: > luaScript: >
function ReflectStatus (observedObj) function ReflectStatus (observedObj)
status = {} local status = {}
if observedObj == nil or observedObj.status == nil then if observedObj == nil or observedObj.status == nil then
return status return status
end end
status.observedSourceArtifactRevision = observedObj.status.observedSourceArtifactRevision
status.observedChartName = observedObj.status.observedChartName
status.conditions = observedObj.status.conditions
status.url = observedObj.status.url
status.artifact = observedObj.status.artifact status.artifact = observedObj.status.artifact
status.lastHandledReconcileAt = observedObj.status.lastHandledReconcileAt status.conditions = observedObj.status.conditions
status.observedChartName = observedObj.status.observedChartName
status.observedGeneration = observedGeneration
status.observedSourceArtifactRevision = observedObj.status.observedSourceArtifactRevision
status.url = observedObj.status.url
-- 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 return status
end end
dependencyInterpretation: dependencyInterpretation:

View File

@ -3,6 +3,7 @@ kind: HelmChart
metadata: metadata:
name: sample name: sample
namespace: test-helmchart namespace: test-helmchart
generation: 1
spec: spec:
interval: 5m0s interval: 5m0s
chart: podinfo chart: podinfo

View File

@ -3,6 +3,9 @@ kind: HelmChart
metadata: metadata:
name: sample name: sample
namespace: test-helmchart namespace: test-helmchart
annotations:
resourcetemplate.karmada.io/generation: "1"
generation: 1
spec: spec:
interval: 5m0s interval: 5m0s
chart: podinfo chart: podinfo

View File

@ -22,8 +22,11 @@ status:
reason: ChartPullSucceeded reason: ChartPullSucceeded
status: "True" status: "True"
type: ArtifactInStorage type: ArtifactInStorage
generation: 1
observedChartName: podinfo observedChartName: podinfo
observedGeneration: 1
observedSourceArtifactRevision: sha256:61f94c20ee9417f222c3d30672724473ae50d406c8c097d80a8a6263c1384f69 observedSourceArtifactRevision: sha256:61f94c20ee9417f222c3d30672724473ae50d406c8c097d80a8a6263c1384f69
resourceTemplateGeneration: 1
url: http://source-controller.flux-system.svc.cluster.local./helmchart/test-helmchart/sample/latest.tar.gz url: http://source-controller.flux-system.svc.cluster.local./helmchart/test-helmchart/sample/latest.tar.gz
--- ---
applied: true applied: true
@ -50,6 +53,9 @@ status:
reason: ChartPullSucceeded reason: ChartPullSucceeded
status: "True" status: "True"
type: ArtifactInStorage type: ArtifactInStorage
generation: 1
observedChartName: podinfo observedChartName: podinfo
observedGeneration: 1
observedSourceArtifactRevision: sha256:61f94c20ee9417f222c3d30672724473ae50d406c8c097d80a8a6263c1384f69 observedSourceArtifactRevision: sha256:61f94c20ee9417f222c3d30672724473ae50d406c8c097d80a8a6263c1384f69
resourceTemplateGeneration: 1
url: http://source-controller.flux-system.svc.cluster.local./helmchart/test-helmchart/sample/latest.tar.gz url: http://source-controller.flux-system.svc.cluster.local./helmchart/test-helmchart/sample/latest.tar.gz