From 550304020facfc20c1830577e1545c8a5f001ea4 Mon Sep 17 00:00:00 2001 From: Santiago Greco Date: Wed, 10 Jun 2026 13:40:45 +0200 Subject: [PATCH 1/3] OCPBUGS-87348: Fix ConfigMapSyncDegraded when cloud.openshift.com is absent from pull-secret --- pkg/console/operator/sync_v400.go | 3 +++ pkg/console/telemetry/telemetry.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/console/operator/sync_v400.go b/pkg/console/operator/sync_v400.go index c6a65cdbe..ee69977ab 100644 --- a/pkg/console/operator/sync_v400.go +++ b/pkg/console/operator/sync_v400.go @@ -481,6 +481,9 @@ func (co *consoleOperator) GetTelemetryConfiguration(ctx context.Context, operat if err != nil { return nil, err } + if accessToken == "" { + return telemetryConfig, nil + } organizationID, accountMail, refreshCache := telemetry.GetOrganizationMeta(telemetryConfig, co.trackables.organizationID, co.trackables.accountMail, clusterID, accessToken) // cache fetched ORGANIZATION_ID and ACCOUNT_MAIL if refreshCache { diff --git a/pkg/console/telemetry/telemetry.go b/pkg/console/telemetry/telemetry.go index 0c2b18ac9..7b3f3cd7b 100644 --- a/pkg/console/telemetry/telemetry.go +++ b/pkg/console/telemetry/telemetry.go @@ -87,7 +87,7 @@ func GetAccessToken(secretsLister v1.SecretLister) (string, error) { } authsBytes, ok := config.Auths["cloud.openshift.com"] if !ok { - return "", fmt.Errorf("failed to parse 'cloud.openshift.com' field from pull-secret") + return "", nil } return authsBytes.Auth, nil } From 34e37dad3d47d20c83f7452a5669b69321b52d86 Mon Sep 17 00:00:00 2001 From: Santiago Greco Date: Wed, 10 Jun 2026 13:40:58 +0200 Subject: [PATCH 2/3] OCPBUGS-87348: Add unit tests for GetAccessToken Assisted-by: Claude Opus 4.6 (1M context) --- pkg/console/telemetry/telemetry_test.go | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/pkg/console/telemetry/telemetry_test.go b/pkg/console/telemetry/telemetry_test.go index 2ce56d7e0..bf1bd5870 100644 --- a/pkg/console/telemetry/telemetry_test.go +++ b/pkg/console/telemetry/telemetry_test.go @@ -3,6 +3,13 @@ package telemetry import ( "testing" "time" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1listers "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" + + "github.com/openshift/console-operator/pkg/api" ) // Helpers to set rate-limit timestamps and restore after test @@ -18,6 +25,49 @@ func withLastSuccessTime(t *testing.T, ts time.Time) { t.Cleanup(func() { lastSuccessTime = prev }) } +func newFakeSecretLister(t *testing.T, secrets ...*corev1.Secret) corev1listers.SecretLister { + t.Helper() + indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) + for _, s := range secrets { + if err := indexer.Add(s.DeepCopy()); err != nil { + t.Fatalf("failed to add secret to indexer: %v", err) + } + } + return corev1listers.NewSecretLister(indexer) +} + +func TestGetAccessToken_MissingCloudEntry(t *testing.T) { + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: PullSecretName, Namespace: api.OpenShiftConfigNamespace}, + Data: map[string][]byte{".dockerconfigjson": []byte(`{"auths":{}}`)}, + } + lister := newFakeSecretLister(t, secret) + + token, err := GetAccessToken(lister) + if err != nil { + t.Fatalf("expected no error for missing cloud.openshift.com, got: %v", err) + } + if token != "" { + t.Fatalf("expected empty token, got %q", token) + } +} + +func TestGetAccessToken_PresentCloudEntry(t *testing.T) { + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: PullSecretName, Namespace: api.OpenShiftConfigNamespace}, + Data: map[string][]byte{".dockerconfigjson": []byte(`{"auths":{"cloud.openshift.com":{"auth":"my-token"}}}`)}, + } + lister := newFakeSecretLister(t, secret) + + token, err := GetAccessToken(lister) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if token != "my-token" { + t.Fatalf("expected %q, got %q", "my-token", token) + } +} + func TestGetOrganizationMeta_UsesCustomOverrides(t *testing.T) { telemetryConfig := map[string]string{ "ORGANIZATION_ID": "org-custom", From e688db2694d51744b2603dd964638718e8e4441c Mon Sep 17 00:00:00 2001 From: Santiago Greco Date: Wed, 10 Jun 2026 15:51:30 +0200 Subject: [PATCH 3/3] OCPBUGS-87348: Fix error logging and import grouping per review feedback Assisted-by: Claude Sonnet 4.6 --- pkg/console/telemetry/telemetry.go | 4 ++-- pkg/console/telemetry/telemetry_test.go | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/console/telemetry/telemetry.go b/pkg/console/telemetry/telemetry.go index 7b3f3cd7b..e51d7cea3 100644 --- a/pkg/console/telemetry/telemetry.go +++ b/pkg/console/telemetry/telemetry.go @@ -82,8 +82,8 @@ func GetAccessToken(secretsLister v1.SecretLister) (string, error) { var config DockerConfig err = json.Unmarshal(configBytes, &config) if err != nil { - fmt.Println("Error decoding JSON:", err) - return "", err + klog.Errorf("error decoding pull-secret JSON: %v", err) + return "", fmt.Errorf("error decoding pull-secret JSON: %w", err) } authsBytes, ok := config.Auths["cloud.openshift.com"] if !ok { diff --git a/pkg/console/telemetry/telemetry_test.go b/pkg/console/telemetry/telemetry_test.go index bf1bd5870..5de13fc42 100644 --- a/pkg/console/telemetry/telemetry_test.go +++ b/pkg/console/telemetry/telemetry_test.go @@ -1,14 +1,17 @@ package telemetry import ( + // standard lib "testing" "time" + // kube corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1listers "k8s.io/client-go/listers/core/v1" "k8s.io/client-go/tools/cache" + // operator "github.com/openshift/console-operator/pkg/api" )