K8sSecret Credentials Provider
Watches a Kubernetes secret which contains a token and publishes updates when the secret changes.
Package pkg/k8ssecret. Snippets assume the common setup; Channel Behavior explains the result channel.
import ( "go.riptides.io/tokenex/pkg/k8ssecret" "go.riptides.io/tokenex/pkg/credential" "sigs.k8s.io/controller-runtime/pkg/cache")
// Assume you have already initialized a Kubernetes client and cache// This typically involves:// 1. Getting a Kubernetes config (config.GetConfig())// 2. Creating a controller-runtime cache (cache.New())// 3. Starting the cache (cache.Start(ctx))k8sCache := yourInitializedCache
// Create the K8sSecret credentials providerk8sProvider, err := k8ssecret.NewCredentialsProvider(ctx, k8sCache)if err != nil { log.Fatalf("Failed to create K8sSecret credentials provider: %v", err)}
// Define the secret referencesecretRef := k8ssecret.SecretRef{ Name: "token-secret", Namespace: "default", Key: "token",}
// Get credentials from the Kubernetes secretk8sCredsChan, err := k8sProvider.GetCredentials(ctx, secretRef)if err != nil { log.Fatalf("Failed to get K8sSecret credentials: %v", err)}
// Process credentials from the channel in a goroutine with proper context handlingwg.Add(1)go func() { defer wg.Done() for { select { case creds, ok := <-k8sCredsChan: if !ok { log.Println("K8sSecret credentials channel closed") return } if creds.Err != nil { log.Printf("Error: %v", creds.Err) return }
k8sCreds := creds.Credential.(*credential.Oauth2Creds) log.Printf("Token: %s", k8sCreds.AccessToken) // Use the token...
case <-ctx.Done(): log.Println("Context cancelled, shutting down K8sSecret credentials handler") return } }}()