@@ -32,6 +32,7 @@ import (
3232 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3333
3434 "github.com/go-logr/logr"
35+ dataplanev1 "github.com/openstack-k8s-operators/dataplane-operator/api/v1beta1"
3536 condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
3637 "github.com/openstack-k8s-operators/lib-common/modules/common/helper"
3738 corev1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1"
@@ -56,16 +57,6 @@ func SetupVersionDefaults() {
5657 envContainerImages = localVars
5758}
5859
59- func compareStringPointers (a , b * string ) bool {
60- if a == nil && b == nil {
61- return true
62- }
63- if a == nil || b == nil {
64- return false
65- }
66- return * a == * b
67- }
68-
6960// OpenStackVersionReconciler reconciles a OpenStackVersion object
7061type OpenStackVersionReconciler struct {
7162 client.Client
@@ -79,9 +70,11 @@ func (r *OpenStackVersionReconciler) GetLogger(ctx context.Context) logr.Logger
7970 return log .FromContext (ctx ).WithName ("Controllers" ).WithName ("OpenStackVersion" )
8071}
8172
82- //+kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions,verbs=get;list;watch;create;update;patch;delete
83- //+kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions/status,verbs=get;update;patch
84- //+kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions/finalizers,verbs=update
73+ // +kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions,verbs=get;list;watch;create;update;patch;delete
74+ // +kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions/status,verbs=get;update;patch
75+ // +kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions/finalizers,verbs=update
76+ // +kubebuilder:rbac:groups=core.openstack.org,resources=openstackcontrolplanes,verbs=get;list;watch
77+ // +kubebuilder:rbac:groups=dataplane.openstack.org,resources=openstackdataplanenodesets,verbs=get;list;watch
8578
8679// Reconcile is part of the main kubernetes reconciliation loop which aims to
8780// move the current state of the cluster closer to the desired state.
@@ -159,10 +152,10 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
159152 // no minor update conditions unless we have a deployed version
160153 if instance .Status .DeployedVersion != nil && instance .Spec .TargetVersion != * instance .Status .DeployedVersion {
161154 cl = append (cl , * condition .UnknownCondition (corev1beta1 .OpenStackVersionMinorUpdateOVNControlplane , condition .InitReason , string (corev1beta1 .OpenStackVersionMinorUpdateInitMessage )),
162- * condition .UnknownCondition (corev1beta1 .OpenStackVersionMinorUpdateControlplane , condition .InitReason , string (corev1beta1 .OpenStackVersionMinorUpdateInitMessage )))
163- // fixme add dataplane conditions here
164- // condition.UnknownCondition(corev1beta1.OpenStackVersionMinorUpdateOVNDataplane , condition.InitReason, string(corev1beta1.OpenStackVersionMinorUpdateInitMessage)),
165- //condition.UnknownCondition(corev1beta1.OpenStackVersionMinorUpdateDataplane, condition.InitReason, string(corev1beta1.OpenStackVersionMinorUpdateInitMessage)) )
155+ * condition .UnknownCondition (corev1beta1 .OpenStackVersionMinorUpdateOVNDataplane , condition .InitReason , string (corev1beta1 .OpenStackVersionMinorUpdateInitMessage )),
156+ * condition . UnknownCondition ( corev1beta1 . OpenStackVersionMinorUpdateControlplane , condition . InitReason , string ( corev1beta1 . OpenStackVersionMinorUpdateInitMessage )),
157+ * condition .UnknownCondition (corev1beta1 .OpenStackVersionMinorUpdateDataplane , condition .InitReason , string (corev1beta1 .OpenStackVersionMinorUpdateInitMessage )),
158+ )
166159 }
167160 instance .Status .Conditions .Init (& cl )
168161 instance .Status .ObservedGeneration = instance .Generation
@@ -182,13 +175,14 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
182175
183176 instance .Status .AvailableVersion = & envAvailableVersion
184177 defaults := openstack .InitializeOpenStackVersionImageDefaults (ctx , envContainerImages )
185- // store the defaults for the currently available version
186178 if instance .Status .ContainerImageVersionDefaults == nil {
187179 instance .Status .ContainerImageVersionDefaults = make (map [string ]* corev1beta1.ContainerDefaults )
188180 }
181+ // store the defaults for the currently available version
189182 instance .Status .ContainerImageVersionDefaults [envAvailableVersion ] = defaults
190183
191184 // calculate the container images for the target version
185+ Log .Info ("Target version: " , "targetVersion" , instance .Spec .TargetVersion )
192186 val , ok := instance .Status .ContainerImageVersionDefaults [instance .Spec .TargetVersion ]
193187 if ! ok {
194188 Log .Info ("Target version not found in defaults" , "targetVersion" , instance .Spec .TargetVersion )
@@ -208,25 +202,30 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
208202 Name : instance .Name ,
209203 }, controlPlane )
210204 if err != nil {
211- // we ignore not found
212205 if k8s_errors .IsNotFound (err ) {
213- Log .Info ("No controlplane found." )
206+ Log .Info ("Controlplane not found:" , "instance name" , instance . Name )
214207 return ctrl.Result {}, nil
215208 }
216209 return ctrl.Result {}, err
217210 }
218211
219- // greenfield deployment //FIXME check dataplane here too
220- if controlPlane .Status .DeployedVersion == nil {
221- Log .Info ("No controlplane or controlplane is not deployed" )
222- return ctrl.Result {}, nil
212+ // lookup nodesets
213+ dataplaneNodesets , err := openstack .GetDataplaneNodesets (ctx , controlPlane , versionHelper )
214+ if err != nil {
215+ Log .Error (err , "Failed to get dataplane nodesets" )
216+ return ctrl.Result {}, err
223217 }
224218
225- // TODO minor update for OVN Dataplane in progress
219+ // greenfield deployment
220+ if controlPlane .Status .DeployedVersion == nil && ! openstack .DataplaneNodesetsDeployedVersionIsSet (dataplaneNodesets ) {
221+ Log .Info ("Waiting for controlplane and dataplane nodesets to be deployed." )
222+ return ctrl.Result {}, nil
223+ }
226224
227- // minor update for OVN Controlplane in progress
225+ // minor update in progress
228226 if instance .Status .DeployedVersion != nil && instance .Spec .TargetVersion != * instance .Status .DeployedVersion {
229- if ! compareStringPointers (controlPlane .Status .ContainerImages .OvnControllerImage , instance .Status .ContainerImages .OvnControllerImage ) ||
227+
228+ if ! openstack .OVNControllerImageMatch (controlPlane , instance ) ||
230229 ! controlPlane .Status .Conditions .IsTrue (corev1beta1 .OpenStackControlPlaneOVNReadyCondition ) {
231230 instance .Status .Conditions .Set (condition .FalseCondition (
232231 corev1beta1 .OpenStackVersionMinorUpdateOVNControlplane ,
@@ -240,10 +239,22 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
240239 corev1beta1 .OpenStackVersionMinorUpdateOVNControlplane ,
241240 corev1beta1 .OpenStackVersionMinorUpdateReadyMessage )
242241
242+ // minor update for Dataplane OVN
243+ if ! openstack .DataplaneNodesetsOVNControllerImagesMatch (instance , dataplaneNodesets ) {
244+ instance .Status .Conditions .Set (condition .FalseCondition (
245+ corev1beta1 .OpenStackVersionMinorUpdateOVNDataplane ,
246+ condition .RequestedReason ,
247+ condition .SeverityInfo ,
248+ corev1beta1 .OpenStackVersionMinorUpdateReadyRunningMessage ))
249+ Log .Info ("Waiting on OVN Dataplane updates to complete" )
250+ return ctrl.Result {}, nil
251+ }
252+ instance .Status .Conditions .MarkTrue (
253+ corev1beta1 .OpenStackVersionMinorUpdateOVNDataplane ,
254+ corev1beta1 .OpenStackVersionMinorUpdateReadyMessage )
255+
243256 // minor update for Controlplane in progress
244- // we only check keystone here as it will only get updated during this phase
245- // FIXME: add checks to all images on the Controlplane here once conditions and observedGeneration work are finished
246- if ! compareStringPointers (controlPlane .Status .ContainerImages .KeystoneAPIImage , instance .Status .ContainerImages .KeystoneAPIImage ) ||
257+ if ! openstack .ControlplaneContainerImageMatch (controlPlane , instance ) ||
247258 ! controlPlane .IsReady () {
248259 instance .Status .Conditions .Set (condition .FalseCondition (
249260 corev1beta1 .OpenStackVersionMinorUpdateControlplane ,
@@ -253,11 +264,23 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
253264 Log .Info ("Minor update for Controlplane in progress" )
254265 return ctrl.Result {}, nil
255266 }
256- // TODO minor update for Dataplane in progress goes here
257-
258267 instance .Status .Conditions .MarkTrue (
259268 corev1beta1 .OpenStackVersionMinorUpdateControlplane ,
260269 corev1beta1 .OpenStackVersionMinorUpdateReadyMessage )
270+
271+ if ! openstack .DataplaneNodesetsDeployed (instance , dataplaneNodesets ) {
272+ instance .Status .Conditions .Set (condition .FalseCondition (
273+ corev1beta1 .OpenStackVersionMinorUpdateDataplane ,
274+ condition .RequestedReason ,
275+ condition .SeverityInfo ,
276+ corev1beta1 .OpenStackVersionMinorUpdateReadyRunningMessage ))
277+ Log .Info ("Waiting on Dataplane update to complete" )
278+ return ctrl.Result {}, nil
279+ }
280+
281+ instance .Status .Conditions .MarkTrue (
282+ corev1beta1 .OpenStackVersionMinorUpdateDataplane ,
283+ corev1beta1 .OpenStackVersionMinorUpdateReadyMessage )
261284 }
262285
263286 if controlPlane .IsReady () {
@@ -301,6 +324,7 @@ func (r *OpenStackVersionReconciler) SetupWithManager(mgr ctrl.Manager) error {
301324
302325 return ctrl .NewControllerManagedBy (mgr ).
303326 Watches (& corev1beta1.OpenStackControlPlane {}, versionFunc ).
327+ Watches (& dataplanev1.OpenStackDataPlaneNodeSet {}, versionFunc ).
304328 For (& corev1beta1.OpenStackVersion {}).
305329 Complete (r )
306330}
0 commit comments