@@ -10,6 +10,7 @@ import (
1010
1111 "altinn.studio/runner-org-sync/internal/cdn"
1212 "altinn.studio/runner-org-sync/internal/gitea"
13+ "altinn.studio/runner-org-sync/internal/k8sstate"
1314 corev1 "k8s.io/api/core/v1"
1415 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1516)
@@ -43,7 +44,7 @@ func (m *stubMinter) MintRegistrationToken(_ context.Context, org string) (strin
4344
4445type stubStore struct {
4546 managed []corev1.Secret
46- existsByName map [string ]bool
47+ statusByName map [string ]k8sstate. RegistrationSecretState
4748 createErr map [string ]error
4849 deleteErr map [string ]error
4950 applyCMErr error
@@ -58,7 +59,7 @@ type stubStore struct {
5859
5960func newStubStore () * stubStore {
6061 return & stubStore {
61- existsByName : map [string ]bool {},
62+ statusByName : map [string ]k8sstate. RegistrationSecretState {},
6263 createErr : map [string ]error {},
6364 deleteErr : map [string ]error {},
6465 createdOrgs : map [string ]string {},
@@ -70,11 +71,14 @@ func (s *stubStore) ListManagedSecrets(_ context.Context) ([]corev1.Secret, erro
7071 return s .managed , s .listErr
7172}
7273
73- func (s * stubStore ) SecretExists (_ context.Context , name string ) (bool , error ) {
74+ func (s * stubStore ) RegistrationSecretStatus (_ context.Context , name , _ string ) (k8sstate. RegistrationSecretState , error ) {
7475 if s .existsErr != nil {
75- return false , s .existsErr
76+ return "" , s .existsErr
7677 }
77- return s .existsByName [name ], nil
78+ if status , ok := s .statusByName [name ]; ok {
79+ return status , nil
80+ }
81+ return k8sstate .RegistrationSecretMissing , nil
7882}
7983
8084func (s * stubStore ) CreateRegistrationSecret (_ context.Context , name , org , _ string ) error {
@@ -83,7 +87,7 @@ func (s *stubStore) CreateRegistrationSecret(_ context.Context, name, org, _ str
8387 }
8488 s .createdSecrets = append (s .createdSecrets , name )
8589 s .createdOrgs [name ] = org
86- s .existsByName [name ] = true
90+ s .statusByName [name ] = k8sstate . RegistrationSecretValid
8791 return nil
8892}
8993
@@ -190,8 +194,8 @@ func TestRun_IdempotentReRun(t *testing.T) {
190194 minter := & stubMinter {}
191195 store := newStubStore ()
192196 // pre-populate existing state — secrets exist for both orgs and we own them.
193- store .existsByName ["altinn-gitea-runner-ttd-secret" ] = true
194- store .existsByName ["altinn-gitea-runner-brg-secret" ] = true
197+ store .statusByName ["altinn-gitea-runner-ttd-secret" ] = k8sstate . RegistrationSecretValid
198+ store .statusByName ["altinn-gitea-runner-brg-secret" ] = k8sstate . RegistrationSecretValid
195199 store .managed = []corev1.Secret {
196200 managedSecret ("altinn-gitea-runner-ttd-secret" , "ttd" ),
197201 managedSecret ("altinn-gitea-runner-brg-secret" , "brg" ),
@@ -226,8 +230,8 @@ func TestRun_OrgAdded(t *testing.T) {
226230 }}
227231 minter := & stubMinter {}
228232 store := newStubStore ()
229- store .existsByName ["altinn-gitea-runner-ttd-secret" ] = true
230- store .existsByName ["altinn-gitea-runner-brg-secret" ] = true
233+ store .statusByName ["altinn-gitea-runner-ttd-secret" ] = k8sstate . RegistrationSecretValid
234+ store .statusByName ["altinn-gitea-runner-brg-secret" ] = k8sstate . RegistrationSecretValid
231235 store .managed = []corev1.Secret {
232236 managedSecret ("altinn-gitea-runner-ttd-secret" , "ttd" ),
233237 managedSecret ("altinn-gitea-runner-brg-secret" , "brg" ),
@@ -254,8 +258,8 @@ func TestRun_OrgRemoved(t *testing.T) {
254258 }}
255259 minter := & stubMinter {}
256260 store := newStubStore ()
257- store .existsByName ["altinn-gitea-runner-ttd-secret" ] = true
258- store .existsByName ["altinn-gitea-runner-brg-secret" ] = true
261+ store .statusByName ["altinn-gitea-runner-ttd-secret" ] = k8sstate . RegistrationSecretValid
262+ store .statusByName ["altinn-gitea-runner-brg-secret" ] = k8sstate . RegistrationSecretValid
259263 store .managed = []corev1.Secret {
260264 managedSecret ("altinn-gitea-runner-ttd-secret" , "ttd" ),
261265 managedSecret ("altinn-gitea-runner-brg-secret" , "brg" ),
@@ -347,6 +351,30 @@ func TestRun_GiteaPartialFailure(t *testing.T) {
347351 }
348352}
349353
354+ func TestRun_InvalidExistingSecretIsNotProjected (t * testing.T ) {
355+ src := & stubSource {orgs : []cdn.Org {
356+ {Code : "ttd" , Environments : []string {"tt02" }},
357+ }}
358+ minter := & stubMinter {}
359+ store := newStubStore ()
360+ store .statusByName ["altinn-gitea-runner-ttd-secret" ] = k8sstate .RegistrationSecretInvalid
361+
362+ rep := runReconciler (t , src , minter , store , []string {"ttd" }, false )
363+
364+ if rep .Outcome != OutcomePartial {
365+ t .Errorf ("outcome = %v, want partial" , rep .Outcome )
366+ }
367+ if len (rep .FailedOrgs ) != 1 || rep .FailedOrgs [0 ].Org != "ttd" || rep .FailedOrgs [0 ].Stage != StageValidate {
368+ t .Errorf ("FailedOrgs = %v, want [{ttd validate ...}]" , rep .FailedOrgs )
369+ }
370+ if len (minter .calls ) != 0 {
371+ t .Errorf ("minter should not be called when same-name invalid secret exists; got %v" , minter .calls )
372+ }
373+ if got := store .appliedCMData [ConfigMapDataKey ]; got != "[]\n " {
374+ t .Errorf ("ConfigMap body = %q, want empty runner list" , got )
375+ }
376+ }
377+
350378// --- additional coverage ----------------------------------------------------
351379
352380// Auth failures hit every org with the same PAT — failing fast avoids a
@@ -449,7 +477,7 @@ func TestRun_SyncAllSkipsWhitelist(t *testing.T) {
449477func TestRun_UnlabelledManagedSecretIsSkippedOnDelete (t * testing.T ) {
450478 src := & stubSource {orgs : []cdn.Org {{Code : "ttd" , Environments : []string {"tt02" }}}}
451479 store := newStubStore ()
452- store .existsByName ["altinn-gitea-runner-ttd-secret" ] = true
480+ store .statusByName ["altinn-gitea-runner-ttd-secret" ] = k8sstate . RegistrationSecretValid
453481 store .managed = []corev1.Secret {
454482 managedSecret ("altinn-gitea-runner-ttd-secret" , "ttd" ),
455483 // drift: managed-by label but no org label
0 commit comments