@@ -15,14 +15,14 @@ import (
15
15
"k8s.io/klog/v2"
16
16
17
17
imageregistryv1 "github.com/openshift/api/imageregistry/v1"
18
- "github.com/openshift/library-go/pkg/operator/configobserver/featuregates"
19
- "github.com/openshift/library-go/pkg/operator/events"
20
18
21
19
"github.com/openshift/cluster-image-registry-operator/pkg/client"
22
20
"github.com/openshift/cluster-image-registry-operator/pkg/defaults"
23
21
"github.com/openshift/cluster-image-registry-operator/pkg/metrics"
24
22
"github.com/openshift/cluster-image-registry-operator/pkg/resource/object"
25
23
"github.com/openshift/cluster-image-registry-operator/pkg/storage"
24
+ "github.com/openshift/library-go/pkg/operator/configobserver/featuregates"
25
+ "github.com/openshift/library-go/pkg/operator/events"
26
26
)
27
27
28
28
func ApplyMutator (gen Mutator ) error {
@@ -82,6 +82,8 @@ type Generator struct {
82
82
listers * client.Listers
83
83
clients * client.Clients
84
84
featureGateAccessor featuregates.FeatureGateAccess
85
+ driverCache storage.Driver // Cache the storage driver to avoid repeated credential loading
86
+ driverCacheKey string // Cache key to track when driver needs refresh
85
87
}
86
88
87
89
func (g * Generator ) listRoutes (cr * imageregistryv1.Config ) []Mutator {
@@ -97,19 +99,72 @@ func (g *Generator) listRoutes(cr *imageregistryv1.Config) []Mutator {
97
99
return mutators
98
100
}
99
101
102
+ // getDriverCacheKey generates a cache key based on credential-related configuration only
103
+ func (g * Generator ) getDriverCacheKey (cr * imageregistryv1.Config ) string {
104
+ // Only cache for Azure storage since that's where the credential loading issue occurs
105
+ if cr .Spec .Storage .Azure != nil {
106
+ // For Azure, we want to cache the driver to avoid repeated credential loading
107
+ // The credentials come from secrets/environment variables, not the storage config
108
+ // So we only care if Azure storage is configured
109
+ stableConfig := "azure"
110
+ cacheKey := fmt .Sprintf ("%x" , hash (stableConfig ))
111
+ klog .V (2 ).Infof ("Cache key generated: %s (Azure storage configured)" , cacheKey )
112
+ return cacheKey
113
+ }
114
+
115
+ // For non-Azure storage, return empty string to indicate no caching needed
116
+ return ""
117
+ }
118
+
119
+ // hash creates a simple hash of a string
120
+ func hash (s string ) uint32 {
121
+ h := uint32 (0 )
122
+ for i := 0 ; i < len (s ); i ++ {
123
+ h = 31 * h + uint32 (s [i ])
124
+ }
125
+ return h
126
+ }
127
+
100
128
func (g * Generator ) List (cr * imageregistryv1.Config ) ([]Mutator , error ) {
101
- driver , err := storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
102
- if err != nil && err != storage .ErrStorageNotConfigured {
103
- return nil , err
104
- } else if err == storage .ErrStorageNotConfigured {
105
- klog .V (6 ).Info ("storage not configured, some mutators might not work." )
129
+ // Check if we need to refresh the cached driver (only for Azure)
130
+ cacheKey := g .getDriverCacheKey (cr )
131
+ if cacheKey != "" {
132
+ // Only cache for Azure storage
133
+ if g .driverCache == nil || g .driverCacheKey != cacheKey {
134
+ klog .V (2 ).Infof ("Creating new storage driver (cache miss or config changed). Old key: %s, New key: %s" , g .driverCacheKey , cacheKey )
135
+ driver , err := storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
136
+ if err != nil && err != storage .ErrStorageNotConfigured {
137
+ return nil , err
138
+ } else if err == storage .ErrStorageNotConfigured {
139
+ klog .V (6 ).Info ("storage not configured, some mutators might not work." )
140
+ }
141
+ g .driverCache = driver
142
+ g .driverCacheKey = cacheKey
143
+ } else {
144
+ klog .V (2 ).Infof ("Reusing cached storage driver (cache key: %s)" , cacheKey )
145
+ }
106
146
}
107
147
108
148
var mutators []Mutator
109
149
mutators = append (mutators , newGeneratorClusterRole (g .listers .ClusterRoles , g .clients .RBAC ))
110
150
mutators = append (mutators , newGeneratorClusterRoleBinding (g .listers .ClusterRoleBindings , g .clients .RBAC ))
111
151
mutators = append (mutators , newGeneratorServiceAccount (g .listers .ServiceAccounts , g .clients .Core ))
112
152
mutators = append (mutators , newGeneratorPullSecret (g .clients .Core ))
153
+
154
+ // Use cached driver for Azure, create new one for others
155
+ var driver storage.Driver
156
+ if cacheKey != "" && g .driverCache != nil {
157
+ driver = g .driverCache
158
+ } else {
159
+ var err error
160
+ driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
161
+ if err != nil && err != storage .ErrStorageNotConfigured {
162
+ return nil , err
163
+ } else if err == storage .ErrStorageNotConfigured {
164
+ klog .V (6 ).Info ("storage not configured, some mutators might not work." )
165
+ }
166
+ }
167
+
113
168
mutators = append (mutators , newGeneratorSecret (g .listers .Secrets , g .clients .Core , driver ))
114
169
mutators = append (mutators , newGeneratorService (g .listers .Services , g .clients .Core ))
115
170
mutators = append (mutators , newGeneratorDeployment (g .eventRecorder , g .listers .Deployments , g .listers .ConfigMaps , g .listers .Secrets , g .listers .ProxyConfigs , g .clients .Core , g .clients .Apps , driver , cr ))
@@ -127,17 +182,48 @@ func (g *Generator) List(cr *imageregistryv1.Config) ([]Mutator, error) {
127
182
// b.) see if we need to try to create the new storage
128
183
func (g * Generator ) syncStorage (cr * imageregistryv1.Config ) error {
129
184
var runCreate bool
130
- // Create a driver with the current configuration
131
- driver , err := storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
132
- if err == storage .ErrStorageNotConfigured {
133
- cr .Spec .Storage , _ , err = storage .GetPlatformStorage (& g .listers .StorageListers )
134
- if err != nil {
135
- return fmt .Errorf ("unable to get storage configuration from cluster install config: %s" , err )
185
+
186
+ // Check if we need to refresh the cached driver (only for Azure)
187
+ cacheKey := g .getDriverCacheKey (cr )
188
+ var driver storage.Driver
189
+
190
+ if cacheKey != "" {
191
+ // Only cache for Azure storage
192
+ if g .driverCache == nil || g .driverCacheKey != cacheKey {
193
+ klog .V (2 ).Infof ("Creating new storage driver for syncStorage (cache miss or config changed). Old key: %s, New key: %s" , g .driverCacheKey , cacheKey )
194
+ var err error
195
+ driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
196
+ if err == storage .ErrStorageNotConfigured {
197
+ cr .Spec .Storage , _ , err = storage .GetPlatformStorage (& g .listers .StorageListers )
198
+ if err != nil {
199
+ return fmt .Errorf ("unable to get storage configuration from cluster install config: %s" , err )
200
+ }
201
+ driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
202
+ }
203
+ if err != nil {
204
+ return err
205
+ }
206
+ g .driverCache = driver
207
+ g .driverCacheKey = cacheKey
208
+ } else {
209
+ klog .V (2 ).Infof ("Reusing cached storage driver for syncStorage (cache key: %s)" , cacheKey )
210
+ driver = g .driverCache
136
211
}
212
+ } else {
213
+ // For non-Azure storage, create new driver (no caching needed)
214
+ klog .V (2 ).Infof ("Creating new storage driver for syncStorage (non-Azure storage)" )
215
+ var err error
137
216
driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
138
- }
139
- if err != nil {
140
- return err
217
+ if err == storage .ErrStorageNotConfigured {
218
+ cr .Spec .Storage , _ , err = storage .GetPlatformStorage (& g .listers .StorageListers )
219
+ if err != nil {
220
+ return fmt .Errorf ("unable to get storage configuration from cluster install config: %s" , err )
221
+ }
222
+ driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
223
+ }
224
+ if err != nil {
225
+ return err
226
+ }
141
227
}
142
228
143
229
if driver .StorageChanged (cr ) {
0 commit comments