Skip to content

Commit 46618b3

Browse files
committed
fix(reconciler): wip
1 parent a143979 commit 46618b3

4 files changed

Lines changed: 94 additions & 5 deletions

File tree

config/crd/kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ resources:
2626
- bases/aiven.io_clickhouseroles.yaml
2727
- bases/aiven.io_clickhousegrants.yaml
2828
- bases/aiven.io_serviceintegrationendpoints.yaml
29+
- bases/aiven.io_upgradepipelinesteps.yaml
2930
- bases/aiven.io_flinks.yaml
3031
- bases/aiven.io_valkeys.yaml
3132
#+kubebuilder:scaffold:crdkustomizeresource

controllers/common.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/liip/sheriff"
1515
corev1 "k8s.io/api/core/v1"
1616
apierrors "k8s.io/apimachinery/pkg/api/errors"
17+
"k8s.io/apimachinery/pkg/api/meta"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1819
"k8s.io/apimachinery/pkg/runtime/schema"
1920
"k8s.io/apimachinery/pkg/types"
@@ -151,6 +152,16 @@ func getRunningCondition(status metav1.ConditionStatus, reason, message string)
151152
}
152153
}
153154

155+
func markInstanceRunning(obj v1alpha1.AivenManagedObject) {
156+
meta.SetStatusCondition(obj.Conditions(), getRunningCondition(metav1.ConditionTrue, "CheckRunning", "Instance is running on Aiven side"))
157+
metav1.SetMetaDataAnnotation(obj.GetObjectMeta(), instanceIsRunningAnnotation, "true")
158+
}
159+
160+
func markInstanceNotReconciled(obj v1alpha1.AivenManagedObject) {
161+
delete(obj.GetAnnotations(), instanceIsRunningAnnotation)
162+
meta.SetStatusCondition(obj.Conditions(), getRunningCondition(metav1.ConditionFalse, "CheckRunning", "Instance is not reconciled on Aiven side"))
163+
}
164+
154165
func getErrorCondition(reason errCondition, err error) metav1.Condition {
155166
return metav1.Condition{
156167
Type: ConditionTypeError,

controllers/upgradepipelinestep_controller.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import (
88

99
avngen "github.com/aiven/go-client-codegen"
1010
"github.com/aiven/go-client-codegen/handler/upgradepipeline"
11-
"k8s.io/apimachinery/pkg/api/meta"
1211
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1312
"sigs.k8s.io/controller-runtime/pkg/client"
1413

1514
"github.com/aiven/aiven-operator/api/v1alpha1"
1615
)
1716

18-
const upgradePipelineStepLookupLimit = 2
17+
const upgradePipelineStepLookupLimit = 30
1918

2019
func newUpgradePipelineStepReconciler(c Controller) reconcilerType {
2120
return newManagedReconciler(
@@ -48,14 +47,23 @@ func (r *UpgradePipelineStepController) Observe(ctx context.Context, cr *v1alpha
4847
if step == nil {
4948
cr.Status.ID = ""
5049
cr.Status.LastValidation = nil
50+
markInstanceNotReconciled(cr)
5151
return Observation{ResourceExists: false}, nil
5252
}
5353

5454
r.applyStatus(cr, *step)
55+
if r.hasDrift(cr, *step) {
56+
markInstanceNotReconciled(cr)
57+
return Observation{
58+
ResourceExists: true,
59+
ResourceUpToDate: false,
60+
}, nil
61+
}
62+
markInstanceRunning(cr)
5563

5664
return Observation{
5765
ResourceExists: true,
58-
ResourceUpToDate: !r.hasDrift(cr, *step),
66+
ResourceUpToDate: true,
5967
}, nil
6068
}
6169

@@ -79,6 +87,7 @@ func (r *UpgradePipelineStepController) Create(ctx context.Context, cr *v1alpha1
7987
}
8088

8189
r.applyStatus(cr, upgradepipeline.StepOut(*step))
90+
markInstanceRunning(cr)
8291

8392
return CreateResult{}, nil
8493
}
@@ -97,6 +106,7 @@ func (r *UpgradePipelineStepController) Update(ctx context.Context, cr *v1alpha1
97106
}
98107

99108
r.applyStatus(cr, upgradepipeline.StepOut(*step))
109+
markInstanceRunning(cr)
100110

101111
return UpdateResult{}, nil
102112
}
@@ -174,8 +184,6 @@ func (*UpgradePipelineStepController) applyStatus(cr *v1alpha1.UpgradePipelineSt
174184
} else {
175185
cr.Status.LastValidation = lastValidation
176186
}
177-
meta.SetStatusCondition(&cr.Status.Conditions, getRunningCondition(metav1.ConditionTrue, "CheckRunning", "Instance is running on Aiven side"))
178-
metav1.SetMetaDataAnnotation(&cr.ObjectMeta, instanceIsRunningAnnotation, "true")
179187
}
180188

181189
func (*UpgradePipelineStepController) hasDrift(cr *v1alpha1.UpgradePipelineStep, step upgradepipeline.StepOut) bool {

controllers/upgradepipelinestep_controller_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,34 @@ func TestUpgradePipelineStepReconciler(t *testing.T) {
215215
require.Nil(t, meta.FindStatusCondition(got.Status.Conditions, string(ConditionTypeError)))
216216
})
217217

218+
t.Run("Clears stale readiness when remote step is missing and create requeues", func(t *testing.T) {
219+
step := newObjectFromYAML[v1alpha1.UpgradePipelineStep](t, yamlUpgradePipelineStep)
220+
step.Generation = 1
221+
step.Status.ID = "stale-step"
222+
metav1.SetMetaDataAnnotation(&step.ObjectMeta, processedGenerationAnnotation, "1")
223+
metav1.SetMetaDataAnnotation(&step.ObjectMeta, instanceIsRunningAnnotation, "true")
224+
225+
avn := avngen.NewMockClient(t)
226+
avn.EXPECT().
227+
UpgradePipelineStepList(mock.Anything, step.Spec.OrganizationID, listQuery(step)).
228+
Return(&upgradepipeline.UpgradePipelineStepListOut{}, nil).Once()
229+
avn.EXPECT().
230+
UpgradePipelineStepCreate(mock.Anything, step.Spec.OrganizationID, mock.Anything).
231+
Return(nil, newAivenError(404, "service not found")).Once()
232+
233+
r, res, err := runScenario(t, step, avn)
234+
require.NoError(t, err)
235+
require.Equal(t, ctrlruntime.Result{RequeueAfter: requeueTimeout}, res)
236+
237+
got := &v1alpha1.UpgradePipelineStep{}
238+
require.NoError(t, r.Get(t.Context(), types.NamespacedName{Name: step.Name, Namespace: step.Namespace}, got))
239+
require.False(t, IsReadyToUse(got))
240+
require.NotContains(t, got.Annotations, instanceIsRunningAnnotation)
241+
condition := meta.FindStatusCondition(got.Status.Conditions, conditionTypeRunning)
242+
require.NotNil(t, condition)
243+
require.Equal(t, metav1.ConditionFalse, condition.Status)
244+
})
245+
218246
t.Run("Observes existing upgrade pipeline step by spec and refreshes stale status ID", func(t *testing.T) {
219247
step := newObjectFromYAML[v1alpha1.UpgradePipelineStep](t, yamlUpgradePipelineStep)
220248
step.Generation = 1
@@ -516,6 +544,47 @@ func TestUpgradePipelineStepReconciler(t *testing.T) {
516544
require.Equal(t, "2", got.Annotations[processedGenerationAnnotation])
517545
})
518546

547+
t.Run("Clears stale readiness when drifted step update requeues", func(t *testing.T) {
548+
step := newObjectFromYAML[v1alpha1.UpgradePipelineStep](t, yamlUpgradePipelineStep)
549+
step.Generation = 1
550+
autoValidationDelayDays := 3
551+
step.Spec.AutoValidationDelayDays = &autoValidationDelayDays
552+
step.Status.ID = "stale-step"
553+
metav1.SetMetaDataAnnotation(&step.ObjectMeta, processedGenerationAnnotation, "1")
554+
metav1.SetMetaDataAnnotation(&step.ObjectMeta, instanceIsRunningAnnotation, "true")
555+
556+
avn := avngen.NewMockClient(t)
557+
avn.EXPECT().
558+
UpgradePipelineStepList(mock.Anything, step.Spec.OrganizationID, listQuery(step)).
559+
Return(&upgradepipeline.UpgradePipelineStepListOut{
560+
Steps: []upgradepipeline.StepOut{
561+
{
562+
AutoValidationDelayDays: 7,
563+
DestinationProjectName: step.Spec.DestinationProjectName,
564+
DestinationServiceName: step.Spec.DestinationServiceName,
565+
SourceProjectName: step.Spec.SourceProjectName,
566+
SourceServiceName: step.Spec.SourceServiceName,
567+
StepId: "step-update",
568+
},
569+
},
570+
}, nil).Once()
571+
avn.EXPECT().
572+
UpgradePipelineStepUpdate(mock.Anything, step.Spec.OrganizationID, "step-update", mock.Anything).
573+
Return(nil, newAivenError(404, "step not found")).Once()
574+
575+
r, res, err := runScenario(t, step, avn)
576+
require.NoError(t, err)
577+
require.Equal(t, ctrlruntime.Result{RequeueAfter: requeueTimeout}, res)
578+
579+
got := &v1alpha1.UpgradePipelineStep{}
580+
require.NoError(t, r.Get(t.Context(), types.NamespacedName{Name: step.Name, Namespace: step.Namespace}, got))
581+
require.False(t, IsReadyToUse(got))
582+
require.NotContains(t, got.Annotations, instanceIsRunningAnnotation)
583+
condition := meta.FindStatusCondition(got.Status.Conditions, conditionTypeRunning)
584+
require.NotNil(t, condition)
585+
require.Equal(t, metav1.ConditionFalse, condition.Status)
586+
})
587+
519588
t.Run("Creates upgrade pipeline step when stale status ID isn't found by spec", func(t *testing.T) {
520589
step := newObjectFromYAML[v1alpha1.UpgradePipelineStep](t, yamlUpgradePipelineStep)
521590
step.Generation = 2

0 commit comments

Comments
 (0)