Skip to content

Commit ae9065e

Browse files
committed
EDPM condition and update order checks
1 parent 43153af commit ae9065e

30 files changed

+303
-173
lines changed

config/rbac/role.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,14 @@ rules:
180180
- get
181181
- patch
182182
- update
183+
- apiGroups:
184+
- dataplane.openstack.org
185+
resources:
186+
- openstackdataplanenodesets
187+
verbs:
188+
- get
189+
- list
190+
- watch
183191
- apiGroups:
184192
- designate.openstack.org
185193
resources:

controllers/core/openstackcontrolplane_controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,9 @@ func (r *OpenStackControlPlaneReconciler) Reconcile(ctx context.Context, req ctr
245245
}
246246
instance.Status.DeployedOVNVersion = &version.Spec.TargetVersion
247247
return ctrl.Result{}, nil
248-
} else if !version.Status.Conditions.IsTrue(corev1beta1.OpenStackVersionMinorUpdateControlplane) {
248+
} else if version.Status.Conditions.IsTrue(corev1beta1.OpenStackVersionMinorUpdateOVNDataplane) &&
249+
!version.Status.Conditions.IsTrue(corev1beta1.OpenStackVersionMinorUpdateControlplane) {
250+
249251
Log.Info("Minor update on the ControlPlane")
250252
ctrlResult, err := r.reconcileNormal(ctx, instance, version, helper)
251253
if err != nil {

controllers/core/openstackversion_controller.go

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
@@ -69,9 +70,11 @@ func (r *OpenStackVersionReconciler) GetLogger(ctx context.Context) logr.Logger
6970
return log.FromContext(ctx).WithName("Controllers").WithName("OpenStackVersion")
7071
}
7172

72-
//+kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions,verbs=get;list;watch;create;update;patch;delete
73-
//+kubebuilder:rbac:groups=core.openstack.org,resources=openstackversions/status,verbs=get;update;patch
74-
//+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
7578

7679
// Reconcile is part of the main kubernetes reconciliation loop which aims to
7780
// move the current state of the cluster closer to the desired state.
@@ -149,10 +152,10 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
149152
// no minor update conditions unless we have a deployed version
150153
if instance.Status.DeployedVersion != nil && instance.Spec.TargetVersion != *instance.Status.DeployedVersion {
151154
cl = append(cl, *condition.UnknownCondition(corev1beta1.OpenStackVersionMinorUpdateOVNControlplane, condition.InitReason, string(corev1beta1.OpenStackVersionMinorUpdateInitMessage)),
152-
*condition.UnknownCondition(corev1beta1.OpenStackVersionMinorUpdateControlplane, condition.InitReason, string(corev1beta1.OpenStackVersionMinorUpdateInitMessage)))
153-
// fixme add dataplane conditions here
154-
//condition.UnknownCondition(corev1beta1.OpenStackVersionMinorUpdateOVNDataplane, condition.InitReason, string(corev1beta1.OpenStackVersionMinorUpdateInitMessage)),
155-
//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+
)
156159
}
157160
instance.Status.Conditions.Init(&cl)
158161
instance.Status.ObservedGeneration = instance.Generation
@@ -172,13 +175,14 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
172175

173176
instance.Status.AvailableVersion = &envAvailableVersion
174177
defaults := openstack.InitializeOpenStackVersionImageDefaults(ctx, envContainerImages)
175-
// store the defaults for the currently available version
176178
if instance.Status.ContainerImageVersionDefaults == nil {
177179
instance.Status.ContainerImageVersionDefaults = make(map[string]*corev1beta1.ContainerDefaults)
178180
}
181+
// store the defaults for the currently available version
179182
instance.Status.ContainerImageVersionDefaults[envAvailableVersion] = defaults
180183

181184
// calculate the container images for the target version
185+
Log.Info("Target version: ", "targetVersion", instance.Spec.TargetVersion)
182186
val, ok := instance.Status.ContainerImageVersionDefaults[instance.Spec.TargetVersion]
183187
if !ok {
184188
Log.Info("Target version not found in defaults", "targetVersion", instance.Spec.TargetVersion)
@@ -198,25 +202,30 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
198202
Name: instance.Name,
199203
}, controlPlane)
200204
if err != nil {
201-
// we ignore not found
202205
if k8s_errors.IsNotFound(err) {
203-
Log.Info("No controlplane found.")
206+
Log.Info("Controlplane not found:", "instance name", instance.Name)
204207
return ctrl.Result{}, nil
205208
}
206209
return ctrl.Result{}, err
207210
}
208211

209-
// greenfield deployment //FIXME check dataplane here too
210-
if controlPlane.Status.DeployedVersion == nil {
211-
Log.Info("No controlplane or controlplane is not deployed")
212-
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
213217
}
214218

215-
// 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+
}
216224

217-
// minor update for OVN Controlplane in progress
225+
// minor update in progress
218226
if instance.Status.DeployedVersion != nil && instance.Spec.TargetVersion != *instance.Status.DeployedVersion {
219-
if !openstack.OVNControllerImageCheck(controlPlane, instance) ||
227+
228+
if !openstack.OVNControllerImageMatch(controlPlane, instance) ||
220229
!controlPlane.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneOVNReadyCondition) {
221230
instance.Status.Conditions.Set(condition.FalseCondition(
222231
corev1beta1.OpenStackVersionMinorUpdateOVNControlplane,
@@ -230,8 +239,22 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
230239
corev1beta1.OpenStackVersionMinorUpdateOVNControlplane,
231240
corev1beta1.OpenStackVersionMinorUpdateReadyMessage)
232241

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+
233256
// minor update for Controlplane in progress
234-
if !openstack.ControlplaneContainerImageCheck(controlPlane, instance) ||
257+
if !openstack.ControlplaneContainerImageMatch(controlPlane, instance) ||
235258
!controlPlane.IsReady() {
236259
instance.Status.Conditions.Set(condition.FalseCondition(
237260
corev1beta1.OpenStackVersionMinorUpdateControlplane,
@@ -241,11 +264,23 @@ func (r *OpenStackVersionReconciler) Reconcile(ctx context.Context, req ctrl.Req
241264
Log.Info("Minor update for Controlplane in progress")
242265
return ctrl.Result{}, nil
243266
}
244-
// TODO minor update for Dataplane in progress goes here
245-
246267
instance.Status.Conditions.MarkTrue(
247268
corev1beta1.OpenStackVersionMinorUpdateControlplane,
248269
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)
249284
}
250285

251286
if controlPlane.IsReady() {
@@ -289,6 +324,7 @@ func (r *OpenStackVersionReconciler) SetupWithManager(mgr ctrl.Manager) error {
289324

290325
return ctrl.NewControllerManagedBy(mgr).
291326
Watches(&corev1beta1.OpenStackControlPlane{}, versionFunc).
327+
Watches(&dataplanev1.OpenStackDataPlaneNodeSet{}, versionFunc).
292328
For(&corev1beta1.OpenStackVersion{}).
293329
Complete(r)
294330
}

pkg/openstack/barbican.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,13 @@ func ReconcileBarbican(ctx context.Context, instance *corev1beta1.OpenStackContr
159159
return ctrl.Result{}, nil
160160
}
161161

162-
// BarbicanImageCheck - return true if the Barbican images match on the ControlPlane and Version, or if Barbican is not enabled
163-
func BarbicanImageCheck(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
162+
// BarbicanImageMatch - return true if the Barbican images match on the ControlPlane and Version, or if Barbican is not enabled
163+
func BarbicanImageMatch(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
164164

165165
if controlPlane.Spec.Barbican.Enabled {
166-
if !compareStringPointers(controlPlane.Status.ContainerImages.BarbicanAPIImage, version.Status.ContainerImages.BarbicanAPIImage) ||
167-
!compareStringPointers(controlPlane.Status.ContainerImages.BarbicanWorkerImage, version.Status.ContainerImages.BarbicanWorkerImage) ||
168-
!compareStringPointers(controlPlane.Status.ContainerImages.BarbicanKeystoneListenerImage, version.Status.ContainerImages.BarbicanKeystoneListenerImage) {
166+
if !stringPointersEqual(controlPlane.Status.ContainerImages.BarbicanAPIImage, version.Status.ContainerImages.BarbicanAPIImage) ||
167+
!stringPointersEqual(controlPlane.Status.ContainerImages.BarbicanWorkerImage, version.Status.ContainerImages.BarbicanWorkerImage) ||
168+
!stringPointersEqual(controlPlane.Status.ContainerImages.BarbicanKeystoneListenerImage, version.Status.ContainerImages.BarbicanKeystoneListenerImage) {
169169
return false
170170
}
171171
}

pkg/openstack/cinder.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,17 @@ func ReconcileCinder(ctx context.Context, instance *corev1beta1.OpenStackControl
188188

189189
}
190190

191-
// CinderImageCheck - return true if the Cinder images match on the ControlPlane and Version, or if Cinder is not enabled
192-
func CinderImageCheck(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
191+
// CinderImageMatch - return true if the Cinder images match on the ControlPlane and Version, or if Cinder is not enabled
192+
func CinderImageMatch(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
193193

194194
if controlPlane.Spec.Cinder.Enabled {
195-
if !compareStringPointers(controlPlane.Status.ContainerImages.CinderAPIImage, version.Status.ContainerImages.CinderAPIImage) ||
196-
!compareStringPointers(controlPlane.Status.ContainerImages.CinderSchedulerImage, version.Status.ContainerImages.CinderSchedulerImage) ||
197-
!compareStringPointers(controlPlane.Status.ContainerImages.CinderBackupImage, version.Status.ContainerImages.CinderBackupImage) {
195+
if !stringPointersEqual(controlPlane.Status.ContainerImages.CinderAPIImage, version.Status.ContainerImages.CinderAPIImage) ||
196+
!stringPointersEqual(controlPlane.Status.ContainerImages.CinderSchedulerImage, version.Status.ContainerImages.CinderSchedulerImage) ||
197+
!stringPointersEqual(controlPlane.Status.ContainerImages.CinderBackupImage, version.Status.ContainerImages.CinderBackupImage) {
198198
return false
199199
}
200200
for name, img := range version.Status.ContainerImages.CinderVolumeImages {
201-
if !compareStringPointers(controlPlane.Status.ContainerImages.CinderVolumeImages[name], img) {
201+
if !stringPointersEqual(controlPlane.Status.ContainerImages.CinderVolumeImages[name], img) {
202202
return false
203203
}
204204
}

pkg/openstack/dataplane.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package openstack
2+
3+
import (
4+
"context"
5+
6+
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
7+
corev1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1"
8+
9+
dataplanev1 "github.com/openstack-k8s-operators/dataplane-operator/api/v1beta1"
10+
"sigs.k8s.io/controller-runtime/pkg/client"
11+
)
12+
13+
// GetDataplaneNodesets - returns the dataplanenodesets in the namespace of the controlplane
14+
func GetDataplaneNodesets(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, helper *helper.Helper) (*dataplanev1.OpenStackDataPlaneNodeSetList, error) {
15+
// Get the dataplane nodesets
16+
dataplaneNodesets := &dataplanev1.OpenStackDataPlaneNodeSetList{}
17+
opts := []client.ListOption{
18+
client.InNamespace(instance.Namespace),
19+
}
20+
err := helper.GetClient().List(ctx, dataplaneNodesets, opts...)
21+
if err != nil {
22+
return nil, err
23+
}
24+
return dataplaneNodesets, nil
25+
}
26+
27+
func DataplaneNodesetsDeployedVersionIsSet(dataplaneNodesets *dataplanev1.OpenStackDataPlaneNodeSetList) bool {
28+
for _, nodeset := range dataplaneNodesets.Items {
29+
// FIXME: DeployedVersion on the DataplaneNodeset should be a string pointer to match how Controlplane implements this
30+
if nodeset.Status.DeployedVersion == "" {
31+
return false
32+
}
33+
}
34+
return true
35+
}
36+
37+
// DataplaneNodesetsOVNControllerImagesMatch returns true if OVNControllers are deployed on all nodesets
38+
func DataplaneNodesetsOVNControllerImagesMatch(version *corev1beta1.OpenStackVersion, dataplaneNodesets *dataplanev1.OpenStackDataPlaneNodeSetList) bool {
39+
for _, nodeset := range dataplaneNodesets.Items {
40+
if nodeset.Generation != nodeset.Status.ObservedGeneration {
41+
return false
42+
}
43+
// we only check nodesets if they deploy OVN
44+
if nodeset.Status.ContainerImages["OvnControllerImage"] != "" {
45+
if !nodeset.IsReady() {
46+
return false
47+
}
48+
if nodeset.Status.ContainerImages["OvnControllerImage"] != *version.Status.ContainerImages.OvnControllerImage {
49+
return false
50+
}
51+
}
52+
}
53+
return true
54+
}
55+
56+
// DataplaneNodesetsDeployed returns true if all nodesets are deployed with the latest version
57+
func DataplaneNodesetsDeployed(version *corev1beta1.OpenStackVersion, dataplaneNodesets *dataplanev1.OpenStackDataPlaneNodeSetList) bool {
58+
for _, nodeset := range dataplaneNodesets.Items {
59+
if nodeset.Generation != nodeset.Status.ObservedGeneration {
60+
return false
61+
}
62+
if !nodeset.IsReady() {
63+
return false
64+
}
65+
if nodeset.Status.DeployedVersion != version.Spec.TargetVersion {
66+
return false
67+
}
68+
69+
}
70+
return true
71+
}

pkg/openstack/designate.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,17 +177,17 @@ func ReconcileDesignate(ctx context.Context, instance *corev1beta1.OpenStackCont
177177

178178
}
179179

180-
// DesignateImageCheck - return true if the Designate images match on the ControlPlane and Version, or if Designate is not enabled
181-
func DesignateImageCheck(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
180+
// DesignateImageMatch - return true if the Designate images match on the ControlPlane and Version, or if Designate is not enabled
181+
func DesignateImageMatch(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
182182

183183
if controlPlane.Spec.Designate.Enabled {
184-
if !compareStringPointers(controlPlane.Status.ContainerImages.DesignateAPIImage, version.Status.ContainerImages.DesignateAPIImage) ||
185-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateCentralImage, version.Status.ContainerImages.DesignateCentralImage) ||
186-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateMdnsImage, version.Status.ContainerImages.DesignateMdnsImage) ||
187-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateProducerImage, version.Status.ContainerImages.DesignateProducerImage) ||
188-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateWorkerImage, version.Status.ContainerImages.DesignateWorkerImage) ||
189-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateBackendbind9Image, version.Status.ContainerImages.DesignateBackendbind9Image) ||
190-
!compareStringPointers(controlPlane.Status.ContainerImages.DesignateUnboundImage, version.Status.ContainerImages.DesignateUnboundImage) {
184+
if !stringPointersEqual(controlPlane.Status.ContainerImages.DesignateAPIImage, version.Status.ContainerImages.DesignateAPIImage) ||
185+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateCentralImage, version.Status.ContainerImages.DesignateCentralImage) ||
186+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateMdnsImage, version.Status.ContainerImages.DesignateMdnsImage) ||
187+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateProducerImage, version.Status.ContainerImages.DesignateProducerImage) ||
188+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateWorkerImage, version.Status.ContainerImages.DesignateWorkerImage) ||
189+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateBackendbind9Image, version.Status.ContainerImages.DesignateBackendbind9Image) ||
190+
!stringPointersEqual(controlPlane.Status.ContainerImages.DesignateUnboundImage, version.Status.ContainerImages.DesignateUnboundImage) {
191191
return false
192192
}
193193
}

pkg/openstack/dnsmasq.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ func ReconcileDNSMasqs(ctx context.Context, instance *corev1beta1.OpenStackContr
7878

7979
}
8080

81-
// DnsmasqImageCheck - return true if the Dnsmasq images match on the ControlPlane and Version, or if Dnsmasq is not enabled
82-
func DnsmasqImageCheck(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
81+
// DnsmasqImageMatch - return true if the Dnsmasq images match on the ControlPlane and Version, or if Dnsmasq is not enabled
82+
func DnsmasqImageMatch(controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
8383

8484
if controlPlane.Spec.DNS.Enabled {
85-
if !compareStringPointers(controlPlane.Status.ContainerImages.InfraDnsmasqImage, version.Status.ContainerImages.InfraDnsmasqImage) {
85+
if !stringPointersEqual(controlPlane.Status.ContainerImages.InfraDnsmasqImage, version.Status.ContainerImages.InfraDnsmasqImage) {
8686
return false
8787
}
8888
}

0 commit comments

Comments
 (0)