Skip to content

Commit 3602e24

Browse files
Merge pull request #1796 from stuggi/backup_restore_uid
Implement service name caching for UniquePodNames
2 parents a8f825c + 10ac79c commit 3602e24

13 files changed

Lines changed: 689 additions & 19 deletions

File tree

api/bases/core.openstack.org_openstackcontrolplanes.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,8 @@ spec:
677677
enabled:
678678
default: true
679679
type: boolean
680+
serviceName:
681+
type: string
680682
template:
681683
properties:
682684
apiTimeout:
@@ -3649,6 +3651,8 @@ spec:
36493651
enabled:
36503652
default: true
36513653
type: boolean
3654+
serviceName:
3655+
type: string
36523656
template:
36533657
properties:
36543658
apiTimeout:

api/core/v1beta1/openstackcontrolplane_types.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ const (
7171
DeploymentStageAnnotation = "core.openstack.org/deployment-stage"
7272
// DeploymentStageInfrastructureOnly - Annotation value to pause after infrastructure deployment
7373
DeploymentStageInfrastructureOnly = "infrastructure-only"
74+
75+
// ReconcileTriggerAnnotation - Generic annotation to trigger reconciliation and webhook
76+
// Value is typically a timestamp to ensure annotation changes trigger updates
77+
// Used by controller to trigger UPDATE webhook when needed (e.g., for service name caching)
78+
ReconcileTriggerAnnotation = "openstack.org/reconcile-trigger"
7479
)
7580

7681
// OpenStackControlPlaneSpec defines the desired state of OpenStackControlPlane
@@ -450,6 +455,12 @@ type GlanceSection struct {
450455
// Convenient to avoid podname (and thus hostname) collision between different deployments.
451456
// Useful for CI jobs as well as preproduction and production environments that use the same storage backend, etc.
452457
UniquePodNames bool `json:"uniquePodNames"`
458+
459+
// +kubebuilder:validation:Optional
460+
// ServiceName - Cached service name for Glance CR. Set automatically when UniquePodNames is enabled.
461+
// This field preserves the service name (with UID suffix) across reconciliations and restores,
462+
// ensuring consistent resource naming even when the CR is recreated. Should not be manually set.
463+
ServiceName string `json:"serviceName,omitempty"`
453464
}
454465

455466
// CinderSection defines the desired state of Cinder service
@@ -476,6 +487,12 @@ type CinderSection struct {
476487
// Convenient to avoid podname (and thus hostname) collision between different deployments.
477488
// Useful for CI jobs as well as preproduction and production environments that use the same storage backend, etc.
478489
UniquePodNames bool `json:"uniquePodNames"`
490+
491+
// +kubebuilder:validation:Optional
492+
// ServiceName - Cached service name for Cinder CR. Set automatically when UniquePodNames is enabled.
493+
// This field preserves the service name (with UID suffix) across reconciliations and restores,
494+
// ensuring consistent resource naming even when the CR is recreated. Should not be manually set.
495+
ServiceName string `json:"serviceName,omitempty"`
479496
}
480497

481498
// GaleraSection defines the desired state of Galera services
@@ -1036,10 +1053,33 @@ func (c CertConfig) GetRenewBeforeHours() string {
10361053
// GetServiceName - returns the name and altName depending if
10371054
// UniquePodNames is configured
10381055
func (instance OpenStackControlPlane) GetServiceName(name string, uniquePodNames bool) (string, string) {
1039-
altName := fmt.Sprintf("%s-%s", name, instance.UID[:5])
1056+
// Generate UID suffix only if UID is available and has sufficient length
1057+
var uidSuffix string
1058+
if len(instance.UID) >= 5 {
1059+
uidSuffix = string(instance.UID[:5])
1060+
}
1061+
1062+
altName := name
1063+
if uidSuffix != "" {
1064+
altName = fmt.Sprintf("%s-%s", name, uidSuffix)
1065+
}
1066+
10401067
if uniquePodNames {
10411068
name, altName = altName, name
10421069
}
10431070

10441071
return name, altName
10451072
}
1073+
1074+
// GetServiceNameCached - returns the name and altName depending if UniquePodNames is configured.
1075+
// If cachedName is provided (non-empty), it will be used instead of generating a new name with UID.
1076+
// This ensures consistent naming across reconciliations and restores.
1077+
func (instance OpenStackControlPlane) GetServiceNameCached(name string, uniquePodNames bool, cachedName string) (string, string) {
1078+
// If we have a cached name and uniquePodNames is enabled, use it
1079+
if uniquePodNames && cachedName != "" {
1080+
return cachedName, name
1081+
}
1082+
1083+
// Otherwise, fall back to the original logic
1084+
return instance.GetServiceName(name, uniquePodNames)
1085+
}

api/core/v1beta1/openstackcontrolplane_webhook.go

Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ package v1beta1
1818

1919
import (
2020
"context"
21+
"crypto/rand"
22+
"encoding/hex"
2123
"fmt"
2224
"slices"
2325
"strings"
2426

2527
keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1"
28+
"github.com/openstack-k8s-operators/lib-common/modules/common/object"
2629
"github.com/openstack-k8s-operators/lib-common/modules/common/route"
2730
common_webhook "github.com/openstack-k8s-operators/lib-common/modules/common/webhook"
2831
mariadbv1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
@@ -32,6 +35,7 @@ import (
3235
apierrors "k8s.io/apimachinery/pkg/api/errors"
3336
"k8s.io/apimachinery/pkg/runtime"
3437
"k8s.io/apimachinery/pkg/runtime/schema"
38+
"k8s.io/apimachinery/pkg/types"
3539
"k8s.io/apimachinery/pkg/util/validation/field"
3640
"k8s.io/utils/ptr"
3741
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -61,6 +65,95 @@ import (
6165
// log is for logging in this package.
6266
var openstackcontrolplanelog = logf.Log.WithName("openstackcontrolplane-resource")
6367

68+
// generateRandomID generates a random 5-character hexadecimal ID
69+
// Used for service naming when UniquePodNames is enabled and UID is not yet available
70+
func generateRandomID() (string, error) {
71+
bytes := make([]byte, 3) // 3 bytes = 6 hex chars, we'll take first 5
72+
if _, err := rand.Read(bytes); err != nil {
73+
return "", err
74+
}
75+
return hex.EncodeToString(bytes)[:5], nil
76+
}
77+
78+
// lookupServiceCR attempts to find an existing service CR in the cluster owned by this OpenStackControlPlane
79+
// Returns the CR name if found, empty string if not found or not owned by the given owner UID
80+
// serviceName should be the base service name (e.g., CinderName, GlanceName)
81+
// ownerUID is the UID of the OpenStackControlPlane that should own the CR
82+
// This function lists CRs and finds ones that start with the service name prefix and are owned by ownerUID
83+
func lookupServiceCR(ctx context.Context, c client.Client, namespace, serviceName string, ownerUID types.UID) (string, error) {
84+
switch serviceName {
85+
case CinderName:
86+
cinderList := &cinderv1.CinderList{}
87+
if err := c.List(ctx, cinderList, client.InNamespace(namespace)); err != nil {
88+
return "", fmt.Errorf("failed to list Cinder CRs: %w", err)
89+
}
90+
// Find any Cinder CR that starts with "cinder" and is owned by this OpenStackControlPlane
91+
for _, cinder := range cinderList.Items {
92+
if strings.HasPrefix(cinder.Name, CinderName) && object.CheckOwnerRefExist(ownerUID, cinder.GetOwnerReferences()) {
93+
return cinder.Name, nil
94+
}
95+
}
96+
97+
case GlanceName:
98+
glanceList := &glancev1.GlanceList{}
99+
if err := c.List(ctx, glanceList, client.InNamespace(namespace)); err != nil {
100+
return "", fmt.Errorf("failed to list Glance CRs: %w", err)
101+
}
102+
// Find any Glance CR that starts with "glance" and is owned by this OpenStackControlPlane
103+
for _, glance := range glanceList.Items {
104+
if strings.HasPrefix(glance.Name, GlanceName) && object.CheckOwnerRefExist(ownerUID, glance.GetOwnerReferences()) {
105+
return glance.Name, nil
106+
}
107+
}
108+
109+
default:
110+
return "", fmt.Errorf("unsupported service name: %s", serviceName)
111+
}
112+
113+
return "", nil // Not found or not owned
114+
}
115+
116+
// CacheServiceNameForCreate handles service name caching during CREATE operations
117+
// Generates a random ID since UID is not yet available
118+
func (r *OpenStackControlPlane) CacheServiceNameForCreate(serviceName string) (string, error) {
119+
randomID, err := generateRandomID()
120+
if err != nil {
121+
return "", fmt.Errorf("failed to generate random ID: %w", err)
122+
}
123+
return fmt.Sprintf("%s-%s", serviceName, randomID), nil
124+
}
125+
126+
// CacheServiceNameForUpdate handles service name caching during UPDATE operations
127+
// Uses existing CR name if it's owned by this OpenStackControlPlane, otherwise generates based on current settings
128+
// This provides robust flip detection: if we created a CR previously, we preserve its name to avoid creating duplicates
129+
func (r *OpenStackControlPlane) CacheServiceNameForUpdate(ctx context.Context, c client.Client, serviceName string) (string, error) {
130+
// Lookup existing CR owned by this OpenStackControlPlane
131+
existingName, err := lookupServiceCR(ctx, c, r.Namespace, serviceName, r.UID)
132+
if err != nil {
133+
return "", fmt.Errorf("failed to lookup existing CR: %w", err)
134+
}
135+
136+
// If we find a CR owned by us, preserve its name regardless of format
137+
// This handles both flip scenarios and prevents creating duplicate CRs:
138+
// - If UniquePodNames changed from false→true, we keep the old "cinder" name
139+
// - If UniquePodNames changed from true→false, we keep the old "cinder-abc" name
140+
// - If UniquePodNames didn't change, we keep the existing name
141+
if existingName != "" {
142+
return existingName, nil
143+
}
144+
145+
// No existing CR found owned by us - generate name based on current UniquePodNames setting
146+
// This handles:
147+
// - First time deployment
148+
// - Operator upgrade scenarios where ServiceName wasn't cached yet
149+
name, _ := r.GetServiceName(serviceName, true)
150+
if name == serviceName {
151+
// GetServiceName returned base name, meaning UID is not available
152+
return "", fmt.Errorf("unable to generate service name: no existing CR and UID not available")
153+
}
154+
return name, nil
155+
}
156+
64157
// ValidateCreate validates the OpenStackControlPlane on creation
65158
func (r *OpenStackControlPlane) ValidateCreate(ctx context.Context, c client.Client) (admission.Warnings, error) {
66159
openstackcontrolplanelog.Info("validate create", "name", r.Name)
@@ -293,7 +386,7 @@ func (r *OpenStackControlPlane) ValidateCreateServices(basePath *field.Path) (ad
293386
}
294387

295388
if r.Spec.Glance.Enabled {
296-
glanceName, _ := r.GetServiceName(GlanceName, r.Spec.Glance.UniquePodNames)
389+
glanceName, _ := r.GetServiceNameCached(GlanceName, r.Spec.Glance.UniquePodNames, r.Spec.Glance.ServiceName)
297390
for key, glanceAPI := range r.Spec.Glance.Template.GlanceAPIs {
298391
err := common_webhook.ValidateDNS1123Label(
299392
basePath.Child("glance").Child("template").Child("glanceAPIs"),
@@ -310,7 +403,7 @@ func (r *OpenStackControlPlane) ValidateCreateServices(basePath *field.Path) (ad
310403
}
311404

312405
if r.Spec.Cinder.Enabled {
313-
cinderName, _ := r.GetServiceName(CinderName, r.Spec.Cinder.UniquePodNames)
406+
cinderName, _ := r.GetServiceNameCached(CinderName, r.Spec.Cinder.UniquePodNames, r.Spec.Cinder.ServiceName)
314407
errs := common_webhook.ValidateDNS1123Label(
315408
basePath.Child("cinder").Child("template").Child("cinderVolumes"),
316409
maps.Keys(r.Spec.Cinder.Template.CinderVolumes),
@@ -477,7 +570,7 @@ func (r *OpenStackControlPlane) ValidateUpdateServices(old OpenStackControlPlane
477570
if old.Glance.Template == nil {
478571
old.Glance.Template = &glancev1.GlanceSpecCore{}
479572
}
480-
glanceName, _ := r.GetServiceName(GlanceName, r.Spec.Glance.UniquePodNames)
573+
glanceName, _ := r.GetServiceNameCached(GlanceName, r.Spec.Glance.UniquePodNames, r.Spec.Glance.ServiceName)
481574
for key, glanceAPI := range r.Spec.Glance.Template.GlanceAPIs {
482575
err := common_webhook.ValidateDNS1123Label(
483576
basePath.Child("glance").Child("template").Child("glanceAPIs"),
@@ -497,7 +590,7 @@ func (r *OpenStackControlPlane) ValidateUpdateServices(old OpenStackControlPlane
497590
if old.Cinder.Template == nil {
498591
old.Cinder.Template = &cinderv1.CinderSpecCore{}
499592
}
500-
cinderName, _ := r.GetServiceName(CinderName, r.Spec.Cinder.UniquePodNames)
593+
cinderName, _ := r.GetServiceNameCached(CinderName, r.Spec.Cinder.UniquePodNames, r.Spec.Cinder.ServiceName)
501594
errs := common_webhook.ValidateDNS1123Label(
502595
basePath.Child("cinder").Child("template").Child("cinderVolumes"),
503596
maps.Keys(r.Spec.Cinder.Template.CinderVolumes),

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260128074606-03b808364e4a
1717
github.com/openstack-k8s-operators/ironic-operator/api v0.6.1-0.20260126092810-cd39d45b6c0e
1818
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959
19-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb
19+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef
2020
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260126081203-efc2df9207eb
2121
github.com/openstack-k8s-operators/manila-operator/api v0.6.1-0.20260124125332-5046d6342e48
2222
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260127154438-ff95971883bb

api/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ github.com/openstack-k8s-operators/ironic-operator/api v0.6.1-0.20260126092810-c
132132
github.com/openstack-k8s-operators/ironic-operator/api v0.6.1-0.20260126092810-cd39d45b6c0e/go.mod h1:6Y/hPIhXYgV0NHe7ZWIo+bdBxhnWkjbv7VLZbFnLNrc=
133133
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959 h1:8FSpTYAoLq27ElDGe3igPl2QUq9IYD6RJGu2Xu+Ymus=
134134
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959/go.mod h1:pN/s+czXvApiE9nxeTtDeRTXWcaaCLZSrtoyOSUb37k=
135-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb h1:S7tnYO/E1f1KQfcp7N5bam8+ax/ExDTOhZ1WqG4Bfu0=
136-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb/go.mod h1:ndqfy1KbVorHH6+zlUFPIrCRhMSxO3ImYJUGaooE0x0=
135+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef h1:SgzLekXtZuApbRylC3unCXnMaUClT5FPuqsxzIjt3Go=
136+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef/go.mod h1:ndqfy1KbVorHH6+zlUFPIrCRhMSxO3ImYJUGaooE0x0=
137137
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35 h1:IdcI8DFvW8rXtchONSzbDmhhRp1YyO2YaBJDBXr44Gk=
138138
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35/go.mod h1:zOX7Y05keiSppIvLabuyh42QHBMhCcoskAtxFRbwXKo=
139139
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260126081203-efc2df9207eb h1:0kP9V1pKfRno6ss7qAy3GcfVK29CobWym6WA7AYA7wY=

bindata/crds/crds.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,8 @@ spec:
942942
enabled:
943943
default: true
944944
type: boolean
945+
serviceName:
946+
type: string
945947
template:
946948
properties:
947949
apiTimeout:
@@ -3914,6 +3916,8 @@ spec:
39143916
enabled:
39153917
default: true
39163918
type: boolean
3919+
serviceName:
3920+
type: string
39173921
template:
39183922
properties:
39193923
apiTimeout:

config/crd/bases/core.openstack.org_openstackcontrolplanes.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,8 @@ spec:
677677
enabled:
678678
default: true
679679
type: boolean
680+
serviceName:
681+
type: string
680682
template:
681683
properties:
682684
apiTimeout:
@@ -3649,6 +3651,8 @@ spec:
36493651
enabled:
36503652
default: true
36513653
type: boolean
3654+
serviceName:
3655+
type: string
36523656
template:
36533657
properties:
36543658
apiTimeout:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959
2424
github.com/openstack-k8s-operators/lib-common/modules/ansible v0.6.1-0.20260126081203-efc2df9207eb
2525
github.com/openstack-k8s-operators/lib-common/modules/certmanager v0.6.1-0.20260126081203-efc2df9207eb
26-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb
26+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef
2727
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260126081203-efc2df9207eb
2828
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260126081203-efc2df9207eb
2929
github.com/openstack-k8s-operators/manila-operator/api v0.6.1-0.20260124125332-5046d6342e48

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ github.com/openstack-k8s-operators/lib-common/modules/ansible v0.6.1-0.202601260
160160
github.com/openstack-k8s-operators/lib-common/modules/ansible v0.6.1-0.20260126081203-efc2df9207eb/go.mod h1:tXxVkkk8HlATwTmDA5RTP3b+c8apfuMM15mZ2wW5iNs=
161161
github.com/openstack-k8s-operators/lib-common/modules/certmanager v0.6.1-0.20260126081203-efc2df9207eb h1:pCyizgwvB2tgFGhGtAV5rXV0kSu9l5RoR2XA+Gd5BuY=
162162
github.com/openstack-k8s-operators/lib-common/modules/certmanager v0.6.1-0.20260126081203-efc2df9207eb/go.mod h1:chsg6x4P7376/8MlmsC3OiasuDatbOLwC5D5KRD9fbo=
163-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb h1:S7tnYO/E1f1KQfcp7N5bam8+ax/ExDTOhZ1WqG4Bfu0=
164-
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260126081203-efc2df9207eb/go.mod h1:ndqfy1KbVorHH6+zlUFPIrCRhMSxO3ImYJUGaooE0x0=
163+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef h1:SgzLekXtZuApbRylC3unCXnMaUClT5FPuqsxzIjt3Go=
164+
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260205083029-d03e9df035ef/go.mod h1:ndqfy1KbVorHH6+zlUFPIrCRhMSxO3ImYJUGaooE0x0=
165165
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35 h1:IdcI8DFvW8rXtchONSzbDmhhRp1YyO2YaBJDBXr44Gk=
166166
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35/go.mod h1:zOX7Y05keiSppIvLabuyh42QHBMhCcoskAtxFRbwXKo=
167167
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260126081203-efc2df9207eb h1:0kP9V1pKfRno6ss7qAy3GcfVK29CobWym6WA7AYA7wY=

internal/openstack/cinder.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
99
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
1010
"github.com/openstack-k8s-operators/lib-common/modules/common/service"
11+
"github.com/openstack-k8s-operators/lib-common/modules/common/webhook"
1112

1213
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1314

@@ -21,8 +22,16 @@ import (
2122

2223
// ReconcileCinder -
2324
func ReconcileCinder(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (ctrl.Result, error) {
24-
cinderName, altCinderName := instance.GetServiceName(corev1beta1.CinderName, instance.Spec.Cinder.UniquePodNames)
25-
// Ensure the alternate cinder CR doesn't exist, as the ramdomPodNames flag may have been toggled
25+
Log := GetLogger(ctx)
26+
27+
// Trigger webhook to cache service name if UniquePodNames is enabled and not yet cached
28+
// This handles operator upgrade scenario where existing CRs don't have ServiceName set
29+
if instance.Spec.Cinder.UniquePodNames && instance.Spec.Cinder.ServiceName == "" {
30+
return webhook.EnsureWebhookTrigger(ctx, instance, corev1beta1.ReconcileTriggerAnnotation, "Cinder service name caching", Log, 0)
31+
}
32+
33+
cinderName, altCinderName := instance.GetServiceNameCached(corev1beta1.CinderName, instance.Spec.Cinder.UniquePodNames, instance.Spec.Cinder.ServiceName)
34+
// Ensure the alternate cinder CR doesn't exist, as the randomPodNames flag may have been toggled
2635
cinder := &cinderv1.Cinder{
2736
ObjectMeta: metav1.ObjectMeta{
2837
Name: altCinderName,
@@ -52,7 +61,6 @@ func ReconcileCinder(ctx context.Context, instance *corev1beta1.OpenStackControl
5261
instance.Status.ContainerImages.CinderVolumeImages = make(map[string]*string)
5362
return ctrl.Result{}, nil
5463
}
55-
Log := GetLogger(ctx)
5664

5765
if instance.Spec.Cinder.Template == nil {
5866
instance.Spec.Cinder.Template = &cinderv1.CinderSpecCore{}

0 commit comments

Comments
 (0)