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  }