Skip to content

Commit

Permalink
CR-15028 (#167)
Browse files Browse the repository at this point in the history
* [ application_errors_parser.go ]: added replacement of "one or more synchronization tasks completed unsuccessfully" to the details error on each resources

* fixes after pr review

* update version

* [ applications_errors_parser_test.go ]: added test case for parseApplicationSyncResultErrorsFromConditions func
  • Loading branch information
oleksandr-codefresh authored Nov 1, 2022
1 parent 849df32 commit d7908cc
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 15 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.3.4-cap-CR-14428-dest-server-validation
2.3.4-cap-CR-15028-sync-result-resources-errors
56 changes: 48 additions & 8 deletions server/application/application_errors_parser.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package application

import (
"fmt"
"strings"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -27,9 +28,14 @@ func parseApplicationSyncResultErrors(os *appv1.OperationState) []*events.Object
return errors
}

func parseApplicationSyncResultErrorsFromConditions(conditions []appv1.ApplicationCondition) []*events.ObjectError {
var syncFailedErrorMessage = "one or more synchronization tasks completed unsuccessfully"

func parseApplicationSyncResultErrorsFromConditions(status appv1.ApplicationStatus) []*events.ObjectError {
var errs []*events.ObjectError
for _, cnd := range conditions {
if status.Conditions == nil {
return errs
}
for _, cnd := range status.Conditions {
if !strings.Contains(strings.ToLower(cnd.Type), "error") {
continue
}
Expand All @@ -39,12 +45,18 @@ func parseApplicationSyncResultErrorsFromConditions(conditions []appv1.Applicati
lastSeen = *cnd.LastTransitionTime
}

errs = append(errs, &events.ObjectError{
Type: "sync",
Level: "error",
Message: cnd.Message,
LastSeen: lastSeen,
})
if strings.Contains(cnd.Message, syncFailedErrorMessage) && status.OperationState != nil && status.OperationState.SyncResult != nil && status.OperationState.SyncResult.Resources != nil {
resourcesSyncErrors := parseAggregativeResourcesSyncErrors(status.OperationState.SyncResult.Resources)

errs = append(errs, resourcesSyncErrors...)
} else {
errs = append(errs, &events.ObjectError{
Type: "sync",
Level: "error",
Message: cnd.Message,
LastSeen: lastSeen,
})
}
}
return errs
}
Expand Down Expand Up @@ -104,3 +116,31 @@ func parseAggregativeHealthErrors(rs *appv1.ResourceStatus, apptree *appv1.Appli

return errs
}

func parseAggregativeResourcesSyncErrors(resourceResults appv1.ResourceResults) []*events.ObjectError {
var errs []*events.ObjectError

if resourceResults == nil {
return errs
}

for _, rr := range resourceResults {
if rr.Message != "" {
objectError := events.ObjectError{
Type: "sync",
Level: "error",
LastSeen: metav1.Now(),
Message: fmt.Sprintf("Resource %s(%s): \n %s", rr.Kind, rr.Name, rr.Message),
}
if rr.Status == common.ResultCodeSyncFailed {
errs = append(errs, &objectError)
}
if rr.HookPhase == common.OperationFailed || rr.HookPhase == common.OperationError {
errs = append(errs, &objectError)
}

}
}

return errs
}
4 changes: 2 additions & 2 deletions server/application/application_event_reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ func getResourceEventPayload(
}

if originalApplication != nil && originalApplication.Status.Conditions != nil {
errors = append(errors, parseApplicationSyncResultErrorsFromConditions(originalApplication.Status.Conditions)...)
errors = append(errors, parseApplicationSyncResultErrorsFromConditions(originalApplication.Status)...)
}

if len(desiredState.RawManifest) == 0 && len(desiredState.CompiledManifest) != 0 {
Expand Down Expand Up @@ -584,7 +584,7 @@ func (s *applicationEventReporter) getApplicationEventPayload(ctx context.Contex
Timestamp: ts,
Object: object,
Source: source,
Errors: parseApplicationSyncResultErrorsFromConditions(a.Status.Conditions),
Errors: parseApplicationSyncResultErrorsFromConditions(a.Status),
}

payloadBytes, err := json.Marshal(&payload)
Expand Down
60 changes: 56 additions & 4 deletions server/application/applications_errors_parser_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package application

import (
"fmt"
"testing"

"github.com/argoproj/gitops-engine/pkg/sync/common"
Expand Down Expand Up @@ -134,10 +135,12 @@ func TestParseResourceSyncResultErrors(t *testing.T) {

func TestParseApplicationSyncResultErrorsFromConditions(t *testing.T) {
t.Run("conditions exists", func(t *testing.T) {
errors := parseApplicationSyncResultErrorsFromConditions([]v1alpha1.ApplicationCondition{
{
Type: "error",
Message: "error message",
errors := parseApplicationSyncResultErrorsFromConditions(v1alpha1.ApplicationStatus{
Conditions: []v1alpha1.ApplicationCondition{
{
Type: "error",
Message: "error message",
},
},
})

Expand All @@ -146,6 +149,55 @@ func TestParseApplicationSyncResultErrorsFromConditions(t *testing.T) {
assert.Equal(t, errors[0].Type, "sync")
assert.Equal(t, errors[0].Level, "error")
})

t.Run("conditions erorr replaced with sync result errors", func(t *testing.T) {
errors := parseApplicationSyncResultErrorsFromConditions(v1alpha1.ApplicationStatus{
Conditions: []v1alpha1.ApplicationCondition{
{
Type: "error",
Message: syncFailedErrorMessage,
},
},
OperationState: &v1alpha1.OperationState{
SyncResult: &v1alpha1.SyncOperationResult{
Resources: v1alpha1.ResourceResults{
&v1alpha1.ResourceResult{
Kind: "Job",
Name: "some-job",
Message: "job failed",
HookPhase: common.OperationFailed,
},
&v1alpha1.ResourceResult{
Kind: "Pod",
Name: "some-pod",
Message: "pod failed",
Status: common.ResultCodeSyncFailed,
},
&v1alpha1.ResourceResult{
Kind: "Job",
Name: "some-succeded-hook",
Message: "job succeded",
HookPhase: common.OperationSucceeded,
},
&v1alpha1.ResourceResult{
Kind: "Pod",
Name: "synced-pod",
Message: "pod synced",
Status: common.ResultCodeSynced,
},
},
},
},
})

assert.Len(t, errors, 2)
assert.Equal(t, errors[0].Message, fmt.Sprintf("Resource %s(%s): \n %s", "Job", "some-job", "job failed"))
assert.Equal(t, errors[0].Type, "sync")
assert.Equal(t, errors[0].Level, "error")
assert.Equal(t, errors[1].Message, fmt.Sprintf("Resource %s(%s): \n %s", "Pod", "some-pod", "pod failed"))
assert.Equal(t, errors[1].Type, "sync")
assert.Equal(t, errors[1].Level, "error")
})
}

func TestParseAggregativeHealthErrors(t *testing.T) {
Expand Down

0 comments on commit d7908cc

Please sign in to comment.