Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions controllers/tf_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,11 @@ func (r *TerraformReconciler) shouldReconcile(terraform *infrav1.Terraform, sour
return true, "source revision has changed since last reconciliation attempt", 0
}

// reconcile if we were last blocked on a not ready dependency
if conditions.HasAnyReason(terraform, meta.ReadyCondition, infrav1.DependencyNotReadyReason) {
return true, "previously blocked on not ready dependency", 0
}

// reconcile if the last reconciliation failed, and we are within the retry interval
if terraform.Status.ReconciliationFailures > 0 && terraform.Status.LastPlanAt != nil && !conditions.IsTrue(terraform, meta.ReadyCondition) {
nextRetry := terraform.Status.LastPlanAt.Add(terraform.GetRetryInterval())
Expand Down
34 changes: 34 additions & 0 deletions controllers/tf_controller_interval_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,40 @@ func TestShouldReconcileWhenForceEnabled(t *testing.T) {
g.Expect(requeueAfter).To(Equal(time.Duration(0)))
}

func TestShouldReconcileWhenDependencyNotReady(t *testing.T) {
Spec("This spec covers reconciling when a dependency is not ready.")
It("should return true without delay.")

g := NewWithT(t)
reconciler := &TerraformReconciler{}

tf := &infrav1.Terraform{
ObjectMeta: metav1.ObjectMeta{
Generation: 1,
},
Spec: infrav1.TerraformSpec{
Interval: metav1.Duration{Duration: 24 * time.Hour},
},
Status: infrav1.TerraformStatus{
LastPlanAt: &metav1.Time{Time: time.Now()},
ObservedGeneration: 1,
Conditions: []metav1.Condition{
{
Message: "Dependencies do not meet ready condition, retrying in 30s",
Reason: infrav1.DependencyNotReadyReason,
Type: meta.ReadyCondition,
Status: metav1.ConditionFalse,
},
},
},
}

shouldReconcile, reason, requeueAfter := reconciler.shouldReconcile(tf, nil)
g.Expect(shouldReconcile).To(BeTrue())
g.Expect(reason).To(Equal("previously blocked on not ready dependency"))
g.Expect(requeueAfter).To(Equal(time.Duration(0)))
}

func TestShouldReconcileWhenSourceRevisionChanges(t *testing.T) {
Spec("This spec covers reconciling when the source revision has changed.")
It("should return true without delay.")
Expand Down