Skip to content

Commit 38db935

Browse files
author
Niklas Burchhardt
committed
update deletion logic + adjust unit tests for this
- delete RRSet if challengeKey is the only record, or there are no records - remove the record if theres more records - do nothing if challengeKey is not existing in the RRSet
1 parent c3ca932 commit 38db935

File tree

2 files changed

+80
-20
lines changed

2 files changed

+80
-20
lines changed

internal/resolver/resolver.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"net/http"
88
"os"
9+
"slices"
910
"strings"
1011

1112
"github.com/cert-manager/cert-manager/pkg/acme/webhook"
@@ -97,7 +98,7 @@ func (s *stackitDnsProviderResolver) CleanUp(ch *v1alpha1.ChallengeRequest) erro
9798
return s.handleErrorDuringInitialization(err)
9899
}
99100

100-
return s.handleRRSetCleanup(initResolverRes)
101+
return s.handleRRSetCleanup(initResolverRes, ch.Key)
101102
}
102103

103104
// Initialize will be called when the webhook first starts.
@@ -287,6 +288,7 @@ func (s *stackitDnsProviderResolver) handleErrorDuringInitialization(
287288

288289
func (s *stackitDnsProviderResolver) handleRRSetCleanup(
289290
initResolverRes *initResolverContextResult,
291+
challengeKey string,
290292
) error {
291293
s.logger.Info("Cleaning up RRSet", zap.String("rrSetName", initResolverRes.rrSetName))
292294

@@ -299,7 +301,27 @@ func (s *stackitDnsProviderResolver) handleRRSetCleanup(
299301
return s.handleFetchRRSetError(err, initResolverRes.rrSetName)
300302
}
301303

302-
return s.deleteRRSet(initResolverRes.rrSetRepository, rrSet, initResolverRes.rrSetName)
304+
if rrSet == nil || rrSet.Records == nil || len(*rrSet.Records) == 0 {
305+
return s.deleteRRSet(initResolverRes.rrSetRepository, rrSet, initResolverRes.rrSetName)
306+
}
307+
308+
originalLen := len(*rrSet.Records)
309+
310+
*rrSet.Records = slices.DeleteFunc(*rrSet.Records, func(r stackitdnsclient.Record) bool {
311+
return r.Content != nil && *r.Content == challengeKey
312+
})
313+
314+
if len(*rrSet.Records) == originalLen {
315+
s.logger.Info("Challenge key not found in RRSet records, nothing to clean up", zap.String("rrSetName", initResolverRes.rrSetName))
316+
317+
return nil
318+
}
319+
320+
if len(*rrSet.Records) == 0 {
321+
return s.deleteRRSet(initResolverRes.rrSetRepository, rrSet, initResolverRes.rrSetName)
322+
}
323+
324+
return initResolverRes.rrSetRepository.UpdateRRSet(s.ctx, *rrSet)
303325
}
304326

305327
func (s *stackitDnsProviderResolver) handleFetchRRSetError(err error, rrSetName string) error {

internal/resolver/resolver_test.go

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ var (
2727
}
2828
)
2929

30+
const (
31+
targetKey = "delete-me"
32+
keepKey = "keep-me"
33+
)
34+
3035
func TestName(t *testing.T) {
3136
t.Parallel()
3237

@@ -601,56 +606,89 @@ func (s *cleanSuite) TestFailFetchNoRRSet() {
601606
s.NoError(err)
602607
}
603608

604-
func (s *cleanSuite) TestFailDeleteNoRRSet() {
609+
func (s *cleanSuite) TestCleanUp_RemovesOnlyKey_DeletesRRSet() {
605610
s.setupCommonMocks()
611+
612+
req := &v1alpha1.ChallengeRequest{
613+
Config: configJson,
614+
Key: targetKey,
615+
}
616+
606617
rrset := stackitdnsclient_new.RecordSet{
607618
Id: toPtr("1234"),
619+
Records: &[]stackitdnsclient_new.Record{
620+
{Content: toPtr(targetKey)},
621+
},
608622
}
623+
609624
s.mockRRSetRepository.EXPECT().
610625
FetchRRSetForZone(gomock.Any(), gomock.Any(), gomock.Any()).
611626
Return(&rrset, nil)
627+
628+
// Because it was the only key, the slice becomes empty, so we expect a DeleteRRSet
612629
s.mockRRSetRepository.EXPECT().
613630
DeleteRRSet(gomock.Any(), *rrset.Id).
614-
Return(repository.ErrRRSetNotFound)
631+
Return(nil)
615632

616-
err := s.resolver.CleanUp(challengeRequest)
633+
err := s.resolver.CleanUp(req)
617634
s.NoError(err)
618635
}
619636

620-
func (s *cleanSuite) TestFailDeleteRRSet() {
637+
func (s *cleanSuite) TestCleanUp_RemovesOneKey_UpdatesRRSet() {
621638
s.setupCommonMocks()
639+
640+
req := &v1alpha1.ChallengeRequest{
641+
Config: configJson,
642+
Key: targetKey,
643+
}
644+
622645
rrset := stackitdnsclient_new.RecordSet{
623646
Id: toPtr("1234"),
647+
Records: &[]stackitdnsclient_new.Record{
648+
{Content: toPtr(targetKey)},
649+
{Content: toPtr(keepKey)},
650+
},
624651
}
652+
625653
s.mockRRSetRepository.EXPECT().
626654
FetchRRSetForZone(gomock.Any(), gomock.Any(), gomock.Any()).
627655
Return(&rrset, nil)
656+
657+
// Because one key remains, we expect an UpdateRRSet, NOT a DeleteRRSet
628658
s.mockRRSetRepository.EXPECT().
629-
DeleteRRSet(gomock.Any(), *rrset.Id).
630-
Return(fmt.Errorf("error deleting rr set"))
659+
UpdateRRSet(gomock.Any(), matchedBy(func(updated stackitdnsclient_new.RecordSet) bool {
660+
return updated.Records != nil &&
661+
len(*updated.Records) == 1 &&
662+
*(*updated.Records)[0].Content == keepKey
663+
})).
664+
Return(nil)
631665

632-
err := s.resolver.CleanUp(challengeRequest)
633-
s.Error(err)
634-
s.Containsf(
635-
err.Error(),
636-
"error deleting rr set",
637-
"error message should contain error from rrSetRepository",
638-
)
666+
err := s.resolver.CleanUp(req)
667+
s.NoError(err)
639668
}
640669

641-
func (s *cleanSuite) TestSuccessDeleteRRSet() {
670+
func (s *cleanSuite) TestCleanUp_KeyNotFound_DoesNothing() {
642671
s.setupCommonMocks()
672+
673+
req := &v1alpha1.ChallengeRequest{
674+
Config: configJson,
675+
Key: targetKey,
676+
}
677+
643678
rrset := stackitdnsclient_new.RecordSet{
644679
Id: toPtr("1234"),
680+
Records: &[]stackitdnsclient_new.Record{
681+
{Content: toPtr(keepKey)},
682+
},
645683
}
684+
646685
s.mockRRSetRepository.EXPECT().
647686
FetchRRSetForZone(gomock.Any(), gomock.Any(), gomock.Any()).
648687
Return(&rrset, nil)
649-
s.mockRRSetRepository.EXPECT().
650-
DeleteRRSet(gomock.Any(), *rrset.Id).
651-
Return(nil)
652688

653-
err := s.resolver.CleanUp(challengeRequest)
689+
// We do NOT expect DeleteRRSet or UpdateRRSet to be called.
690+
691+
err := s.resolver.CleanUp(req)
654692
s.NoError(err)
655693
}
656694

0 commit comments

Comments
 (0)