diff --git a/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml b/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml index f204b7bb..5e973474 100644 --- a/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml +++ b/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml @@ -146,6 +146,14 @@ spec: spec: clusterPermissions: - rules: + - apiGroups: + - "" + resourceNames: + - pull-secret + resources: + - secrets + verbs: + - get - apiGroups: - config.openshift.io resources: diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 81d3ffb1..0d8e6771 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -4,6 +4,14 @@ kind: ClusterRole metadata: name: manager-role rules: +- apiGroups: + - "" + resourceNames: + - pull-secret + resources: + - secrets + verbs: + - get - apiGroups: - config.openshift.io resources: diff --git a/internal/controller/constants.go b/internal/controller/constants.go index 4c390d4a..4bff8a47 100644 --- a/internal/controller/constants.go +++ b/internal/controller/constants.go @@ -97,11 +97,14 @@ const ( ForceReloadAnnotationKey = "ols.openshift.io/force-reload" // Data Exporter - ExporterConfigVolumeName = "exporter-config" - ExporterConfigMountPath = "/etc/config" - ExporterConfigFilename = "config.yaml" - RHOSOLightspeedOwnerIDLabel = "openstack.org/lightspeed-owner-id" - ServiceIDRHOSO = "rhos-lightspeed" + ExporterConfigVolumeName = "exporter-config" + ExporterConfigMountPath = "/etc/config" + ExporterConfigFilename = "config.yaml" + ExporterConfigCmName = "lightspeed-exporter-config" + DataverseExporterContainerName = "lightspeed-to-dataverse-exporter" + UserDataVolumeName = "ols-user-data" + RHOSOLightspeedOwnerIDLabel = "openstack.org/lightspeed-owner-id" + ServiceIDRHOSO = "rhos-lightspeed" // Azure AzureOpenAIType = "azure_openai" diff --git a/internal/controller/errors.go b/internal/controller/errors.go index 53658539..4b01e11e 100644 --- a/internal/controller/errors.go +++ b/internal/controller/errors.go @@ -35,6 +35,7 @@ var ( ErrGetTLSSecret = errors.New("failed to get TLS secret") ErrCreateLlamaStackConfigMap = errors.New("failed to create Llama Stack configmap") ErrGenerateLlamaStackConfigMap = errors.New("failed to generate Llama Stack configmap") + ErrCreateExporterConfigMap = errors.New("failed to create exporter configmap") // Postgres Errors ErrCreatePostgresDeployment = errors.New("failed to create Postgres deployment") diff --git a/internal/controller/lcore_config.go b/internal/controller/lcore_config.go index 42bbe43f..fccfdb3b 100644 --- a/internal/controller/lcore_config.go +++ b/internal/controller/lcore_config.go @@ -22,6 +22,8 @@ import ( common_helper "github.com/openstack-k8s-operators/lib-common/modules/common/helper" apiv1beta1 "github.com/openstack-lightspeed/operator/api/v1beta1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" ) @@ -197,6 +199,36 @@ func buildLCoreConversationCacheConfig(h *common_helper.Helper, _ *apiv1beta1.Op } } +// isDataCollectionEnabled returns true if at least one of feedback or transcripts is enabled. +func isDataCollectionEnabled(instance *apiv1beta1.OpenStackLightspeed) bool { + return !instance.Spec.FeedbackDisabled || !instance.Spec.TranscriptsDisabled +} + +// buildExporterConfigMap creates the ConfigMap for the dataverse exporter sidecar. +func buildExporterConfigMap(h *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) *corev1.ConfigMap { + exporterConfig := fmt.Sprintf(`service_id: "%s" +ingress_server_url: "https://console.redhat.com/api/ingress/v1/upload" +allowed_subdirs: + - feedback + - transcripts + - config_status +collection_interval: 300 +cleanup_after_send: true +ingress_connection_timeout: 30 +`, ServiceIDRHOSO) + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: ExporterConfigCmName, + Namespace: h.GetBeforeObject().GetNamespace(), + Labels: generateAppServerSelectorLabels(), + }, + Data: map[string]string{ + ExporterConfigFilename: exporterConfig, + }, + } +} + // buildLCoreConfigYAML assembles the complete Lightspeed Core Service configuration and converts to YAML. // NOTE: MCP servers, quota handlers, and tools approval features are disabled for OpenStack Lightspeed. func buildLCoreConfigYAML(h *common_helper.Helper, instance *apiv1beta1.OpenStackLightspeed) (string, error) { diff --git a/internal/controller/lcore_deployment.go b/internal/controller/lcore_deployment.go index 069003d1..7f391b33 100644 --- a/internal/controller/lcore_deployment.go +++ b/internal/controller/lcore_deployment.go @@ -19,11 +19,13 @@ package controller import ( "context" "fmt" + "path" common_helper "github.com/openstack-k8s-operators/lib-common/modules/common/helper" apiv1beta1 "github.com/openstack-lightspeed/operator/api/v1beta1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" @@ -86,6 +88,12 @@ func buildLCorePodTemplateSpec(h *common_helper.Helper, ctx context.Context, ins ImagePullPolicy: corev1.PullIfNotPresent, } + // Data collection volumes (shared folder + exporter config) + dataCollectionEnabled := isDataCollectionEnabled(instance) + if dataCollectionEnabled { + addDataCollectorVolumes(&volumes, VolumeDefaultMode) + } + // Lightspeed Stack container mounts: its config + shared + TLS (only API container needs TLS) lightspeedStackMounts := []corev1.VolumeMount{lcoreMount} lightspeedStackMounts = append(lightspeedStackMounts, sharedMounts...) @@ -93,6 +101,14 @@ func buildLCorePodTemplateSpec(h *common_helper.Helper, ctx context.Context, ins addTLSVolumesAndMounts(&volumes, &tlsMounts, VolumeDefaultMode) lightspeedStackMounts = append(lightspeedStackMounts, tlsMounts...) + // Mount shared data folder on lightspeed-service-api for feedback/transcripts + if dataCollectionEnabled { + lightspeedStackMounts = append(lightspeedStackMounts, corev1.VolumeMount{ + Name: UserDataVolumeName, + MountPath: LCoreUserDataMountPath, + }) + } + lightspeedStackContainer := corev1.Container{ Name: "lightspeed-service-api", Image: apiv1beta1.OpenStackLightspeedDefaultValues.LCoreImageURL, @@ -107,6 +123,42 @@ func buildLCorePodTemplateSpec(h *common_helper.Helper, ctx context.Context, ins containers := []corev1.Container{llamaStackContainer, lightspeedStackContainer} + // Add dataverse exporter sidecar when data collection is enabled + if dataCollectionEnabled { + exporterContainer := corev1.Container{ + Name: DataverseExporterContainerName, + Image: apiv1beta1.OpenStackLightspeedDefaultValues.ExporterImageURL, + ImagePullPolicy: corev1.PullAlways, + Args: []string{ + "--mode", "openshift", + "--config", path.Join(ExporterConfigMountPath, ExporterConfigFilename), + "--log-level", "INFO", + "--data-dir", LCoreUserDataMountPath, + }, + VolumeMounts: []corev1.VolumeMount{ + { + Name: UserDataVolumeName, + MountPath: LCoreUserDataMountPath, + }, + { + Name: ExporterConfigVolumeName, + MountPath: ExporterConfigMountPath, + ReadOnly: true, + }, + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("50m"), + corev1.ResourceMemory: resource.MustParse("64Mi"), + }, + Limits: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse("200Mi"), + }, + }, + } + containers = append(containers, exporterContainer) + } + // Build configmap resource version annotations for change detection annotations, err := buildConfigMapAnnotations(h, ctx) if err != nil { @@ -248,6 +300,28 @@ func addLlamaCacheVolumesAndMounts(volumes *[]corev1.Volume, mounts *[]corev1.Vo }) } +// addDataCollectorVolumes adds the shared data EmptyDir and exporter config volumes. +func addDataCollectorVolumes(volumes *[]corev1.Volume, volumeDefaultMode int32) { + *volumes = append(*volumes, corev1.Volume{ + Name: UserDataVolumeName, + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }) + + *volumes = append(*volumes, corev1.Volume{ + Name: ExporterConfigVolumeName, + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: ExporterConfigCmName, + }, + DefaultMode: toPtr(volumeDefaultMode), + }, + }, + }) +} + // addUserCAVolumesAndMounts adds user-provided additional CA certificate volume and mount // if instance.Spec.TLSCACertBundle is set. func addUserCAVolumesAndMounts(volumes *[]corev1.Volume, mounts *[]corev1.VolumeMount, instance *apiv1beta1.OpenStackLightspeed, volumeDefaultMode int32) { diff --git a/internal/controller/lcore_reconciler.go b/internal/controller/lcore_reconciler.go index a922259a..dc1ddb76 100644 --- a/internal/controller/lcore_reconciler.go +++ b/internal/controller/lcore_reconciler.go @@ -46,6 +46,7 @@ func ReconcileLCoreResources(h *common_helper.Helper, ctx context.Context, insta {Name: "SARRoleBinding", Task: reconcileSARRoleBinding}, {Name: "LlamaStackConfigMap", Task: reconcileLlamaStackConfigMap}, {Name: "LcoreConfigMap", Task: reconcileLcoreConfigMap}, + {Name: "ExporterConfigMap", Task: reconcileExporterConfigMap}, {Name: "OpenStackLightspeedAdditionalCAConfigMap", Task: reconcileOpenStackLightspeedAdditionalCAConfigMap}, {Name: "ProxyCAConfigMap", Task: reconcileProxyCAConfigMap}, {Name: "NetworkPolicy", Task: reconcileNetworkPolicy}, @@ -115,6 +116,17 @@ func reconcileSARRole(h *common_helper.Helper, ctx context.Context, instance *ap Resources: []string{"tokenreviews"}, Verbs: []string{"create"}, }, + { + APIGroups: []string{"config.openshift.io"}, + Resources: []string{"clusterversions"}, + Verbs: []string{"get"}, + }, + { + APIGroups: []string{""}, + Resources: []string{"secrets"}, + ResourceNames: []string{"pull-secret"}, + Verbs: []string{"get"}, + }, } // Note: ClusterRole is cluster-scoped, no owner reference needed return nil @@ -233,6 +245,43 @@ func reconcileLcoreConfigMap(h *common_helper.Helper, ctx context.Context, insta return nil } +// reconcileExporterConfigMap ensures the dataverse exporter ConfigMap exists when data +// collection is enabled, and deletes it when disabled. +func reconcileExporterConfigMap(h *common_helper.Helper, ctx context.Context, instance *apiv1beta1.OpenStackLightspeed) error { + logger := h.GetLogger() + + if !isDataCollectionEnabled(instance) { + cm := &corev1.ConfigMap{} + cm.Name = ExporterConfigCmName + cm.Namespace = h.GetBeforeObject().GetNamespace() + if err := h.GetClient().Delete(ctx, cm); err != nil && !errors.IsNotFound(err) { + return fmt.Errorf("failed to delete exporter configmap: %w", err) + } + return nil + } + + cm := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: ExporterConfigCmName, + Namespace: h.GetBeforeObject().GetNamespace(), + }, + } + + result, err := controllerutil.CreateOrPatch(ctx, h.GetClient(), cm, func() error { + desiredCm := buildExporterConfigMap(h, instance) + cm.Data = desiredCm.Data + cm.Labels = desiredCm.Labels + return controllerutil.SetControllerReference(h.GetBeforeObject(), cm, h.GetScheme()) + }) + + if err != nil { + return fmt.Errorf("%w: %v", ErrCreateExporterConfigMap, err) + } + + logger.Info("Exporter ConfigMap reconciled", "name", cm.Name, "result", result) + return nil +} + // reconcileOpenStackLightspeedAdditionalCAConfigMap verifies that the additional CA config map // exists if one is specified in the configuration. func reconcileOpenStackLightspeedAdditionalCAConfigMap(h *common_helper.Helper, ctx context.Context, instance *apiv1beta1.OpenStackLightspeed) error { diff --git a/internal/controller/openstacklightspeed_controller.go b/internal/controller/openstacklightspeed_controller.go index c109d562..71f897a2 100644 --- a/internal/controller/openstacklightspeed_controller.go +++ b/internal/controller/openstacklightspeed_controller.go @@ -63,6 +63,7 @@ func (r *OpenStackLightspeedReconciler) GetLogger(ctx context.Context) logr.Logg // +kubebuilder:rbac:groups=operators.coreos.com,resources=clusterserviceversions,verbs=get;list;watch // +kubebuilder:rbac:groups=operators.coreos.com,resources=clusterserviceversions,namespace=openstack-lightspeed,verbs=update;patch;delete // +kubebuilder:rbac:groups=config.openshift.io,resources=clusterversions,verbs=get;list;watch +// +kubebuilder:rbac:groups="",resources=secrets,resourceNames=pull-secret,verbs=get // +kubebuilder:rbac:groups=networking.k8s.io,resources=networkpolicies,namespace=openstack-lightspeed,verbs=get;list;watch;create;patch;update // +kubebuilder:rbac:groups=apps,resources=deployments,namespace=openstack-lightspeed,verbs=get;list;watch;create;update;patch // +kubebuilder:rbac:groups="",resources=configmaps,namespace=openstack-lightspeed,verbs=get;list;watch;create;patch;update;delete diff --git a/test/kuttl/common/openstack-lightspeed-instance/assert-exporter-config.yaml b/test/kuttl/common/openstack-lightspeed-instance/assert-exporter-config.yaml new file mode 100644 index 00000000..5b7c8e9a --- /dev/null +++ b/test/kuttl/common/openstack-lightspeed-instance/assert-exporter-config.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: lightspeed-exporter-config + namespace: openstack-lightspeed +data: + config.yaml: | + service_id: "rhos-lightspeed" + ingress_server_url: "https://console.redhat.com/api/ingress/v1/upload" + allowed_subdirs: + - feedback + - transcripts + - config_status + collection_interval: 300 + cleanup_after_send: true + ingress_connection_timeout: 30 diff --git a/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml b/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml index c82d7ed3..e484107c 100644 --- a/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml +++ b/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml @@ -68,6 +68,20 @@ rules: - tokenreviews verbs: - create + - apiGroups: + - config.openshift.io + resources: + - clusterversions + verbs: + - get + - apiGroups: + - "" + resources: + - secrets + resourceNames: + - pull-secret + verbs: + - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding @@ -100,6 +114,12 @@ metadata: namespace: openstack-lightspeed --- apiVersion: v1 +kind: ConfigMap +metadata: + name: lightspeed-exporter-config + namespace: openstack-lightspeed +--- +apiVersion: v1 kind: Service metadata: name: lightspeed-app-server @@ -110,6 +130,13 @@ kind: Deployment metadata: name: lightspeed-stack-deployment namespace: openstack-lightspeed +spec: + template: + spec: + containers: + - name: llama-stack + - name: lightspeed-service-api + - name: lightspeed-to-dataverse-exporter status: replicas: 1 readyReplicas: 1 diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/05-assert-exporter-config.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/05-assert-exporter-config.yaml new file mode 100644 index 00000000..5b7c8e9a --- /dev/null +++ b/test/kuttl/tests/basic-openstack-lightspeed-configuration/05-assert-exporter-config.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: lightspeed-exporter-config + namespace: openstack-lightspeed +data: + config.yaml: | + service_id: "rhos-lightspeed" + ingress_server_url: "https://console.redhat.com/api/ingress/v1/upload" + allowed_subdirs: + - feedback + - transcripts + - config_status + collection_interval: 300 + cleanup_after_send: true + ingress_connection_timeout: 30 diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/05-assert-openstack-lightspeed-instance.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/06-assert-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/basic-openstack-lightspeed-configuration/05-assert-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/basic-openstack-lightspeed-configuration/06-assert-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/06-cleanup-openstack-lightspeed-instance.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/07-cleanup-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/basic-openstack-lightspeed-configuration/06-cleanup-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/basic-openstack-lightspeed-configuration/07-cleanup-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/07-errors-openstack-lightspeed-instance.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/08-errors-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/basic-openstack-lightspeed-configuration/07-errors-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/basic-openstack-lightspeed-configuration/08-errors-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/08-cleanup-mock-objects.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/09-cleanup-mock-objects.yaml similarity index 100% rename from test/kuttl/tests/basic-openstack-lightspeed-configuration/08-cleanup-mock-objects.yaml rename to test/kuttl/tests/basic-openstack-lightspeed-configuration/09-cleanup-mock-objects.yaml diff --git a/test/kuttl/tests/basic-openstack-lightspeed-configuration/09-errors-mock-objects.yaml b/test/kuttl/tests/basic-openstack-lightspeed-configuration/10-errors-mock-objects.yaml similarity index 100% rename from test/kuttl/tests/basic-openstack-lightspeed-configuration/09-errors-mock-objects.yaml rename to test/kuttl/tests/basic-openstack-lightspeed-configuration/10-errors-mock-objects.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/05-assert-exporter-config.yaml b/test/kuttl/tests/update-openstacklightspeed/05-assert-exporter-config.yaml new file mode 100644 index 00000000..5b7c8e9a --- /dev/null +++ b/test/kuttl/tests/update-openstacklightspeed/05-assert-exporter-config.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: lightspeed-exporter-config + namespace: openstack-lightspeed +data: + config.yaml: | + service_id: "rhos-lightspeed" + ingress_server_url: "https://console.redhat.com/api/ingress/v1/upload" + allowed_subdirs: + - feedback + - transcripts + - config_status + collection_interval: 300 + cleanup_after_send: true + ingress_connection_timeout: 30 diff --git a/test/kuttl/tests/update-openstacklightspeed/05-assert-openstack-lightspeed-instance.yaml b/test/kuttl/tests/update-openstacklightspeed/06-assert-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/05-assert-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/update-openstacklightspeed/06-assert-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/06-update-openstack-lightspeed-instance.yaml b/test/kuttl/tests/update-openstacklightspeed/07-update-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/06-update-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/update-openstacklightspeed/07-update-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/07-assert-configmaps-update.yaml b/test/kuttl/tests/update-openstacklightspeed/08-assert-configmaps-update.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/07-assert-configmaps-update.yaml rename to test/kuttl/tests/update-openstacklightspeed/08-assert-configmaps-update.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/08-assert-lightspeed-stack-config-update.yaml b/test/kuttl/tests/update-openstacklightspeed/09-assert-lightspeed-stack-config-update.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/08-assert-lightspeed-stack-config-update.yaml rename to test/kuttl/tests/update-openstacklightspeed/09-assert-lightspeed-stack-config-update.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/09-assert-llama-stack-config-update.yaml b/test/kuttl/tests/update-openstacklightspeed/10-assert-llama-stack-config-update.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/09-assert-llama-stack-config-update.yaml rename to test/kuttl/tests/update-openstacklightspeed/10-assert-llama-stack-config-update.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/10-assert-openstacklightspeed-update.yaml b/test/kuttl/tests/update-openstacklightspeed/11-assert-openstacklightspeed-update.yaml similarity index 95% rename from test/kuttl/tests/update-openstacklightspeed/10-assert-openstacklightspeed-update.yaml rename to test/kuttl/tests/update-openstacklightspeed/11-assert-openstacklightspeed-update.yaml index 7d50132c..b3246ca3 100644 --- a/test/kuttl/tests/update-openstacklightspeed/10-assert-openstacklightspeed-update.yaml +++ b/test/kuttl/tests/update-openstacklightspeed/11-assert-openstacklightspeed-update.yaml @@ -66,6 +66,12 @@ metadata: name: lightspeed-stack-deployment namespace: openstack-lightspeed generation: 2 +spec: + template: + spec: + containers: + - name: llama-stack + - name: lightspeed-service-api status: replicas: 1 readyReplicas: 1 diff --git a/test/kuttl/tests/update-openstacklightspeed/11-cleanup-openstack-lightspeed-instance.yaml b/test/kuttl/tests/update-openstacklightspeed/12-cleanup-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/11-cleanup-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/update-openstacklightspeed/12-cleanup-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/12-errors-openstack-lightspeed-instance.yaml b/test/kuttl/tests/update-openstacklightspeed/13-errors-openstack-lightspeed-instance.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/12-errors-openstack-lightspeed-instance.yaml rename to test/kuttl/tests/update-openstacklightspeed/13-errors-openstack-lightspeed-instance.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/13-cleanup-mock-objects.yaml b/test/kuttl/tests/update-openstacklightspeed/14-cleanup-mock-objects.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/13-cleanup-mock-objects.yaml rename to test/kuttl/tests/update-openstacklightspeed/14-cleanup-mock-objects.yaml diff --git a/test/kuttl/tests/update-openstacklightspeed/14-errors-mock-objects.yaml b/test/kuttl/tests/update-openstacklightspeed/15-errors-mock-objects.yaml similarity index 100% rename from test/kuttl/tests/update-openstacklightspeed/14-errors-mock-objects.yaml rename to test/kuttl/tests/update-openstacklightspeed/15-errors-mock-objects.yaml