Skip to content

Commit bbabcf9

Browse files
stuggiclaude
andcommitted
Only init conditions for enabled services in InitConditions
Previously, InitConditions() added Unknown conditions for ALL services regardless of whether they were enabled. When the controller short- circuited before reaching a disabled service's reconciler (e.g., during minor update gating), the disabled service's Unknown condition persisted and was mirrored to the Ready condition, producing misleading status like "Octavia not started" even when Octavia was disabled. Only create conditions for services that are actually enabled. Always-on conditions (CAs, Version, Infrastructure, BackupConfig, Client, Ready) remain unconditional. The service reconcilers still handle the enabled-to-disabled transition by removing their conditions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Martin Schuppert <mschuppert@redhat.com>
1 parent cc57649 commit bbabcf9

2 files changed

Lines changed: 76 additions & 51 deletions

File tree

api/core/v1beta1/openstackcontrolplane_types.go

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,43 +1168,92 @@ func (instance *OpenStackControlPlane) InitConditions() {
11681168
if instance.Status.Conditions == nil {
11691169
instance.Status.Conditions = condition.Conditions{}
11701170
}
1171+
1172+
// Always-on conditions (no Enabled flag)
11711173
cl := condition.CreateList(
1172-
condition.UnknownCondition(OpenStackControlPlaneRabbitMQReadyCondition, condition.InitReason, OpenStackControlPlaneRabbitMQReadyInitMessage),
1173-
condition.UnknownCondition(OpenStackControlPlaneOVNReadyCondition, condition.InitReason, OpenStackControlPlaneOVNReadyInitMessage),
1174-
condition.UnknownCondition(OpenStackControlPlaneNeutronReadyCondition, condition.InitReason, OpenStackControlPlaneNeutronReadyInitMessage),
1175-
condition.UnknownCondition(OpenStackControlPlaneMariaDBReadyCondition, condition.InitReason, OpenStackControlPlaneMariaDBReadyInitMessage),
1176-
condition.UnknownCondition(OpenStackControlPlaneMemcachedReadyCondition, condition.InitReason, OpenStackControlPlaneMemcachedReadyInitMessage),
1177-
condition.UnknownCondition(OpenStackControlPlaneKeystoneAPIReadyCondition, condition.InitReason, OpenStackControlPlaneKeystoneAPIReadyInitMessage),
1178-
condition.UnknownCondition(OpenStackControlPlanePlacementAPIReadyCondition, condition.InitReason, OpenStackControlPlanePlacementAPIReadyInitMessage),
1179-
condition.UnknownCondition(OpenStackControlPlaneGlanceReadyCondition, condition.InitReason, OpenStackControlPlaneGlanceReadyInitMessage),
1180-
condition.UnknownCondition(OpenStackControlPlaneCinderReadyCondition, condition.InitReason, OpenStackControlPlaneCinderReadyInitMessage),
1181-
condition.UnknownCondition(OpenStackControlPlaneNovaReadyCondition, condition.InitReason, OpenStackControlPlaneNovaReadyInitMessage),
1182-
condition.UnknownCondition(OpenStackControlPlaneIronicReadyCondition, condition.InitReason, OpenStackControlPlaneIronicReadyInitMessage),
1183-
condition.UnknownCondition(OpenStackControlPlaneClientReadyCondition, condition.InitReason, OpenStackControlPlaneClientReadyInitMessage),
1184-
condition.UnknownCondition(OpenStackControlPlaneManilaReadyCondition, condition.InitReason, OpenStackControlPlaneManilaReadyInitMessage),
1185-
condition.UnknownCondition(OpenStackControlPlaneHorizonReadyCondition, condition.InitReason, OpenStackControlPlaneHorizonReadyInitMessage),
1186-
condition.UnknownCondition(OpenStackControlPlaneDNSReadyCondition, condition.InitReason, OpenStackControlPlaneDNSReadyInitMessage),
1187-
condition.UnknownCondition(OpenStackControlPlaneTelemetryReadyCondition, condition.InitReason, OpenStackControlPlaneTelemetryReadyInitMessage),
1188-
condition.UnknownCondition(OpenStackControlPlaneHeatReadyCondition, condition.InitReason, OpenStackControlPlaneHeatReadyInitMessage),
1189-
condition.UnknownCondition(OpenStackControlPlaneSwiftReadyCondition, condition.InitReason, OpenStackControlPlaneSwiftReadyInitMessage),
1190-
condition.UnknownCondition(OpenStackControlPlaneOctaviaReadyCondition, condition.InitReason, OpenStackControlPlaneOctaviaReadyInitMessage),
1191-
condition.UnknownCondition(OpenStackControlPlaneDesignateReadyCondition, condition.InitReason, OpenStackControlPlaneDesignateReadyInitMessage),
1192-
condition.UnknownCondition(OpenStackControlPlaneBarbicanReadyCondition, condition.InitReason, OpenStackControlPlaneBarbicanReadyInitMessage),
1193-
condition.UnknownCondition(OpenStackControlPlaneRedisReadyCondition, condition.InitReason, OpenStackControlPlaneRedisReadyInitMessage),
11941174
condition.UnknownCondition(OpenStackControlPlaneCAReadyCondition, condition.InitReason, OpenStackControlPlaneCAReadyInitMessage),
11951175
condition.UnknownCondition(OpenStackControlPlaneOpenStackVersionInitializationReadyCondition, condition.InitReason, OpenStackControlPlaneOpenStackVersionInitializationReadyInitMessage),
1196-
condition.UnknownCondition(OpenStackControlPlaneWatcherReadyCondition, condition.InitReason, OpenStackControlPlaneWatcherReadyInitMessage),
11971176
condition.UnknownCondition(OpenStackControlPlaneInfrastructureReadyCondition, condition.InitReason, OpenStackControlPlaneInfrastructureReadyInitMessage),
11981177
condition.UnknownCondition(OpenStackControlPlaneBackupConfigReadyCondition, condition.InitReason, OpenStackControlPlaneBackupConfigReadyInitMessage),
1199-
1200-
// Also add the overall status condition as Unknown
1178+
condition.UnknownCondition(OpenStackControlPlaneClientReadyCondition, condition.InitReason, OpenStackControlPlaneClientReadyInitMessage),
12011179
condition.UnknownCondition(condition.ReadyCondition, condition.InitReason, condition.ReadyInitMessage),
12021180
)
1181+
1182+
// Only init conditions for enabled services to avoid misleading status
1183+
// when the controller doesn't reach a disabled service's reconciler
1184+
// (e.g., during minor update gating).
1185+
if instance.Spec.Rabbitmq.Enabled {
1186+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneRabbitMQReadyCondition, condition.InitReason, OpenStackControlPlaneRabbitMQReadyInitMessage))
1187+
}
1188+
if instance.Spec.Ovn.Enabled {
1189+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneOVNReadyCondition, condition.InitReason, OpenStackControlPlaneOVNReadyInitMessage))
1190+
}
1191+
if instance.Spec.Neutron.Enabled {
1192+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneNeutronReadyCondition, condition.InitReason, OpenStackControlPlaneNeutronReadyInitMessage))
1193+
}
1194+
if instance.Spec.Galera.Enabled {
1195+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneMariaDBReadyCondition, condition.InitReason, OpenStackControlPlaneMariaDBReadyInitMessage))
1196+
}
1197+
if instance.Spec.Memcached.Enabled {
1198+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneMemcachedReadyCondition, condition.InitReason, OpenStackControlPlaneMemcachedReadyInitMessage))
1199+
}
1200+
if instance.Spec.Keystone.Enabled {
1201+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneKeystoneAPIReadyCondition, condition.InitReason, OpenStackControlPlaneKeystoneAPIReadyInitMessage))
1202+
}
1203+
if instance.Spec.Placement.Enabled {
1204+
cl.Set(condition.UnknownCondition(OpenStackControlPlanePlacementAPIReadyCondition, condition.InitReason, OpenStackControlPlanePlacementAPIReadyInitMessage))
1205+
}
1206+
if instance.Spec.Glance.Enabled {
1207+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneGlanceReadyCondition, condition.InitReason, OpenStackControlPlaneGlanceReadyInitMessage))
1208+
}
1209+
if instance.Spec.Cinder.Enabled {
1210+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneCinderReadyCondition, condition.InitReason, OpenStackControlPlaneCinderReadyInitMessage))
1211+
}
1212+
if instance.Spec.Nova.Enabled {
1213+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneNovaReadyCondition, condition.InitReason, OpenStackControlPlaneNovaReadyInitMessage))
1214+
}
1215+
if instance.Spec.Ironic.Enabled {
1216+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneIronicReadyCondition, condition.InitReason, OpenStackControlPlaneIronicReadyInitMessage))
1217+
}
1218+
if instance.Spec.Manila.Enabled {
1219+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneManilaReadyCondition, condition.InitReason, OpenStackControlPlaneManilaReadyInitMessage))
1220+
}
1221+
if instance.Spec.Horizon.Enabled {
1222+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneHorizonReadyCondition, condition.InitReason, OpenStackControlPlaneHorizonReadyInitMessage))
1223+
}
1224+
if instance.Spec.DNS.Enabled {
1225+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneDNSReadyCondition, condition.InitReason, OpenStackControlPlaneDNSReadyInitMessage))
1226+
}
1227+
if instance.Spec.Telemetry.Enabled {
1228+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneTelemetryReadyCondition, condition.InitReason, OpenStackControlPlaneTelemetryReadyInitMessage))
1229+
}
1230+
if instance.Spec.Heat.Enabled {
1231+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneHeatReadyCondition, condition.InitReason, OpenStackControlPlaneHeatReadyInitMessage))
1232+
}
1233+
if instance.Spec.Swift.Enabled {
1234+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneSwiftReadyCondition, condition.InitReason, OpenStackControlPlaneSwiftReadyInitMessage))
1235+
}
1236+
if instance.Spec.Octavia.Enabled {
1237+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneOctaviaReadyCondition, condition.InitReason, OpenStackControlPlaneOctaviaReadyInitMessage))
1238+
}
1239+
if instance.Spec.Designate.Enabled {
1240+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneDesignateReadyCondition, condition.InitReason, OpenStackControlPlaneDesignateReadyInitMessage))
1241+
}
1242+
if instance.Spec.Barbican.Enabled {
1243+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneBarbicanReadyCondition, condition.InitReason, OpenStackControlPlaneBarbicanReadyInitMessage))
1244+
}
1245+
if instance.Spec.Redis.Enabled {
1246+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneRedisReadyCondition, condition.InitReason, OpenStackControlPlaneRedisReadyInitMessage))
1247+
}
1248+
if instance.Spec.Watcher.Enabled {
1249+
cl.Set(condition.UnknownCondition(OpenStackControlPlaneWatcherReadyCondition, condition.InitReason, OpenStackControlPlaneWatcherReadyInitMessage))
1250+
}
1251+
12031252
// Init Topology condition if there's a reference
12041253
if instance.Spec.TopologyRef != nil {
1205-
c := condition.UnknownCondition(condition.TopologyReadyCondition, condition.InitReason, condition.TopologyReadyInitMessage)
1206-
cl.Set(c)
1254+
cl.Set(condition.UnknownCondition(condition.TopologyReadyCondition, condition.InitReason, condition.TopologyReadyInitMessage))
12071255
}
1256+
12081257
// initialize conditions used later as Status=Unknown
12091258
instance.Status.Conditions.Init(&cl)
12101259
}

test/kuttl/tests/ctlplane-staged-deployment/01-assert-infrastructure-ready-paused.yaml

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,16 @@ status:
3434
- reason: Init
3535
status: Unknown
3636
type: OpenStackControlPlaneClientReady
37-
- reason: Init
38-
status: Unknown
39-
type: OpenStackControlPlaneDesignateReady
4037
- reason: Init
4138
status: Unknown
4239
type: OpenStackControlPlaneGlanceReady
43-
- reason: Init
44-
status: Unknown
45-
type: OpenStackControlPlaneHeatReady
46-
- reason: Init
47-
status: Unknown
48-
type: OpenStackControlPlaneHorizonReady
4940
- message: OpenStackControlPlane Infrastructure ready - deployment paused. Remove annotation to resume reconcile of OpenStack services
5041
reason: Ready
5142
status: "True"
5243
type: OpenStackControlPlaneInfrastructureReady
53-
- reason: Init
54-
status: Unknown
55-
type: OpenStackControlPlaneIronicReady
5644
- reason: Init
5745
status: Unknown
5846
type: OpenStackControlPlaneKeystoneAPIReady
59-
- reason: Init
60-
status: Unknown
61-
type: OpenStackControlPlaneManilaReady
6247
- message: OpenStackControlPlane MariaDB completed
6348
reason: Ready
6449
status: "True"
@@ -77,9 +62,6 @@ status:
7762
reason: Ready
7863
status: "True"
7964
type: OpenStackControlPlaneOVNReady
80-
- reason: Init
81-
status: Unknown
82-
type: OpenStackControlPlaneOctaviaReady
8365
- message: OpenStackControlPlane OpenStackVersion initialized
8466
reason: Ready
8567
status: "True"
@@ -91,15 +73,9 @@ status:
9173
reason: Ready
9274
status: "True"
9375
type: OpenStackControlPlaneRabbitMQReady
94-
- reason: Init
95-
status: Unknown
96-
type: OpenStackControlPlaneRedisReady
9776
- reason: Init
9877
status: Unknown
9978
type: OpenStackControlPlaneSwiftReady
10079
- reason: Init
10180
status: Unknown
10281
type: OpenStackControlPlaneTelemetryReady
103-
- reason: Init
104-
status: Unknown
105-
type: OpenStackControlPlaneWatcherReady

0 commit comments

Comments
 (0)