Multitenancy
Il package pkg/multitenant fornisce un registro in-memory tenant-to-client per l'SDK Aruba Cloud. E utile quando la tua applicazione gestisce piu tenant e ogni tenant richiede un proprio aruba.Client.
Panoramica
Il package espone:
- Un'interfaccia
Multitenantper creare, salvare, recuperare e pulire i client tenant - Un'implementazione predefinita basata su mappa e mutex
- Un helper per routine di cleanup periodico dei tenant inattivi
File principali:
pkg/multitenant/multitenant.gopkg/multitenant/cleanup_routine.go
Interfaccia Principale
L'interfaccia Multitenant supporta queste operazioni:
New(tenant string) error: crea client usando opzioni templateNewFromOptions(tenant string, options *aruba.Options) error: crea client da opzioni espliciteAdd(tenant string, client aruba.Client): aggiunge un client gia inizializzatoGet(tenant string) (aruba.Client, bool): recupera client con flag di esistenzaMustGet(tenant string) aruba.Client: recupera o termina il processo se assenteGetOrNil(tenant string) aruba.Client: recupera o restituiscenilCleanUp(from time.Duration): elimina tenant inattivi
Creazione del Manager
Manager vuoto
Usalo quando vuoi aggiungere client manualmente o tramite NewFromOptions:
mt := multitenant.New()
Manager con template
Usalo quando i tenant condividono una configurazione base comune:
opts := aruba.DefaultOptions(clientID, clientSecret)
mt := multitenant.NewWithTemplate(opts)
// In seguito:
if err := mt.New("tenant-a"); err != nil {
// gestisci errore
}
Pattern di Utilizzo
Aggiungere un client esistente
client, err := aruba.NewClient(aruba.DefaultOptions(clientID, clientSecret))
if err != nil {
// gestisci errore
}
mt.Add("tenant-a", client)
Creare da opzioni specifiche tenant
tenantOpts := aruba.DefaultOptions(tenantClientID, tenantClientSecret)
if err := mt.NewFromOptions("tenant-a", tenantOpts); err != nil {
// gestisci errore
}
Recuperare un client
client, ok := mt.Get("tenant-a")
if !ok {
// tenant non trovato
}
Se richiedi esistenza obbligatoria:
client := mt.MustGet("tenant-a")
Cleanup Automatico
Il package include anche StartCleanupRoutine in cleanup_routine.go. Esegue CleanUp periodicamente in una goroutine in background.
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
stopCleanup := multitenant.StartCleanupRoutine(
ctx,
mt,
5*time.Minute, // intervallo di esecuzione
24*time.Hour, // rimuove tenant inattivi da 24h
)
defer stopCleanup()
Valori di default:
tickInterval: 1 ora se zero/negativofromDuration: 24 ore se zero/negativo
Note
- Implementazione in-memory, locale al processo.
- Ciclo di vita tenant basato su
lastUsage. CleanUprimuove anche entry non valide (nilentry/client).
Esempio di Utilizzo (examples/all-resources/orchestrator_multitenancy.go)
Per un esempio completo vedi:
examples/all-resources/orchestrator_multitenancy.go
Snippet principale (cache + credenziali Vault per tenant):
c, ok := r.multiTenantClient.Get(tenant)
if ok {
return c, nil
}
options := aruba.NewOptions().
WithBaseURL(r.config.APIGateway).
WithDefaultTokenIssuerURL().
WithVaultCredentialsRepository(
r.config.VaultAddress,
r.config.KVMount,
tenant, // tenant -> kvPath (es. ARU-297647)
r.config.Namespace,
r.config.RolePath,
r.config.RoleID,
r.config.RoleSecret,
)
client, err := aruba.NewClient(options)
if err != nil {
return nil, err
}
r.multiTenantClient.Add(tenant, client)
return client, nil