Skip to content

Commit 288f058

Browse files
stuggiclaude
andcommitted
Add staged deployment support for control plane restore
Add support for pausing OpenStackControlPlane deployment after infrastructure creation to enable database restore before OpenStack services start. This is useful for backup/restore scenarios where databases need to be restored to empty infrastructure before services initialize fresh schemas. **conditions.go:** - Add OpenStackControlPlaneInfrastructureReadyCondition type - Add condition messages (Init, Ready, Running, Error, Waiting, Paused) - Add OpenStackControlPlaneInfrastructureReadyWaitingMessage to show blocking components - Add OpenStackControlPlaneInfrastructureReadyPausedMessage for infrastructure-only mode - Infrastructure includes: CAs, DNSMasq, RabbitMQ, Galera, Memcached, OVN **openstackcontrolplane_types.go:** - Add DeploymentStageAnnotation constant ("core.openstack.org/deployment-stage") - Add DeploymentStageInfrastructureOnly constant ("infrastructure-only") - Add InfrastructureReady condition to InitConditions() **Enhanced infrastructure status reporting:** - isInfrastructureReady(): Returns ready status AND list of not-ready components - Always checks: CAs (no enabled flag) - Conditionally checks: DNS, RabbitMQ, Galera, Memcached, OVN (only if enabled) - Returns which components are blocking when infrastructure not ready - Fixes test failures when OVN or other components are disabled - InfrastructureReady condition shows detailed waiting message: - "Infrastructure in progress - waiting for: RabbitMQs, Galeras" - Makes debugging deployment issues much easier **Ready condition handling in infrastructure-only mode:** - Defer block now checks for infrastructure-only mode - When infrastructure-only AND infrastructure ready: - Mirror InfrastructureReady pause message to Ready condition (as False) - Prevents service conditions (Unknown/Init) from leaking into Ready - When infrastructure not ready OR normal mode: - Use default mirror behavior (first not-ready condition) - Result: Ready condition shows appropriate message at each stage **Staged deployment logic:** - Move OVN reconciliation to infrastructure section (before services) - Check deployment-stage annotation after infrastructure reconciliation - When annotation = "infrastructure-only": - Set InfrastructureReady condition with pause message - Set Ready condition to False with pause message (via defer block) - Return early (skip service reconciliation) - Message: "Infrastructure ready - deployment paused. Remove annotation to resume deployment of OpenStack services" - When annotation not set (normal deployment): - Set InfrastructureReady condition with standard message - Continue with full service reconciliation - Message: "Infrastructure ready" - When infrastructure still deploying: - Set InfrastructureReady = False/Requested - Message: "Infrastructure in progress - waiting for: <components>" **Kuttl test for staged deployment:** - New test: test/kuttl/tests/ctlplane-staged-deployment/ - Validates full workflow: 1. Deploy with infrastructure-only annotation 2. Assert infrastructure ready, services Unknown, Ready shows pause message 3. Remove annotation 4. Assert full controlplane reaches Ready - Tests the pause/resume cycle for backup/restore scenarios Update all kuttl test assertions to expect InfrastructureReady condition: - common/assert-sample-deployment.yaml - ctlplane-basic-deployment/03-assert-deploy-custom-cacert.yaml - ctlplane-collapsed/01-assert-collapsed-cell.yaml - ctlplane-galera-3replicas/01-assert-galera-3replicas.yaml - ctlplane-tls-cert-rotation/00-assert-deploy-openstack.yaml - ctlplane-tls-cert-rotation/03-assert-new-certs.yaml - ctlplane-tls-custom-issuers/01-assert-deploy-openstack.yaml - ctlplane-tls-custom-issuers/09-assert-deploy-openstack.yaml - ctlplane-tls-custom-route/03-assert-deploy-openstack.yaml This allows a workflow like this, which can be used for backup/restore: 1. Apply OpenStackControlPlane CR with annotation: core.openstack.org/deployment-stage: infrastructure-only 2. Wait for InfrastructureReady condition: oc wait --for=condition=InfrastructureReady openstackcontrolplane/openstack 3. Restore databases (MariaDB, OVN) to empty infrastructure 4. Restore RabbitMQ user credentials for EDPM compatibility 5. Remove annotation to resume deployment: oc annotate openstackcontrolplane openstack core.openstack.org/deployment-stage- 6. Services start with already-restored databases Jira: OSPRH-25752 Co-Authored-By: Claude Sonnet 4.5 <[email protected]> Signed-off-by: Martin Schuppert <[email protected]>
1 parent 5258795 commit 288f058

18 files changed

+310
-8
lines changed

api/core/v1beta1/conditions.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ const (
161161

162162
// OpenStackControlPlaneExposeWatcherReadyCondition Status=True condition which indicates if Watcher is exposed via a route
163163
OpenStackControlPlaneExposeWatcherReadyCondition condition.Type = "OpenStackControlPlaneExposeWatcherReady"
164+
165+
// OpenStackControlPlaneInfrastructureReadyCondition Status=True condition which indicates if infrastructure components are ready
166+
// Infrastructure includes: CAs, DNSMasq, RabbitMQ, Galera (MariaDB), Memcached, and OVN databases
167+
// This condition is set to True when deployment-stage annotation is "infrastructure-only" and all infrastructure is ready
168+
OpenStackControlPlaneInfrastructureReadyCondition condition.Type = "InfrastructureReady"
164169
)
165170

166171
// Common Messages used by API objects.
@@ -507,6 +512,24 @@ const (
507512

508513
// OpenStackControlPlaneWatcherReadyErrorMessage
509514
OpenStackControlPlaneWatcherReadyErrorMessage = "OpenStackControlPlane Watcher error occured %s"
515+
516+
// OpenStackControlPlaneInfrastructureReadyInitMessage
517+
OpenStackControlPlaneInfrastructureReadyInitMessage = "OpenStackControlPlane Infrastructure not started"
518+
519+
// OpenStackControlPlaneInfrastructureReadyMessage
520+
OpenStackControlPlaneInfrastructureReadyMessage = "OpenStackControlPlane Infrastructure ready"
521+
522+
// OpenStackControlPlaneInfrastructureReadyRunningMessage
523+
OpenStackControlPlaneInfrastructureReadyRunningMessage = "OpenStackControlPlane Infrastructure in progress"
524+
525+
// OpenStackControlPlaneInfrastructureReadyWaitingMessage
526+
OpenStackControlPlaneInfrastructureReadyWaitingMessage = "OpenStackControlPlane Infrastructure in progress - waiting for: %s"
527+
528+
// OpenStackControlPlaneInfrastructureReadyPausedMessage
529+
OpenStackControlPlaneInfrastructureReadyPausedMessage = "OpenStackControlPlane Infrastructure ready - deployment paused. Remove annotation to resume deployment of OpenStack services"
530+
531+
// OpenStackControlPlaneInfrastructureReadyErrorMessage
532+
OpenStackControlPlaneInfrastructureReadyErrorMessage = "OpenStackControlPlane Infrastructure error occured %s"
510533
)
511534

512535
// Version Conditions used by to drive minor updates

api/core/v1beta1/openstackcontrolplane_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ const (
6666
GlanceName = "glance"
6767
// CinderName - Default Cinder name
6868
CinderName = "cinder"
69+
70+
// DeploymentStageAnnotation - Annotation key for controlling deployment stages
71+
DeploymentStageAnnotation = "core.openstack.org/deployment-stage"
72+
// DeploymentStageInfrastructureOnly - Annotation value to pause after infrastructure deployment
73+
DeploymentStageInfrastructureOnly = "infrastructure-only"
6974
)
7075

7176
// OpenStackControlPlaneSpec defines the desired state of OpenStackControlPlane
@@ -951,6 +956,7 @@ func (instance *OpenStackControlPlane) InitConditions() {
951956
condition.UnknownCondition(OpenStackControlPlaneCAReadyCondition, condition.InitReason, OpenStackControlPlaneCAReadyInitMessage),
952957
condition.UnknownCondition(OpenStackControlPlaneOpenStackVersionInitializationReadyCondition, condition.InitReason, OpenStackControlPlaneOpenStackVersionInitializationReadyInitMessage),
953958
condition.UnknownCondition(OpenStackControlPlaneWatcherReadyCondition, condition.InitReason, OpenStackControlPlaneWatcherReadyInitMessage),
959+
condition.UnknownCondition(OpenStackControlPlaneInfrastructureReadyCondition, condition.InitReason, OpenStackControlPlaneInfrastructureReadyInitMessage),
954960

955961
// Also add the overall status condition as Unknown
956962
condition.UnknownCondition(condition.ReadyCondition, condition.InitReason, condition.ReadyInitMessage),

internal/controller/core/openstackcontrolplane_controller.go

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package core
2020
import (
2121
"context"
2222
"fmt"
23+
"strings"
2324

2425
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
2526
routev1 "github.com/openshift/api/route/v1"
@@ -186,9 +187,23 @@ func (r *OpenStackControlPlaneReconciler) Reconcile(ctx context.Context, req ctr
186187
// something is not ready so reset the Ready condition
187188
instance.Status.Conditions.MarkUnknown(
188189
condition.ReadyCondition, condition.InitReason, condition.ReadyInitMessage)
189-
// and recalculate it based on the state of the rest of the conditions
190-
instance.Status.Conditions.Set(
191-
instance.Status.Conditions.Mirror(condition.ReadyCondition))
190+
191+
// In infrastructure-only mode with infrastructure ready, set Ready to False with pause message
192+
// This prevents service conditions (which are still Unknown/Init) from being mirrored to Ready
193+
if stage, ok := instance.Annotations[corev1beta1.DeploymentStageAnnotation]; ok &&
194+
stage == corev1beta1.DeploymentStageInfrastructureOnly &&
195+
instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneInfrastructureReadyCondition) {
196+
// Set Ready to False with the infrastructure pause message
197+
instance.Status.Conditions.Set(condition.FalseCondition(
198+
condition.ReadyCondition,
199+
condition.RequestedReason,
200+
condition.SeverityInfo,
201+
corev1beta1.OpenStackControlPlaneInfrastructureReadyPausedMessage))
202+
} else {
203+
// Normal mode or infrastructure not ready yet: use default mirror behavior
204+
instance.Status.Conditions.Set(
205+
instance.Status.Conditions.Mirror(condition.ReadyCondition))
206+
}
192207
}
193208

194209
condition.RestoreLastTransitionTimes(&instance.Status.Conditions, savedConditions)
@@ -386,6 +401,36 @@ func (r *OpenStackControlPlaneReconciler) reconcileOVNControllers(ctx context.Co
386401
return ctrl.Result{}, nil
387402
}
388403

404+
// isInfrastructureReady checks if all enabled infrastructure components are ready
405+
// Returns true if ready, and a list of components that are not ready (empty if all ready)
406+
func isInfrastructureReady(instance *corev1beta1.OpenStackControlPlane) (bool, []string) {
407+
notReady := []string{}
408+
409+
// CAs are always deployed (no enabled flag)
410+
if !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneCAReadyCondition) {
411+
notReady = append(notReady, "CAs")
412+
}
413+
414+
// Only check each infrastructure component if it's enabled
415+
if instance.Spec.DNS.Enabled && !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneDNSReadyCondition) {
416+
notReady = append(notReady, "DNS")
417+
}
418+
if instance.Spec.Rabbitmq.Enabled && !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneRabbitMQReadyCondition) {
419+
notReady = append(notReady, "RabbitMQs")
420+
}
421+
if instance.Spec.Galera.Enabled && !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneMariaDBReadyCondition) {
422+
notReady = append(notReady, "Galeras")
423+
}
424+
if instance.Spec.Memcached.Enabled && !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneMemcachedReadyCondition) {
425+
notReady = append(notReady, "Memcached")
426+
}
427+
if instance.Spec.Ovn.Enabled && !instance.Status.Conditions.IsTrue(corev1beta1.OpenStackControlPlaneOVNReadyCondition) {
428+
notReady = append(notReady, "OVN")
429+
}
430+
431+
return len(notReady) == 0, notReady
432+
}
433+
389434
func (r *OpenStackControlPlaneReconciler) reconcileNormal(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *common_helper.Helper) (ctrl.Result, error) {
390435
if instance.Spec.TopologyRef != nil {
391436
if err := r.checkTopologyRef(ctx, helper,
@@ -402,6 +447,11 @@ func (r *OpenStackControlPlaneReconciler) reconcileNormal(ctx context.Context, i
402447
instance.Status.Conditions.MarkTrue(condition.TopologyReadyCondition, condition.TopologyReadyMessage)
403448
}
404449

450+
// Check for deployment-stage annotation
451+
deploymentStage := instance.Annotations[corev1beta1.DeploymentStageAnnotation]
452+
infrastructureOnly := deploymentStage == corev1beta1.DeploymentStageInfrastructureOnly
453+
454+
// Reconcile infrastructure components (always run)
405455
ctrlResult, err := openstack.ReconcileCAs(ctx, instance, helper)
406456
if err != nil {
407457
return ctrl.Result{}, err
@@ -437,41 +487,87 @@ func (r *OpenStackControlPlaneReconciler) reconcileNormal(ctx context.Context, i
437487
return ctrlResult, nil
438488
}
439489

440-
ctrlResult, err = openstack.ReconcileKeystoneAPI(ctx, instance, version, helper)
490+
// OVN databases are part of infrastructure
491+
ctrlResult, err = openstack.ReconcileOVN(ctx, instance, version, helper)
441492
if err != nil {
442493
return ctrl.Result{}, err
443494
} else if (ctrlResult != ctrl.Result{}) {
444495
return ctrlResult, nil
445496
}
446497

447-
ctrlResult, err = openstack.ReconcilePlacementAPI(ctx, instance, version, helper)
498+
// Update InfrastructureReady condition based on infrastructure component readiness
499+
// This is useful for observability regardless of staged deployment mode
500+
infrastructureReady, notReadyComponents := isInfrastructureReady(instance)
501+
502+
if infrastructureReady {
503+
// Set different messages based on whether deployment is paused
504+
if infrastructureOnly {
505+
// Infrastructure-only mode: indicate deployment is paused
506+
instance.Status.Conditions.MarkTrue(
507+
corev1beta1.OpenStackControlPlaneInfrastructureReadyCondition,
508+
corev1beta1.OpenStackControlPlaneInfrastructureReadyPausedMessage)
509+
r.GetLogger(ctx).Info("Infrastructure components ready - deployment paused at infrastructure-only stage")
510+
} else {
511+
// Normal mode: infrastructure is ready
512+
instance.Status.Conditions.MarkTrue(
513+
corev1beta1.OpenStackControlPlaneInfrastructureReadyCondition,
514+
corev1beta1.OpenStackControlPlaneInfrastructureReadyMessage)
515+
}
516+
} else {
517+
// Build a descriptive message showing which components are not ready
518+
if len(notReadyComponents) > 0 {
519+
instance.Status.Conditions.Set(condition.FalseCondition(
520+
corev1beta1.OpenStackControlPlaneInfrastructureReadyCondition,
521+
condition.RequestedReason,
522+
condition.SeverityInfo,
523+
corev1beta1.OpenStackControlPlaneInfrastructureReadyWaitingMessage,
524+
strings.Join(notReadyComponents, ", ")))
525+
} else {
526+
instance.Status.Conditions.Set(condition.FalseCondition(
527+
corev1beta1.OpenStackControlPlaneInfrastructureReadyCondition,
528+
condition.RequestedReason,
529+
condition.SeverityInfo,
530+
corev1beta1.OpenStackControlPlaneInfrastructureReadyRunningMessage))
531+
}
532+
}
533+
534+
// Check if we're in infrastructure-only mode and should pause deployment
535+
if infrastructureOnly {
536+
// Stop here - do not reconcile OpenStack services
537+
return ctrl.Result{}, nil
538+
}
539+
540+
// Continue with OpenStack service reconciliation
541+
ctrlResult, err = openstack.ReconcileKeystoneAPI(ctx, instance, version, helper)
448542
if err != nil {
449543
return ctrl.Result{}, err
450544
} else if (ctrlResult != ctrl.Result{}) {
451545
return ctrlResult, nil
452546
}
453547

454-
ctrlResult, err = openstack.ReconcileGlance(ctx, instance, version, helper)
548+
ctrlResult, err = openstack.ReconcilePlacementAPI(ctx, instance, version, helper)
455549
if err != nil {
456550
return ctrl.Result{}, err
457551
} else if (ctrlResult != ctrl.Result{}) {
458552
return ctrlResult, nil
459553
}
460554

461-
ctrlResult, err = openstack.ReconcileCinder(ctx, instance, version, helper)
555+
ctrlResult, err = openstack.ReconcileGlance(ctx, instance, version, helper)
462556
if err != nil {
463557
return ctrl.Result{}, err
464558
} else if (ctrlResult != ctrl.Result{}) {
465559
return ctrlResult, nil
466560
}
467561

468-
ctrlResult, err = openstack.ReconcileOVN(ctx, instance, version, helper)
562+
ctrlResult, err = openstack.ReconcileCinder(ctx, instance, version, helper)
469563
if err != nil {
470564
return ctrl.Result{}, err
471565
} else if (ctrlResult != ctrl.Result{}) {
472566
return ctrlResult, nil
473567
}
474568

569+
// OVN already reconciled in infrastructure section above
570+
475571
ctrlResult, err = openstack.ReconcileNeutron(ctx, instance, version, helper)
476572
if err != nil {
477573
return ctrl.Result{}, err

test/kuttl/common/assert-sample-deployment.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ status:
254254
reason: Ready
255255
status: "True"
256256
type: OpenStackControlPlaneGlanceReady
257+
- message: OpenStackControlPlane Infrastructure ready
258+
reason: Ready
259+
status: "True"
260+
type: InfrastructureReady
257261
- message: OpenStackControlPlane InstanceHa CM is available
258262
reason: Ready
259263
status: "True"

test/kuttl/tests/ctlplane-basic-deployment/03-assert-deploy-custom-cacert.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ status:
6363
reason: Ready
6464
status: "True"
6565
type: OpenStackControlPlaneGlanceReady
66+
- message: OpenStackControlPlane Infrastructure ready
67+
reason: Ready
68+
status: "True"
69+
type: InfrastructureReady
6670
- message: OpenStackControlPlane InstanceHa CM is available
6771
reason: Ready
6872
status: "True"

test/kuttl/tests/ctlplane-collapsed/01-assert-collapsed-cell.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ status:
231231
reason: Ready
232232
status: "True"
233233
type: OpenStackControlPlaneGlanceReady
234+
- message: OpenStackControlPlane Infrastructure ready
235+
reason: Ready
236+
status: "True"
237+
type: InfrastructureReady
234238
- message: OpenStackControlPlane InstanceHa CM is available
235239
reason: Ready
236240
status: "True"

test/kuttl/tests/ctlplane-galera-3replicas/01-assert-galera-3replicas.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ status:
219219
reason: Ready
220220
status: "True"
221221
type: OpenStackControlPlaneGlanceReady
222+
- message: OpenStackControlPlane Infrastructure ready
223+
reason: Ready
224+
status: "True"
225+
type: InfrastructureReady
222226
- message: OpenStackControlPlane InstanceHa CM is available
223227
reason: Ready
224228
status: "True"
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# Assert that infrastructure is ready but deployment is paused
2+
# InfrastructureReady should be True with pause message
3+
# Infrastructure components (CAs, DNS, RabbitMQ, MariaDB, Memcached, OVN) should be Ready
4+
# Service components should still be in Init/Unknown state
5+
# Overall Ready should be False
6+
apiVersion: core.openstack.org/v1beta1
7+
kind: OpenStackControlPlane
8+
metadata:
9+
name: openstack
10+
annotations:
11+
core.openstack.org/deployment-stage: infrastructure-only
12+
status:
13+
conditions:
14+
# Overall deployment should not be ready yet (paused after infrastructure)
15+
- message: OpenStackControlPlane Infrastructure ready - deployment paused. Remove annotation to resume deployment of OpenStack services
16+
reason: Requested
17+
status: "False"
18+
type: Ready
19+
# Infrastructure should be ready with pause message
20+
- message: OpenStackControlPlane Infrastructure ready - deployment paused. Remove annotation to resume deployment of OpenStack services
21+
reason: Ready
22+
status: "True"
23+
type: InfrastructureReady
24+
# Infrastructure components should be ready
25+
- message: OpenStackControlPlane CAs completed
26+
reason: Ready
27+
status: "True"
28+
type: OpenStackControlPlaneCAReadyCondition
29+
- message: OpenStackControlPlane DNSData completed
30+
reason: Ready
31+
status: "True"
32+
type: OpenStackControlPlaneDNSReadyCondition
33+
- message: OpenStackControlPlane RabbitMQ completed
34+
reason: Ready
35+
status: "True"
36+
type: OpenStackControlPlaneRabbitMQReady
37+
- message: OpenStackControlPlane MariaDB completed
38+
reason: Ready
39+
status: "True"
40+
type: OpenStackControlPlaneMariaDBReady
41+
- message: OpenStackControlPlane Memcached completed
42+
reason: Ready
43+
status: "True"
44+
type: OpenStackControlPlaneMemcachedReady
45+
- message: OpenStackControlPlane OVN completed
46+
reason: Ready
47+
status: "True"
48+
type: OpenStackControlPlaneOVNReady
49+
# Service components should still be initializing (Unknown status with Init reason)
50+
- reason: Init
51+
status: Unknown
52+
type: OpenStackControlPlaneKeystoneAPIReady
53+
- reason: Init
54+
status: Unknown
55+
type: OpenStackControlPlanePlacementAPIReady
56+
- reason: Init
57+
status: Unknown
58+
type: OpenStackControlPlaneGlanceReady
59+
- reason: Init
60+
status: Unknown
61+
type: OpenStackControlPlaneCinderReady
62+
- reason: Init
63+
status: Unknown
64+
type: OpenStackControlPlaneNeutronReady
65+
- reason: Init
66+
status: Unknown
67+
type: OpenStackControlPlaneNovaReady
68+
- reason: Init
69+
status: Unknown
70+
type: OpenStackControlPlaneIronicReady
71+
- reason: Init
72+
status: Unknown
73+
type: OpenStackControlPlaneClientReady
74+
- reason: Init
75+
status: Unknown
76+
type: OpenStackControlPlaneManilaReady
77+
- reason: Init
78+
status: Unknown
79+
type: OpenStackControlPlaneHorizonReady
80+
- reason: Init
81+
status: Unknown
82+
type: OpenStackControlPlaneTelemetryReady
83+
- reason: Init
84+
status: Unknown
85+
type: OpenStackControlPlaneHeatReady
86+
- reason: Init
87+
status: Unknown
88+
type: OpenStackControlPlaneSwiftReady
89+
- reason: Init
90+
status: Unknown
91+
type: OpenStackControlPlaneOctaviaReady
92+
- reason: Init
93+
status: Unknown
94+
type: OpenStackControlPlaneDesignateReady
95+
- reason: Init
96+
status: Unknown
97+
type: OpenStackControlPlaneBarbicanReady
98+
- reason: Init
99+
status: Unknown
100+
type: OpenStackControlPlaneRedisReady
101+
- reason: Init
102+
status: Unknown
103+
type: OpenStackControlPlaneWatcherReady
104+
- reason: Init
105+
status: Unknown
106+
type: OpenStackControlPlaneOpenStackVersionInitializationReadyCondition
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Deploy OpenStackControlPlane with deployment-stage annotation set to infrastructure-only
2+
# This should pause deployment after infrastructure (CAs, DNSMasq, RabbitMQ, Galera, Memcached, OVN) is ready
3+
apiVersion: kuttl.dev/v1beta1
4+
kind: TestStep
5+
commands:
6+
- script: |
7+
oc kustomize ../../../../config/samples/base/openstackcontrolplane | \
8+
oc annotate -f - --local=true --dry-run=none \
9+
core.openstack.org/deployment-stage=infrastructure-only -o yaml | \
10+
oc apply -n $NAMESPACE -f -
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../common/assert-sample-deployment.yaml

0 commit comments

Comments
 (0)