Skip to content

Commit

Permalink
feat(RELEASE-1053): add support for final pipeline run
Browse files Browse the repository at this point in the history
  • Loading branch information
seanconroy2021 committed Sep 25, 2024
1 parent 4860148 commit 2dc3602
Show file tree
Hide file tree
Showing 16 changed files with 1,237 additions and 405 deletions.
4 changes: 2 additions & 2 deletions api/v1alpha1/release_conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package v1alpha1
import "github.com/konflux-ci/operator-toolkit/conditions"

const (
// postActionsExecutedConditionType is the type used to track the status of Release post-actions
postActionsExecutedConditionType conditions.ConditionType = "PostActionsExecuted"
// finalProcessedConditionType is the type used to track the status of a Release Final Pipeline processing
finalProcessedConditionType conditions.ConditionType = "FinalPipelineProcessed"

// managedProcessedConditionType is the type used to track the status of a Release Managed Pipeline processing
managedProcessedConditionType conditions.ConditionType = "ManagedPipelineProcessed"
Expand Down
139 changes: 77 additions & 62 deletions api/v1alpha1/release_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ type ReleaseStatus struct {
// +optional
Conditions []metav1.Condition `json:"conditions"`

// PostActionsExecution contains information about the post-actions execution
// FinalProcessing contains information about the release final processing
// +optional
PostActionsExecution PipelineInfo `json:"postActionsExecution,omitempty"`
FinalProcessing PipelineInfo `json:"finalProcessing,omitempty"`

// ManagedProcessing contains information about the release managed processing
// +optional
Expand Down Expand Up @@ -164,12 +164,6 @@ type Release struct {
Status ReleaseStatus `json:"status,omitempty"`
}

// HasEveryPostActionExecutionFinished checks whether the Release post-actions execution has finished,
// regardless of the result.
func (r *Release) HasEveryPostActionExecutionFinished() bool {
return r.hasPhaseFinished(postActionsExecutedConditionType)
}

// HasManagedPipelineProcessingFinished checks whether the Release Managed Pipeline processing has finished, regardless of the result.
func (r *Release) HasManagedPipelineProcessingFinished() bool {
return r.hasPhaseFinished(managedProcessedConditionType)
Expand All @@ -180,6 +174,11 @@ func (r *Release) HasTenantPipelineProcessingFinished() bool {
return r.hasPhaseFinished(tenantProcessedConditionType)
}

// Has FinalPipelineProcessingFinished checks whether the Release Final Pipeline processing has finished, regardless of the result.
func (r *Release) HasFinalPipelineProcessingFinished() bool {
return r.hasPhaseFinished(finalProcessedConditionType)
}

// HasReleaseFinished checks whether the Release has finished, regardless of the result.
func (r *Release) HasReleaseFinished() bool {
return r.hasPhaseFinished(releasedConditionType)
Expand All @@ -195,16 +194,6 @@ func (r *Release) IsAutomated() bool {
return r.Status.Automated
}

// IsEveryPostActionExecuted checks whether the Release post-actions were successfully executed.
func (r *Release) IsEveryPostActionExecuted() bool {
return meta.IsStatusConditionTrue(r.Status.Conditions, postActionsExecutedConditionType.String())
}

// IsEachPostActionExecuting checks whether the Release post-actions are in progress.
func (r *Release) IsEachPostActionExecuting() bool {
return r.isPhaseProgressing(postActionsExecutedConditionType)
}

// IsManagedPipelineProcessed checks whether the Release Managed Pipeline was successfully processed.
func (r *Release) IsManagedPipelineProcessed() bool {
return meta.IsStatusConditionTrue(r.Status.Conditions, managedProcessedConditionType.String())
Expand All @@ -215,6 +204,11 @@ func (r *Release) IsTenantPipelineProcessed() bool {
return meta.IsStatusConditionTrue(r.Status.Conditions, tenantProcessedConditionType.String())
}

// IsFinalPipelineProcessed checks whether the Release Final Pipeline was successfully processed.
func (r *Release) IsFinalPipelineProcessed() bool {
return meta.IsStatusConditionTrue(r.Status.Conditions, finalProcessedConditionType.String())
}

// IsManagedPipelineProcessing checks whether the Release Managed Pipeline processing is in progress.
func (r *Release) IsManagedPipelineProcessing() bool {
return r.isPhaseProgressing(managedProcessedConditionType)
Expand All @@ -225,6 +219,11 @@ func (r *Release) IsTenantPipelineProcessing() bool {
return r.isPhaseProgressing(tenantProcessedConditionType)
}

// IsFinalPipelineProcessing checks whether the Release Final Pipeline processing is in progress.
func (r *Release) IsFinalPipelineProcessing() bool {
return r.isPhaseProgressing(finalProcessedConditionType)
}

// IsReleased checks whether the Release has finished successfully.
func (r *Release) IsReleased() bool {
return meta.IsStatusConditionTrue(r.Status.Conditions, releasedConditionType.String())
Expand Down Expand Up @@ -274,6 +273,23 @@ func (r *Release) MarkTenantPipelineProcessed() {
)
}

// MarkFinalPipelineProcessed marks the Release Final Pipeline as processed.
func (r *Release) MarkFinalPipelineProcessed() {
if !r.IsFinalPipelineProcessing() || r.HasFinalPipelineProcessingFinished() {
return
}

r.Status.FinalProcessing.CompletionTime = &metav1.Time{Time: time.Now()}
conditions.SetCondition(&r.Status.Conditions, finalProcessedConditionType, metav1.ConditionTrue, SucceededReason)

go metrics.RegisterCompletedReleaseFinalPipelineProcessing(
r.Status.FinalProcessing.StartTime,
r.Status.FinalProcessing.CompletionTime,
SucceededReason.String(),
r.Status.Target,
)
}

// MarkManagedPipelineProcessing marks the Release Managed Pipeline as processing.
func (r *Release) MarkManagedPipelineProcessing() {
if r.HasManagedPipelineProcessingFinished() {
Expand Down Expand Up @@ -314,6 +330,26 @@ func (r *Release) MarkTenantPipelineProcessing() {
)
}

// MarkFinalPipelineProcessing marks the Release Final Pipeline as processing.
func (r *Release) MarkFinalPipelineProcessing() {
if r.HasFinalPipelineProcessingFinished() {
return
}

if !r.IsFinalPipelineProcessing() {
r.Status.FinalProcessing.StartTime = &metav1.Time{Time: time.Now()}
}

conditions.SetCondition(&r.Status.Conditions, finalProcessedConditionType, metav1.ConditionFalse, ProgressingReason)

go metrics.RegisterNewReleaseFinalPipelineProcessing(
r.Status.FinalProcessing.StartTime,
r.Status.StartTime,
ProgressingReason.String(),
r.Status.Target,
)
}

// MarkManagedPipelineProcessingFailed marks the Release Managed Pipeline processing as failed.
func (r *Release) MarkManagedPipelineProcessingFailed(message string) {
if !r.IsManagedPipelineProcessing() || r.HasManagedPipelineProcessingFinished() {
Expand Down Expand Up @@ -348,6 +384,23 @@ func (r *Release) MarkTenantPipelineProcessingFailed(message string) {
)
}

// MarkFinalPipelineProcessingFailed marks the Release Final Pipeline processing as failed.
func (r *Release) MarkFinalPipelineProcessingFailed(message string) {
if !r.IsFinalPipelineProcessing() || r.HasFinalPipelineProcessingFinished() {
return
}

r.Status.FinalProcessing.CompletionTime = &metav1.Time{Time: time.Now()}
conditions.SetConditionWithMessage(&r.Status.Conditions, finalProcessedConditionType, metav1.ConditionFalse, FailedReason, message)

go metrics.RegisterCompletedReleaseFinalPipelineProcessing(
r.Status.FinalProcessing.StartTime,
r.Status.FinalProcessing.CompletionTime,
FailedReason.String(),
r.Status.Target,
)
}

// MarkManagedPipelineProcessingSkipped marks the Release Managed Pipeline processing as skipped.
func (r *Release) MarkManagedPipelineProcessingSkipped() {
if r.HasManagedPipelineProcessingFinished() {
Expand All @@ -366,51 +419,13 @@ func (r *Release) MarkTenantPipelineProcessingSkipped() {
conditions.SetCondition(&r.Status.Conditions, tenantProcessedConditionType, metav1.ConditionTrue, SkippedReason)
}

// MarkPostActionsExecuted marks the Release post-actions as executed.
func (r *Release) MarkPostActionsExecuted() {
if !r.IsEachPostActionExecuting() || r.HasEveryPostActionExecutionFinished() {
return
}

r.Status.PostActionsExecution.CompletionTime = &metav1.Time{Time: time.Now()}
conditions.SetCondition(&r.Status.Conditions, postActionsExecutedConditionType, metav1.ConditionTrue, SucceededReason)

go metrics.RegisterCompletedReleasePostActionsExecuted(
r.Status.PostActionsExecution.StartTime,
r.Status.PostActionsExecution.CompletionTime,
SucceededReason.String(),
)
}

// MarkPostActionsExecuting marks the Release post-actions as executing.
func (r *Release) MarkPostActionsExecuting(message string) {
if r.HasEveryPostActionExecutionFinished() {
// MarkFinalPipelineProcessingSkipped marks the Release Final Pipeline processing as skipped.
func (r *Release) MarkFinalPipelineProcessingSkipped() {
if r.HasFinalPipelineProcessingFinished() {
return
}

if !r.IsEachPostActionExecuting() {
r.Status.PostActionsExecution.StartTime = &metav1.Time{Time: time.Now()}
}

conditions.SetConditionWithMessage(&r.Status.Conditions, postActionsExecutedConditionType, metav1.ConditionFalse, ProgressingReason, message)

go metrics.RegisterNewReleasePostActionsExecution()
}

// MarkPostActionsExecutionFailed marks the Release post-actions execution as failed.
func (r *Release) MarkPostActionsExecutionFailed(message string) {
if !r.IsEachPostActionExecuting() || r.HasEveryPostActionExecutionFinished() {
return
}

r.Status.PostActionsExecution.CompletionTime = &metav1.Time{Time: time.Now()}
conditions.SetConditionWithMessage(&r.Status.Conditions, postActionsExecutedConditionType, metav1.ConditionFalse, FailedReason, message)

go metrics.RegisterCompletedReleasePostActionsExecuted(
r.Status.PostActionsExecution.StartTime,
r.Status.PostActionsExecution.CompletionTime,
FailedReason.String(),
)
conditions.SetCondition(&r.Status.Conditions, finalProcessedConditionType, metav1.ConditionTrue, SkippedReason)
}

// MarkReleased marks the Release as released.
Expand All @@ -426,10 +441,10 @@ func (r *Release) MarkReleased() {
r.Status.StartTime,
r.Status.CompletionTime,
r.getPhaseReason(managedProcessedConditionType),
r.getPhaseReason(postActionsExecutedConditionType),
SucceededReason.String(),
r.Status.Target,
r.getPhaseReason(tenantProcessedConditionType),
r.getPhaseReason(finalProcessedConditionType),
r.getPhaseReason(validatedConditionType),
)
}
Expand Down Expand Up @@ -461,9 +476,9 @@ func (r *Release) MarkReleaseFailed(message string) {
go metrics.RegisterCompletedRelease(
r.Status.StartTime,
r.Status.CompletionTime,
r.getPhaseReason(postActionsExecutedConditionType),
r.getPhaseReason(tenantProcessedConditionType),
r.getPhaseReason(managedProcessedConditionType),
r.getPhaseReason(finalProcessedConditionType),
FailedReason.String(),
r.Status.Target,
r.getPhaseReason(validatedConditionType),
Expand Down
Loading

0 comments on commit 2dc3602

Please sign in to comment.