github.com/crossplane/upjet@v1.3.0/pkg/resource/conditions.go (about) 1 // SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io> 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package resource 6 7 import ( 8 xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1" 9 xpresource "github.com/crossplane/crossplane-runtime/pkg/resource" 10 corev1 "k8s.io/api/core/v1" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 13 tferrors "github.com/crossplane/upjet/pkg/terraform/errors" 14 ) 15 16 // Condition constants. 17 const ( 18 TypeLastAsyncOperation = "LastAsyncOperation" 19 TypeAsyncOperation = "AsyncOperation" 20 21 ReasonApplyFailure xpv1.ConditionReason = "ApplyFailure" 22 ReasonDestroyFailure xpv1.ConditionReason = "DestroyFailure" 23 ReasonAsyncCreateFailure xpv1.ConditionReason = "AsyncCreateFailure" 24 ReasonAsyncUpdateFailure xpv1.ConditionReason = "AsyncUpdateFailure" 25 ReasonAsyncDeleteFailure xpv1.ConditionReason = "AsyncDeleteFailure" 26 ReasonSuccess xpv1.ConditionReason = "Success" 27 ReasonOngoing xpv1.ConditionReason = "Ongoing" 28 ReasonFinished xpv1.ConditionReason = "Finished" 29 ReasonResourceUpToDate xpv1.ConditionReason = "UpToDate" 30 ) 31 32 // LastAsyncOperationCondition returns the condition depending on the content 33 // of the error. 34 func LastAsyncOperationCondition(err error) xpv1.Condition { 35 switch { 36 case err == nil: 37 return xpv1.Condition{ 38 Type: TypeLastAsyncOperation, 39 Status: corev1.ConditionTrue, 40 LastTransitionTime: metav1.Now(), 41 Reason: ReasonSuccess, 42 } 43 case tferrors.IsApplyFailed(err): 44 return xpv1.Condition{ 45 Type: TypeLastAsyncOperation, 46 Status: corev1.ConditionFalse, 47 LastTransitionTime: metav1.Now(), 48 Reason: ReasonApplyFailure, 49 Message: err.Error(), 50 } 51 case tferrors.IsDestroyFailed(err): 52 return xpv1.Condition{ 53 Type: TypeLastAsyncOperation, 54 Status: corev1.ConditionFalse, 55 LastTransitionTime: metav1.Now(), 56 Reason: ReasonDestroyFailure, 57 Message: err.Error(), 58 } 59 case tferrors.IsAsyncCreateFailed(err): 60 return xpv1.Condition{ 61 Type: TypeLastAsyncOperation, 62 Status: corev1.ConditionFalse, 63 LastTransitionTime: metav1.Now(), 64 Reason: ReasonAsyncCreateFailure, 65 Message: err.Error(), 66 } 67 case tferrors.IsAsyncUpdateFailed(err): 68 return xpv1.Condition{ 69 Type: TypeLastAsyncOperation, 70 Status: corev1.ConditionFalse, 71 LastTransitionTime: metav1.Now(), 72 Reason: ReasonAsyncUpdateFailure, 73 Message: err.Error(), 74 } 75 case tferrors.IsAsyncDeleteFailed(err): 76 return xpv1.Condition{ 77 Type: TypeLastAsyncOperation, 78 Status: corev1.ConditionFalse, 79 LastTransitionTime: metav1.Now(), 80 Reason: ReasonAsyncDeleteFailure, 81 Message: err.Error(), 82 } 83 default: 84 return xpv1.Condition{ 85 Type: "Unknown", 86 Status: corev1.ConditionFalse, 87 LastTransitionTime: metav1.Now(), 88 Reason: "Unknown", 89 Message: err.Error(), 90 } 91 } 92 } 93 94 // AsyncOperationFinishedCondition returns the condition TypeAsyncOperation Finished 95 // if the operation was finished 96 func AsyncOperationFinishedCondition() xpv1.Condition { 97 return xpv1.Condition{ 98 Type: TypeAsyncOperation, 99 Status: corev1.ConditionTrue, 100 LastTransitionTime: metav1.Now(), 101 Reason: ReasonFinished, 102 } 103 } 104 105 // AsyncOperationOngoingCondition returns the condition TypeAsyncOperation Ongoing 106 // if the operation is still running 107 func AsyncOperationOngoingCondition() xpv1.Condition { 108 return xpv1.Condition{ 109 Type: TypeAsyncOperation, 110 Status: corev1.ConditionFalse, 111 LastTransitionTime: metav1.Now(), 112 Reason: ReasonOngoing, 113 } 114 } 115 116 // UpToDateCondition returns the condition TypeAsyncOperation Ongoing 117 // if the operation is still running 118 func UpToDateCondition() xpv1.Condition { 119 return xpv1.Condition{ 120 Type: "Test", 121 Status: corev1.ConditionTrue, 122 LastTransitionTime: metav1.Now(), 123 Reason: ReasonResourceUpToDate, 124 } 125 } 126 127 // SetUpToDateCondition sets UpToDate condition if the resource is a test resource and up-to-date 128 func SetUpToDateCondition(mg xpresource.Managed, upToDate bool) { 129 // At this point, we know that late initialization is done 130 // After running refresh, if the resource is up-to-date and a test resource 131 // we can set the UpToDate condition 132 if upToDate && IsTest(mg) { 133 mg.SetConditions(UpToDateCondition()) 134 } 135 }