Skip to content

Commit de6b280

Browse files
Merge branch 'release-2.12' of github.com:codefresh-io/argo-cd into CR-23668-multisource-details-reporting
# Conflicts: # changelog/CHANGELOG.md
2 parents d780165 + bfe424f commit de6b280

File tree

6 files changed

+126
-35
lines changed

6 files changed

+126
-35
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.12.3-2024.10.28-20100fc54
1+
2.12.3-2024.11.14-d7a4c4e7e
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### Changes
2+
- fix(event-reporter): fixed issue when if managed resource in degraded state and all of it child nodes in non-degraded state no error reported

event_reporter/reporter/application_errors_parser.go

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,31 +135,44 @@ func parseAggregativeHealthErrors(rs *appv1.ResourceStatus, apptree *appv1.Appli
135135
childNodes := n.GetAllChildNodes(apptree, "")
136136

137137
for _, cn := range childNodes {
138-
if cn.Health != nil && cn.Health.Status == health.HealthStatusDegraded {
139-
newErr := events.ObjectError{
140-
Type: "health",
141-
Level: "error",
142-
Message: cn.Health.Message,
143-
LastSeen: *cn.CreatedAt,
144-
}
145-
146-
if addReference {
147-
newErr.SourceReference = &events.ErrorSourceReference{
148-
Group: rs.Group,
149-
Version: rs.Version,
150-
Kind: rs.Kind,
151-
Namespace: rs.Namespace,
152-
Name: rs.Name,
153-
}
154-
}
138+
if newErr := getNodeHealthError(cn, rs, addReference); newErr != nil {
139+
errs = append(errs, newErr)
140+
}
141+
}
155142

156-
errs = append(errs, &newErr)
143+
if len(errs) == 0 {
144+
if newErr := getNodeHealthError(*n, rs, addReference); newErr != nil {
145+
errs = append(errs, newErr)
157146
}
158147
}
159148

160149
return errs
161150
}
162151

152+
func getNodeHealthError(node appv1.ResourceNode, managedResource *appv1.ResourceStatus, addReference bool) *events.ObjectError {
153+
if node.Health == nil || node.Health.Status != health.HealthStatusDegraded {
154+
return nil
155+
}
156+
157+
newErr := &events.ObjectError{
158+
Type: "health",
159+
Level: "error",
160+
Message: node.Health.Message,
161+
LastSeen: *node.CreatedAt,
162+
}
163+
164+
if addReference {
165+
newErr.SourceReference = &events.ErrorSourceReference{
166+
Group: managedResource.Group,
167+
Version: managedResource.Version,
168+
Kind: managedResource.Kind,
169+
Namespace: managedResource.Namespace,
170+
Name: managedResource.Name,
171+
}
172+
}
173+
return newErr
174+
}
175+
163176
func parseAggregativeResourcesSyncErrors(resourceResults appv1.ResourceResults) []*events.ObjectError {
164177
var errs []*events.ObjectError
165178

event_reporter/reporter/applications_errors_parser_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,4 +336,81 @@ func TestParseAggregativeHealthErrors(t *testing.T) {
336336
assert.NotNil(t, errs[0].SourceReference)
337337
assert.Equal(t, deployRef.Name, errs[0].SourceReference.Name)
338338
})
339+
340+
t.Run("should build error from root node if it's degraded while no one of child in degraded health state", func(t *testing.T) {
341+
rsName := "test-deployment"
342+
ns := "test"
343+
errMessage := "backoff pulling image test/test:0.1"
344+
replicaSetRef := v1alpha1.ResourceRef{
345+
Group: "g",
346+
Version: "v",
347+
Kind: "ReplicaSet",
348+
Name: rsName + "1",
349+
Namespace: ns,
350+
}
351+
352+
deploymentRef := v1alpha1.ResourceRef{
353+
Group: "g",
354+
Version: "v",
355+
Kind: "Deployment",
356+
Name: rsName,
357+
Namespace: ns,
358+
}
359+
360+
appTree := v1alpha1.ApplicationTree{
361+
Nodes: []v1alpha1.ResourceNode{
362+
{ // Pod
363+
ResourceRef: v1alpha1.ResourceRef{
364+
Group: "g",
365+
Version: "v",
366+
Kind: "Pod",
367+
Name: rsName + "1-3n235j5",
368+
Namespace: ns,
369+
},
370+
Health: &v1alpha1.HealthStatus{
371+
Status: health.HealthStatusProgressing,
372+
Message: "some error of pod",
373+
},
374+
ParentRefs: []v1alpha1.ResourceRef{replicaSetRef},
375+
CreatedAt: &metav1.Time{
376+
Time: time.Now(),
377+
},
378+
},
379+
{ // ReplicaSet
380+
ResourceRef: replicaSetRef,
381+
Health: &v1alpha1.HealthStatus{
382+
Status: health.HealthStatusProgressing,
383+
Message: "",
384+
},
385+
ParentRefs: []v1alpha1.ResourceRef{deploymentRef},
386+
CreatedAt: &metav1.Time{
387+
Time: time.Now(),
388+
},
389+
},
390+
{ // Deployment
391+
ResourceRef: deploymentRef,
392+
Health: &v1alpha1.HealthStatus{
393+
Status: health.HealthStatusDegraded,
394+
Message: errMessage,
395+
},
396+
ParentRefs: []v1alpha1.ResourceRef{},
397+
CreatedAt: &metav1.Time{
398+
Time: time.Now(),
399+
},
400+
},
401+
},
402+
}
403+
404+
errs := parseAggregativeHealthErrors(&v1alpha1.ResourceStatus{
405+
Group: deploymentRef.Group,
406+
Version: deploymentRef.Version,
407+
Kind: deploymentRef.Kind,
408+
Name: deploymentRef.Name,
409+
Namespace: deploymentRef.Namespace,
410+
}, &appTree, true)
411+
assert.Len(t, errs, 1)
412+
assert.Equal(t, errMessage, errs[0].Message)
413+
assert.NotNil(t, errs[0].SourceReference)
414+
assert.Equal(t, deploymentRef.Name, errs[0].SourceReference.Name)
415+
})
339416
}

reposerver/repository/repository.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1812,21 +1812,18 @@ var manifestFile = regexp.MustCompile(`^.*\.(yaml|yml|json|jsonnet)$`)
18121812

18131813
// findManifests looks at all yaml files in a directory and unmarshals them into a list of unstructured objects
18141814
func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1alpha1.Env, directory v1alpha1.ApplicationSourceDirectory, enabledManifestGeneration map[string]bool, maxCombinedManifestQuantity resource.Quantity) ([]manifest, error) {
1815-
absRepoRoot, err := filepath.Abs(repoRoot)
1816-
if err != nil {
1817-
return nil, err
1818-
}
1819-
1820-
var manifests []manifest
1821-
18221815
// Validate the directory before loading any manifests to save memory.
18231816
potentiallyValidManifests, err := getPotentiallyValidManifests(logCtx, appPath, repoRoot, directory.Recurse, directory.Include, directory.Exclude, maxCombinedManifestQuantity)
18241817
if err != nil {
18251818
logCtx.Errorf("failed to get potentially valid manifests: %s", err)
18261819
return nil, fmt.Errorf("failed to get potentially valid manifests: %w", err)
18271820
}
18281821

1829-
var objs []*unstructured.Unstructured
1822+
absRepoRoot, err := filepath.Abs(repoRoot)
1823+
if err != nil {
1824+
return nil, err
1825+
}
1826+
var manifests []manifest
18301827
for _, potentiallyValidManifest := range potentiallyValidManifests {
18311828
manifestPath := potentiallyValidManifest.path
18321829
manifestFileInfo := potentiallyValidManifest.fileInfo
@@ -1836,6 +1833,7 @@ func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1al
18361833
repoRelPath, _ := filepath.Rel(absRepoRoot, absPath)
18371834

18381835
if strings.HasSuffix(manifestFileInfo.Name(), ".jsonnet") {
1836+
var objs []*unstructured.Unstructured
18391837
if !discovery.IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeDirectory, enabledManifestGeneration) {
18401838
continue
18411839
}
@@ -1875,6 +1873,7 @@ func findManifests(logCtx *log.Entry, appPath string, repoRoot string, env *v1al
18751873
})
18761874
}
18771875
} else {
1876+
var objs []*unstructured.Unstructured
18781877
err := getObjsFromYAMLOrJson(logCtx, manifestPath, manifestFileInfo.Name(), &objs)
18791878
if err != nil {
18801879
return nil, err

reposerver/repository/repository_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ func TestGenerateManifestsUseExactRevision(t *testing.T) {
661661

662662
res1, err := service.GenerateManifest(context.Background(), &q)
663663
require.NoError(t, err)
664-
assert.Len(t, res1.Manifests, 6)
664+
assert.Len(t, res1.Manifests, 4)
665665
assert.Equal(t, "abc", gitClient.Calls[0].Arguments[0])
666666
}
667667

@@ -677,7 +677,7 @@ func TestRecurseManifestsInDir(t *testing.T) {
677677

678678
res1, err := service.GenerateManifest(context.Background(), &q)
679679
require.NoError(t, err)
680-
assert.Len(t, res1.Manifests, 6)
680+
assert.Len(t, res1.Manifests, 4)
681681
}
682682

683683
func TestInvalidManifestsInDir(t *testing.T) {
@@ -2199,7 +2199,7 @@ func TestFindResources(t *testing.T) {
21992199
}, {
22002200
name: "Include Everything",
22012201
include: "*.yaml",
2202-
expectedNames: []string{"nginx-deployment", "nginx-deployment", "nginx-deployment-sub"},
2202+
expectedNames: []string{"nginx-deployment", "nginx-deployment-sub"},
22032203
}, {
22042204
name: "Include Subdirectory",
22052205
include: "**/*.yaml",
@@ -2254,10 +2254,10 @@ func TestFindManifests_Exclude_NothingMatches(t *testing.T) {
22542254
}, map[string]bool{}, resource.MustParse("0"))
22552255

22562256
require.NoError(t, err)
2257-
require.Len(t, objs, 3)
2257+
require.Len(t, objs, 2)
22582258

22592259
assert.ElementsMatch(t,
2260-
[]string{"nginx-deployment", "nginx-deployment-sub"}, []string{objs[0].obj.GetName(), objs[2].obj.GetName()})
2260+
[]string{"nginx-deployment", "nginx-deployment-sub"}, []string{objs[0].obj.GetName(), objs[1].obj.GetName()})
22612261
}
22622262

22632263
func tempDir(t *testing.T) string {
@@ -2606,7 +2606,7 @@ func Test_findManifests(t *testing.T) {
26062606
t.Run("recursion when recursion is enabled", func(t *testing.T) {
26072607
recurse := argoappv1.ApplicationSourceDirectory{Recurse: true}
26082608
manifests, err := findManifests(logCtx, "./testdata/recurse", "./testdata/recurse", nil, recurse, nil, resource.MustParse("0"))
2609-
assert.Len(t, manifests, 6)
2609+
assert.Len(t, manifests, 4)
26102610
require.NoError(t, err)
26112611
})
26122612

@@ -2665,7 +2665,7 @@ func Test_findManifests(t *testing.T) {
26652665
t.Run("group of files should be limited at precisely the sum of their size", func(t *testing.T) {
26662666
// There is a total of 10 files, each file being 10 bytes.
26672667
manifests, err := findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("365"))
2668-
assert.Len(t, manifests, 55)
2668+
assert.Len(t, manifests, 10)
26692669
require.NoError(t, err)
26702670

26712671
manifests, err = findManifests(logCtx, "./testdata/several-files", "./testdata/several-files", nil, noRecurse, nil, resource.MustParse("364"))
@@ -2676,7 +2676,7 @@ func Test_findManifests(t *testing.T) {
26762676
t.Run("jsonnet isn't counted against size limit", func(t *testing.T) {
26772677
// Each file is 36 bytes. Only the 36-byte json file should be counted against the limit.
26782678
manifests, err := findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("36"))
2679-
assert.Len(t, manifests, 3)
2679+
assert.Len(t, manifests, 2)
26802680
require.NoError(t, err)
26812681

26822682
manifests, err = findManifests(logCtx, "./testdata/jsonnet-and-json", "./testdata/jsonnet-and-json", nil, noRecurse, nil, resource.MustParse("35"))

0 commit comments

Comments
 (0)