@@ -22,6 +22,7 @@ import (
2222 "fmt"
2323 "text/template"
2424
25+ "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
2526 common_helper "github.com/openstack-k8s-operators/lib-common/modules/common/helper"
2627 apiv1beta1 "github.com/openstack-k8s-operators/lightspeed-operator/api/v1beta1"
2728 corev1 "k8s.io/api/core/v1"
@@ -114,6 +115,38 @@ func GetMCPServerURL() string {
114115// Reconciliation
115116// ---------------------------------------------------------------------------
116117
118+ // ReconcileMCPServerTask reconciles the MCP server as a ReconcileFunc.
119+ func (r * OpenStackLightspeedReconciler ) ReconcileMCPServerTask (h * common_helper.Helper , ctx context.Context , instance * apiv1beta1.OpenStackLightspeed ) error {
120+ rhosMCPEnabled , err := isRHOSMCPEnabled (instance )
121+ if err != nil {
122+ return fmt .Errorf ("failed to parse dev config: %w" , err )
123+ }
124+ if rhosMCPEnabled {
125+ openStackReady , mcpErr := r .ReconcileMCPServer (ctx , h , instance )
126+ if mcpErr != nil {
127+ instance .Status .Conditions .Set (condition .FalseCondition (
128+ apiv1beta1 .OpenStackLightspeedMCPServerReadyCondition ,
129+ condition .ErrorReason ,
130+ condition .SeverityWarning ,
131+ apiv1beta1 .DeploymentCheckFailedMessage ,
132+ mcpErr .Error (),
133+ ))
134+ return mcpErr
135+ }
136+ instance .Status .OpenStackReady = openStackReady
137+ } else {
138+ if err := r .cleanupMCPResources (ctx , h , instance ); err != nil {
139+ return err
140+ }
141+ instance .Status .OpenStackReady = false
142+ instance .Status .Conditions .MarkTrue (
143+ apiv1beta1 .OpenStackLightspeedMCPServerReadyCondition ,
144+ apiv1beta1 .OpenStackLightspeedMCPServerDisabledMessage ,
145+ )
146+ }
147+ return nil
148+ }
149+
117150// ReconcileMCPServer performs the reconciliation of the MCP server.
118151// The MCP server runs as a sidecar in the LCore pod. The OpenStack MCP tools
119152// are only configured in lightspeed-stack when OpenStackControlPlane exists and is Ready.
@@ -301,6 +334,52 @@ func extractOSCPFields(
301334 }, nil
302335}
303336
337+ // ---------------------------------------------------------------------------
338+ // Deletion
339+ // ---------------------------------------------------------------------------
340+
341+ // cleanupMCPResources removes MCP server resources when the rhos_mcps feature
342+ // flag is disabled.
343+ func (r * OpenStackLightspeedReconciler ) cleanupMCPResources (
344+ ctx context.Context ,
345+ helper * common_helper.Helper ,
346+ instance * apiv1beta1.OpenStackLightspeed ,
347+ ) error {
348+ log := helper .GetLogger ()
349+ ns := instance .Namespace
350+
351+ mcpCM := & corev1.ConfigMap {}
352+ mcpCM .Name = MCPConfigYAMLConfigMapName
353+ mcpCM .Namespace = ns
354+ if err := helper .GetClient ().Delete (ctx , mcpCM ); err != nil && ! k8s_errors .IsNotFound (err ) {
355+ return fmt .Errorf ("failed to delete MCP config ConfigMap: %w" , err )
356+ }
357+
358+ cloudsCM := & corev1.ConfigMap {}
359+ cloudsCM .Name = CloudsYAMLConfigMapName
360+ cloudsCM .Namespace = ns
361+ if err := helper .GetClient ().Delete (ctx , cloudsCM ); err != nil && ! k8s_errors .IsNotFound (err ) {
362+ return fmt .Errorf ("failed to delete openstack-config ConfigMap: %w" , err )
363+ }
364+
365+ secureSec := & corev1.Secret {}
366+ secureSec .Name = SecureYAMLSecretName
367+ secureSec .Namespace = ns
368+ if err := helper .GetClient ().Delete (ctx , secureSec ); err != nil && ! k8s_errors .IsNotFound (err ) {
369+ return fmt .Errorf ("failed to delete openstack-config-secret Secret: %w" , err )
370+ }
371+
372+ caSec := & corev1.Secret {}
373+ caSec .Name = CombinedCABundleSecretName
374+ caSec .Namespace = ns
375+ if err := helper .GetClient ().Delete (ctx , caSec ); err != nil && ! k8s_errors .IsNotFound (err ) {
376+ return fmt .Errorf ("failed to delete combined-ca-bundle Secret: %w" , err )
377+ }
378+
379+ log .Info ("RHOS MCP resources cleaned up" )
380+ return nil
381+ }
382+
304383// copyObjectsToOpenStackLightspeedNamespace copies the required ConfigMaps and Secrets
305384// from the OpenStackControlPlane's namespace to the OpenStack Lightspeed namespace.
306385func copyObjectsToOpenStackLightspeedNamespace (
0 commit comments