diff --git a/api/cloud-resources/v1beta1/condition.go b/api/cloud-resources/v1beta1/condition.go index 581bf1ff..25d5a472 100644 --- a/api/cloud-resources/v1beta1/condition.go +++ b/api/cloud-resources/v1beta1/condition.go @@ -70,4 +70,5 @@ const ( ReasonUnknownSchedule = "UnknownSchedule" ReasonInvalidStartTime = "InvalidStartTime" ReasonInvalidEndTime = "InvalidEndTime" + ReasonBackupFailed = "BackupFailed" ) diff --git a/pkg/skr/awsnfsvolumebackup/markFailed.go b/pkg/skr/awsnfsvolumebackup/markFailed.go index d2b066a0..033534c3 100644 --- a/pkg/skr/awsnfsvolumebackup/markFailed.go +++ b/pkg/skr/awsnfsvolumebackup/markFailed.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/kyma-project/cloud-manager/api/cloud-resources/v1beta1" "github.com/kyma-project/cloud-manager/pkg/composed" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -63,8 +64,20 @@ func markFailed(ctx context.Context, st composed.State) (error, context.Context) for _, item := range list.Items { if item.CreationTimestamp.Time.After(backup.CreationTimestamp.Time) { + errCondition := meta.FindStatusCondition(backup.Status.Conditions, v1beta1.ConditionTypeError) + message := "Backup moved to Failed state as more recent backup(s) is available." + if errCondition != nil { + message = errCondition.Message + "\n" + message + } + backup.Status.State = v1beta1.StateFailed return composed.PatchStatus(backup). + SetExclusiveConditions(metav1.Condition{ + Type: v1beta1.ConditionTypeError, + Status: metav1.ConditionTrue, + Reason: v1beta1.ReasonBackupFailed, + Message: message, + }). SuccessLogMsg("AwsNfsVolumeBackup status updated with Failed state. "). SuccessError(composed.StopAndForget). Run(ctx, state) diff --git a/pkg/skr/awsnfsvolumebackup/markFailed_test.go b/pkg/skr/awsnfsvolumebackup/markFailed_test.go index 3c9476f5..806d84c6 100644 --- a/pkg/skr/awsnfsvolumebackup/markFailed_test.go +++ b/pkg/skr/awsnfsvolumebackup/markFailed_test.go @@ -205,6 +205,9 @@ func (suite *markFailedSuite) TestWhenBackupIsNotLatestAndInError() { suite.Nil(err) suite.Equal(v1beta1.StateFailed, fromK8s.Status.State) + suite.Equal(v1beta1.ConditionTypeError, fromK8s.Status.Conditions[0].Type) + suite.Equal(v1.ConditionTrue, fromK8s.Status.Conditions[0].Status) + suite.Equal(v1beta1.ReasonBackupFailed, fromK8s.Status.Conditions[0].Reason) } func TestMarkFailed(t *testing.T) { diff --git a/pkg/skr/gcpnfsvolumebackup/markFailed.go b/pkg/skr/gcpnfsvolumebackup/markFailed.go index 221f9ea7..4ca2ff95 100644 --- a/pkg/skr/gcpnfsvolumebackup/markFailed.go +++ b/pkg/skr/gcpnfsvolumebackup/markFailed.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/kyma-project/cloud-manager/api/cloud-resources/v1beta1" "github.com/kyma-project/cloud-manager/pkg/composed" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -62,8 +63,20 @@ func markFailed(ctx context.Context, st composed.State) (error, context.Context) for _, item := range list.Items { if item.CreationTimestamp.Time.After(backup.CreationTimestamp.Time) { + errCondition := meta.FindStatusCondition(backup.Status.Conditions, v1beta1.ConditionTypeError) + message := "Backup moved to Failed state as more recent backup(s) is available." + if errCondition != nil { + message = errCondition.Message + "\n" + message + } + backup.Status.State = v1beta1.GcpNfsBackupFailed return composed.PatchStatus(backup). + SetExclusiveConditions(metav1.Condition{ + Type: v1beta1.ConditionTypeError, + Status: metav1.ConditionTrue, + Reason: v1beta1.ReasonBackupFailed, + Message: message, + }). SuccessLogMsg("GcpNfsVolumeBackup status updated with Failed state. "). SuccessError(composed.StopAndForget). Run(ctx, state) diff --git a/pkg/skr/gcpnfsvolumebackup/markFailed_test.go b/pkg/skr/gcpnfsvolumebackup/markFailed_test.go index 63588b18..29dbf930 100644 --- a/pkg/skr/gcpnfsvolumebackup/markFailed_test.go +++ b/pkg/skr/gcpnfsvolumebackup/markFailed_test.go @@ -220,6 +220,9 @@ func (suite *markFailedSuite) TestWhenBackupIsNotLatestAndInError() { suite.Nil(err) suite.Equal(v1beta1.GcpNfsBackupFailed, fromK8s.Status.State) + suite.Equal(v1beta1.ConditionTypeError, fromK8s.Status.Conditions[0].Type) + suite.Equal(v1.ConditionTrue, fromK8s.Status.Conditions[0].Status) + suite.Equal(v1beta1.ReasonBackupFailed, fromK8s.Status.Conditions[0].Reason) } func TestMarkFailed(t *testing.T) {