@@ -2,6 +2,7 @@ package metrics
22
33import (
44 "context"
5+ "fmt"
56 "strings"
67 "time"
78
@@ -252,11 +253,17 @@ func (a *credRequestAccumulator) processCR(cr *credreqv1.CredentialsRequest, cco
252253
253254 isPodIdentity , err := credRequestIsPodIdentity (cr , cloudType , a .kubeClient )
254255 if err != nil {
255- a .logger .WithError (err ).Error ("failed to determine whether CredentialsRequest is of type STS " )
256+ a .logger .WithError (err ).WithField ( "credentialsRequest" , cr . Name ). Error ("failed to determine whether CredentialsRequest is of type pod identity " )
256257 }
257258
258259 if isPodIdentity {
259260 a .podIdentityCredentials ++
261+ a .logger .WithFields (log.Fields {
262+ "credentialsRequest" : cr .Name ,
263+ "namespace" : cr .Namespace ,
264+ "cloudType" : cloudType ,
265+ "secretRef" : fmt .Sprintf ("%s/%s" , cr .Spec .SecretRef .Namespace , cr .Spec .SecretRef .Name ),
266+ }).Debug ("detected pod identity credentials" )
260267 }
261268
262269 // Skip reporting conditions if CCO is disabled, as we shouldn't be alerting in that case, except for stale credentials.
@@ -364,21 +371,51 @@ func (a *credRequestAccumulator) setMetrics() {
364371}
365372
366373func credRequestIsPodIdentity (cr * credreqv1.CredentialsRequest , cloudType string , kubeClient client.Client ) (bool , error ) {
374+ // Check if SecretRef is set
375+ if cr .Spec .SecretRef .Name == "" || cr .Spec .SecretRef .Namespace == "" {
376+ log .WithFields (log.Fields {
377+ "credentialsRequest" : cr .Name ,
378+ }).Debug ("keys Name or Namespace is null" )
379+ return false , nil
380+ }
381+
367382 secretKey := types.NamespacedName {Name : cr .Spec .SecretRef .Name , Namespace : cr .Spec .SecretRef .Namespace }
368383 secret := & corev1.Secret {}
369384
370385 err := kubeClient .Get (context .TODO (), secretKey , secret )
371386 if errors .IsNotFound (err ) {
372387 // Secret for CredReq doesn't exist so we can't query it
388+ log .WithFields (log.Fields {
389+ "credentialsRequest" : cr .Name ,
390+ "secretName" : secret .Name ,
391+ "secretNamespace" : secret .Namespace ,
392+ }).Debug ("AWS secret not found" )
373393 return false , nil
374394 } else if err != nil {
395+ log .WithFields (log.Fields {
396+ "credentialsRequest" : cr .Name ,
397+ "secretName" : secret .Name ,
398+ "secretNamespace" : secret .Namespace ,
399+ }).Debug ("AWS secret not loaded due to other error" )
375400 return false , err
376401 }
377402
378403 switch cloudType {
379404 case "AWSProviderSpec" :
380405 secretData , ok := secret .Data [constants .AWSSecretDataCredentialsKey ]
381406 if ! ok {
407+ // Log available keys for debugging
408+ availableKeys := make ([]string , 0 , len (secret .Data ))
409+ for k := range secret .Data {
410+ availableKeys = append (availableKeys , k )
411+ }
412+ log .WithFields (log.Fields {
413+ "credentialsRequest" : cr .Name ,
414+ "secretName" : secret .Name ,
415+ "secretNamespace" : secret .Namespace ,
416+ "expectedKey" : constants .AWSSecretDataCredentialsKey ,
417+ "availableKeys" : availableKeys ,
418+ }).Debug ("AWS secret missing expected credentials key" )
382419 return false , nil
383420 }
384421
@@ -388,10 +425,35 @@ func credRequestIsPodIdentity(cr *credreqv1.CredentialsRequest, cloudType string
388425 return true , nil
389426 }
390427
428+ // Log for debugging when AWS secret doesn't contain STS indicators
429+ preview := string (secretData )
430+ if len (preview ) > 100 {
431+ preview = preview [:100 ] + "..."
432+ }
433+ log .WithFields (log.Fields {
434+ "credentialsRequest" : cr .Name ,
435+ "secretName" : secret .Name ,
436+ "secretNamespace" : secret .Namespace ,
437+ "secretDataPreview" : preview ,
438+ }).Debug ("AWS secret does not contain web_identity_token_file, not STS credentials" )
439+
391440 return false , nil
392441 case "AzureProviderSpec" :
393442 _ , ok := secret .Data [azure .AzureFederatedTokenFile ]
394443 return ok , nil
444+ case "GCPProviderSpec" :
445+ secretData , ok := secret .Data ["service_account.json" ]
446+ if ! ok {
447+ return false , nil
448+ }
449+
450+ // external_account type is a clear indicator that the credentials
451+ // are configured for GCP Workload Identity Federation (WIF)
452+ if strings .Contains (string (secretData ), "external_account" ) {
453+ return true , nil
454+ }
455+
456+ return false , nil
395457 default :
396458 return false , nil
397459 }
0 commit comments