diff --git a/apis/core/v1beta1/conditions.go b/apis/core/v1beta1/conditions.go index c0617e70e..7456fbb59 100644 --- a/apis/core/v1beta1/conditions.go +++ b/apis/core/v1beta1/conditions.go @@ -478,6 +478,8 @@ const ( OpenStackVersionMinorUpdateControlplane condition.Type = "MinorUpdateControlplane" OpenStackVersionMinorUpdateDataplane condition.Type = "MinorUpdateDataplane" + + OpenStackVersionMinorUpdateAvailable condition.Type = "MinorUpdateAvailable" ) // Version Messages used by API objects. @@ -506,4 +508,7 @@ const ( // OpenStackVersionMinorUpdateReadyErrorMessage OpenStackVersionMinorUpdateReadyErrorMessage = "error occured %s" + + // OpenStackVersionMinorUpdateAvailableMessage + OpenStackVersionMinorUpdateAvailableMessage = "update available" ) diff --git a/controllers/core/openstackversion_controller.go b/controllers/core/openstackversion_controller.go index 88d50998d..255a7de4c 100644 --- a/controllers/core/openstackversion_controller.go +++ b/controllers/core/openstackversion_controller.go @@ -301,6 +301,14 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req Log.Info("Setting DeployedVersion") instance.Status.DeployedVersion = &instance.Spec.TargetVersion } + if instance.Status.DeployedVersion != nil && + *instance.Status.AvailableVersion != *instance.Status.DeployedVersion { + instance.Status.Conditions.Set(condition.TrueCondition( + corev1beta1.OpenStackVersionMinorUpdateAvailable, + corev1beta1.OpenStackVersionMinorUpdateAvailableMessage)) + } else { + instance.Status.Conditions.Remove(corev1beta1.OpenStackVersionMinorUpdateAvailable) + } return ctrl.Result{}, nil } diff --git a/tests/functional/ctlplane/openstackversion_controller_test.go b/tests/functional/ctlplane/openstackversion_controller_test.go index 362aaa34e..68ee88a09 100644 --- a/tests/functional/ctlplane/openstackversion_controller_test.go +++ b/tests/functional/ctlplane/openstackversion_controller_test.go @@ -96,8 +96,11 @@ var _ = Describe("OpenStackOperator controller", func() { version := GetOpenStackVersion(names.OpenStackVersionName) g.Expect(version).Should(Not(BeNil())) - g.Expect(*version.Status.AvailableVersion).Should(Equal("0.0.1")) - g.Expect(version.Spec.TargetVersion).Should(Equal("0.0.1")) + // no condition which reflects an update is available + g.Expect(version.Status.Conditions.Has(corev1.OpenStackVersionMinorUpdateAvailable)).To(BeFalse()) + + g.Expect(*version.Status.AvailableVersion).Should(ContainSubstring("0.0.1")) + g.Expect(version.Spec.TargetVersion).Should(ContainSubstring("0.0.1")) g.Expect(version.Status.ContainerImages.AgentImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.AnsibleeeImage).ShouldNot(BeNil()) @@ -288,15 +291,15 @@ var _ = Describe("OpenStackOperator controller", func() { targetOvnControllerVersion = *version.Status.ContainerImages.OvnControllerImage g.Expect(version).Should(Not(BeNil())) - g.Expect(*version.Status.AvailableVersion).Should(Equal("0.0.1")) - g.Expect(version.Spec.TargetVersion).Should(Equal("0.0.1")) - + g.Expect(*version.Status.AvailableVersion).Should(ContainSubstring("0.0.1")) + g.Expect(version.Spec.TargetVersion).Should(ContainSubstring("0.0.1")) + updatedVersion = *version.Status.AvailableVersion }, timeout, interval).Should(Succeed()) // inject an "old" version Eventually(func(g Gomega) { version := GetOpenStackVersion(names.OpenStackVersionName) - version.Status.ContainerImageVersionDefaults[initialVersion] = version.Status.ContainerImageVersionDefaults["0.0.1"] + version.Status.ContainerImageVersionDefaults[initialVersion] = version.Status.ContainerImageVersionDefaults[updatedVersion] version.Status.ContainerImageVersionDefaults[initialVersion].OvnControllerImage = &testOvnControllerImage g.Expect(th.K8sClient.Status().Update(th.Ctx, version)).To(Succeed()) @@ -388,6 +391,15 @@ var _ = Describe("OpenStackOperator controller", func() { // 1) switch to version 0.0.1, this triggers a minor update osversion := GetOpenStackVersion(names.OpenStackVersionName) + + // should have a condition which reflects an update is available + th.ExpectCondition( + names.OpenStackVersionName, + ConditionGetterFunc(OpenStackVersionConditionGetter), + corev1.OpenStackVersionMinorUpdateAvailable, + k8s_corev1.ConditionTrue, + ) + osversion.Spec.TargetVersion = updatedVersion Expect(k8sClient.Update(ctx, osversion)).Should(Succeed()) @@ -533,7 +545,8 @@ var _ = Describe("OpenStackOperator controller", func() { k8s_corev1.ConditionTrue, ) g.Expect(osversion.Status.DeployedVersion).Should(Equal(&updatedVersion)) // we're done here - + // no condition which reflects an update is available + g.Expect(osversion.Status.Conditions.Has(corev1.OpenStackVersionMinorUpdateAvailable)).To(BeFalse()) }, timeout, interval).Should(Succeed()) })