Skip to content

Commit d772578

Browse files
committed
wip
Signed-off-by: Bryan Cox <[email protected]>
1 parent 5969417 commit d772578

File tree

3 files changed

+75
-21
lines changed

3 files changed

+75
-21
lines changed

pkg/resource/generator.go

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ type Generator struct {
8282
listers *client.Listers
8383
clients *client.Clients
8484
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
8587
}
8688

8789
func (g *Generator) listRoutes(cr *imageregistryv1.Config) []Mutator {
@@ -97,22 +99,47 @@ func (g *Generator) listRoutes(cr *imageregistryv1.Config) []Mutator {
9799
return mutators
98100
}
99101

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+
100118
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")
106133
}
107134

108135
var mutators []Mutator
109136
mutators = append(mutators, newGeneratorClusterRole(g.listers.ClusterRoles, g.clients.RBAC))
110137
mutators = append(mutators, newGeneratorClusterRoleBinding(g.listers.ClusterRoleBindings, g.clients.RBAC))
111138
mutators = append(mutators, newGeneratorServiceAccount(g.listers.ServiceAccounts, g.clients.Core))
112139
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))
114141
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))
116143
mutators = append(mutators, newGeneratorPodDisruptionBudget(g.listers.PodDisruptionBudgets, g.clients.Kube.PolicyV1(), cr))
117144
mutators = append(mutators, g.listRoutes(cr)...)
118145

@@ -127,23 +154,32 @@ func (g *Generator) List(cr *imageregistryv1.Config) ([]Mutator, error) {
127154
// b.) see if we need to try to create the new storage
128155
func (g *Generator) syncStorage(cr *imageregistryv1.Config) error {
129156
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+
}
134170
if err != nil {
135-
return fmt.Errorf("unable to get storage configuration from cluster install config: %s", err)
171+
return err
136172
}
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")
141177
}
142178

143-
if driver.StorageChanged(cr) {
179+
if g.driverCache.StorageChanged(cr) {
144180
runCreate = true
145181
} else {
146-
exists, err := driver.StorageExists(cr)
182+
exists, err := g.driverCache.StorageExists(cr)
147183
if err != nil {
148184
return err
149185
}
@@ -154,7 +190,7 @@ func (g *Generator) syncStorage(cr *imageregistryv1.Config) error {
154190

155191
if runCreate {
156192
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 {
158194
return err
159195
}
160196
if reconf {

pkg/storage/azure/azure.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ func NewDriver(ctx context.Context, c *imageregistryv1.ImageRegistryConfigStorag
334334
}
335335

336336
func (d *driver) newAzClient(cfg *Azure, environment autorestazure.Environment, tagset map[string]*string) (*azureclient.Client, error) {
337+
klog.V(2).Infof("Creating new azureclient with shared credential cache: %p", &d.azureCredentials)
338+
337339
client, err := azureclient.New(&azureclient.Options{
338340
Environment: environment,
339341
TenantID: cfg.TenantID,
@@ -343,6 +345,7 @@ func (d *driver) newAzClient(cfg *Azure, environment autorestazure.Environment,
343345
SubscriptionID: cfg.SubscriptionID,
344346
TagSet: tagset,
345347
Policies: d.policies,
348+
CredentialCache: &d.azureCredentials, // Share the driver's credential cache
346349
})
347350
if err != nil {
348351
return nil, err

pkg/storage/azure/azureclient/azureclient.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type Options struct {
5151
TagSet map[string]*string
5252
Policies []policy.Policy
5353
Creds azcore.TokenCredential
54+
CredentialCache *sync.Map // Optional external credential cache to share across instances
5455
}
5556

5657
type PrivateEndpointCreateOptions struct {
@@ -97,6 +98,13 @@ func New(opts *Options) (*Client, error) {
9798
}, nil
9899
}
99100

101+
func (c *Client) getCredentialCache() *sync.Map {
102+
if c.opts.CredentialCache != nil {
103+
return c.opts.CredentialCache
104+
}
105+
return &c.azureCredentials
106+
}
107+
100108
func (c *Client) getCreds(ctx context.Context) (azcore.TokenCredential, error) {
101109
if c.creds != nil {
102110
return c.creds, nil
@@ -110,9 +118,14 @@ func (c *Client) getCreds(ctx context.Context) (azcore.TokenCredential, error) {
110118
if userAssignedIdentityCredentialsFilePath != "" {
111119
var ok bool
112120

121+
// Use shared credential cache if available
122+
credCache := c.getCredentialCache()
123+
klog.V(2).Infof("Using credential cache: %p", credCache)
124+
113125
// We need to only store the Azure credentials once and reuse them after that.
114-
storedCreds, found := c.azureCredentials.Load(azureCredentialsKey)
126+
storedCreds, found := credCache.Load(azureCredentialsKey)
115127
if !found {
128+
klog.V(2).Infof("Cache miss - creating new credentials")
116129
klog.V(2).Info("Using UserAssignedIdentityCredentials for Azure authentication for managed Azure HCP")
117130
clientOptions := azcore.ClientOptions{
118131
Cloud: c.clientOpts.Cloud,
@@ -121,8 +134,10 @@ func (c *Client) getCreds(ctx context.Context) (azcore.TokenCredential, error) {
121134
if err != nil {
122135
return nil, err
123136
}
124-
c.azureCredentials.Store(azureCredentialsKey, creds)
137+
credCache.Store(azureCredentialsKey, creds)
138+
klog.V(2).Infof("Stored credentials in cache: %p", creds)
125139
} else {
140+
klog.V(2).Infof("Cache hit - reusing existing credentials")
126141
creds, ok = storedCreds.(azcore.TokenCredential)
127142
if !ok {
128143
return nil, fmt.Errorf("expected %T to be a TokenCredential", storedCreds)

0 commit comments

Comments
 (0)