@@ -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,22 +99,47 @@ func (g *Generator) listRoutes(cr *imageregistryv1.Config) []Mutator {
97
99
return mutators
98
100
}
99
101
102
+ // getDriverCacheKey generates a cache key based on the storage configuration
103
+ func (g * Generator ) getDriverCacheKey (cr * imageregistryv1.Config ) string {
104
+ // Create a simple hash of the storage configuration to detect changes
105
+ storageConfig := fmt .Sprintf ("%+v" , cr .Spec .Storage )
106
+ return fmt .Sprintf ("%x" , hash (storageConfig ))
107
+ }
108
+
109
+ // hash creates a simple hash of a string
110
+ func hash (s string ) uint32 {
111
+ h := uint32 (0 )
112
+ for i := 0 ; i < len (s ); i ++ {
113
+ h = 31 * h + uint32 (s [i ])
114
+ }
115
+ return h
116
+ }
117
+
100
118
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." )
119
+ // Check if we need to refresh the cached driver
120
+ cacheKey := g .getDriverCacheKey (cr )
121
+ if g .driverCache == nil || g .driverCacheKey != cacheKey {
122
+ klog .V (2 ).Infof ("Creating new storage driver (cache miss or config changed)" )
123
+ driver , err := storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
124
+ if err != nil && err != storage .ErrStorageNotConfigured {
125
+ return nil , err
126
+ } else if err == storage .ErrStorageNotConfigured {
127
+ klog .V (6 ).Info ("storage not configured, some mutators might not work." )
128
+ }
129
+ g .driverCache = driver
130
+ g .driverCacheKey = cacheKey
131
+ } else {
132
+ klog .V (2 ).Infof ("Reusing cached storage driver" )
106
133
}
107
134
108
135
var mutators []Mutator
109
136
mutators = append (mutators , newGeneratorClusterRole (g .listers .ClusterRoles , g .clients .RBAC ))
110
137
mutators = append (mutators , newGeneratorClusterRoleBinding (g .listers .ClusterRoleBindings , g .clients .RBAC ))
111
138
mutators = append (mutators , newGeneratorServiceAccount (g .listers .ServiceAccounts , g .clients .Core ))
112
139
mutators = append (mutators , newGeneratorPullSecret (g .clients .Core ))
113
- mutators = append (mutators , newGeneratorSecret (g .listers .Secrets , g .clients .Core , driver ))
140
+ mutators = append (mutators , newGeneratorSecret (g .listers .Secrets , g .clients .Core , g . driverCache ))
114
141
mutators = append (mutators , newGeneratorService (g .listers .Services , g .clients .Core ))
115
- 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 ))
142
+ mutators = append (mutators , newGeneratorDeployment (g .eventRecorder , g .listers .Deployments , g .listers .ConfigMaps , g .listers .Secrets , g .listers .ProxyConfigs , g .clients .Core , g .clients .Apps , g . driverCache , cr ))
116
143
mutators = append (mutators , newGeneratorPodDisruptionBudget (g .listers .PodDisruptionBudgets , g .clients .Kube .PolicyV1 (), cr ))
117
144
mutators = append (mutators , g .listRoutes (cr )... )
118
145
@@ -127,23 +154,32 @@ func (g *Generator) List(cr *imageregistryv1.Config) ([]Mutator, error) {
127
154
// b.) see if we need to try to create the new storage
128
155
func (g * Generator ) syncStorage (cr * imageregistryv1.Config ) error {
129
156
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 )
157
+
158
+ // Use cached driver if available, otherwise create new one
159
+ cacheKey := g .getDriverCacheKey (cr )
160
+ if g .driverCache == nil || g .driverCacheKey != cacheKey {
161
+ klog .V (2 ).Infof ("Creating new storage driver for syncStorage (cache miss or config changed)" )
162
+ driver , err := storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
163
+ if err == storage .ErrStorageNotConfigured {
164
+ cr .Spec .Storage , _ , err = storage .GetPlatformStorage (& g .listers .StorageListers )
165
+ if err != nil {
166
+ return fmt .Errorf ("unable to get storage configuration from cluster install config: %s" , err )
167
+ }
168
+ driver , err = storage .NewDriver (& cr .Spec .Storage , g .kubeconfig , & g .listers .StorageListers , g .featureGateAccessor )
169
+ }
134
170
if err != nil {
135
- return fmt . Errorf ( "unable to get storage configuration from cluster install config: %s" , err )
171
+ return err
136
172
}
137
- driver , err = storage . NewDriver ( & cr . Spec . Storage , g . kubeconfig , & g . listers . StorageListers , g . featureGateAccessor )
138
- }
139
- if err != nil {
140
- return err
173
+ g . driverCache = driver
174
+ g . driverCacheKey = cacheKey
175
+ } else {
176
+ klog . V ( 2 ). Infof ( "Reusing cached storage driver for syncStorage" )
141
177
}
142
178
143
- if driver .StorageChanged (cr ) {
179
+ if g . driverCache .StorageChanged (cr ) {
144
180
runCreate = true
145
181
} else {
146
- exists , err := driver .StorageExists (cr )
182
+ exists , err := g . driverCache .StorageExists (cr )
147
183
if err != nil {
148
184
return err
149
185
}
@@ -154,7 +190,7 @@ func (g *Generator) syncStorage(cr *imageregistryv1.Config) error {
154
190
155
191
if runCreate {
156
192
reconf := g .storageReconfigured (cr , g .kubeconfig , g .listers )
157
- if err := driver .CreateStorage (cr ); err != nil {
193
+ if err := g . driverCache .CreateStorage (cr ); err != nil {
158
194
return err
159
195
}
160
196
if reconf {
0 commit comments