Skip to content

Commit 79e4466

Browse files
Yuriy TeodorovychYuriy Teodorovych
authored andcommitted
fix linter && address codeRabbit review
1 parent 7361ec8 commit 79e4466

2 files changed

Lines changed: 36 additions & 25 deletions

File tree

maas-api/internal/auth/cached_admin_checker.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package auth
22

33
import (
44
"context"
5+
"errors"
56
"slices"
67
"strings"
78
"sync"
89
"time"
910

1011
"github.com/prometheus/client_golang/prometheus"
11-
"github.com/prometheus/client_golang/prometheus/promauto"
1212
"k8s.io/utils/clock"
1313

1414
"github.com/opendatahub-io/models-as-a-service/maas-api/internal/token"
@@ -49,20 +49,19 @@ func NewCachedAdminChecker(delegate adminChecker, ttl time.Duration, reg prometh
4949
clk = clock.RealClock{}
5050
}
5151

52-
factory := promauto.With(reg)
5352
return &CachedAdminChecker{
5453
delegate: delegate,
5554
ttl: ttl,
5655
clock: clk,
5756
cache: make(map[string]cacheEntry),
58-
hits: factory.NewCounter(prometheus.CounterOpts{
57+
hits: registerOrReuseCounter(reg, prometheus.NewCounter(prometheus.CounterOpts{
5958
Name: "sar_cache_hits_total",
6059
Help: "Total number of SAR admin check cache hits.",
61-
}),
62-
misses: factory.NewCounter(prometheus.CounterOpts{
60+
})),
61+
misses: registerOrReuseCounter(reg, prometheus.NewCounter(prometheus.CounterOpts{
6362
Name: "sar_cache_misses_total",
6463
Help: "Total number of SAR admin check cache misses.",
65-
}),
64+
})),
6665
}
6766
}
6867

@@ -97,6 +96,7 @@ func (c *CachedAdminChecker) IsAdmin(ctx context.Context, user *token.UserContex
9796
return result
9897
}
9998

99+
//nolint:ireturn // Prometheus counters are inherently interface-typed; callers need Counter to read values.
100100
func (c *CachedAdminChecker) Metrics() (hits, misses prometheus.Counter) {
101101
return c.hits, c.misses
102102
}
@@ -109,6 +109,18 @@ func (c *CachedAdminChecker) evictExpiredLocked(now time.Time) {
109109
}
110110
}
111111

112+
func registerOrReuseCounter(reg prometheus.Registerer, c prometheus.Counter) prometheus.Counter {
113+
err := reg.Register(c)
114+
if err == nil {
115+
return c
116+
}
117+
var are prometheus.AlreadyRegisteredError
118+
if errors.As(err, &are) {
119+
return are.ExistingCollector.(prometheus.Counter)
120+
}
121+
panic(err)
122+
}
123+
112124
func cacheKey(user *token.UserContext) string {
113125
sorted := make([]string, len(user.Groups))
114126
copy(sorted, user.Groups)

maas-api/internal/auth/cached_admin_checker_test.go

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,21 @@ func (m *mockDelegate) getCalls() int {
3636
return m.calls
3737
}
3838

39-
func counterValue(c prometheus.Counter) float64 {
39+
func counterValue(t *testing.T, c prometheus.Counter) float64 {
40+
t.Helper()
4041
var m dto.Metric
41-
if err := c.(prometheus.Metric).Write(&m); err != nil {
42-
return 0
43-
}
42+
require.NoError(t, c.(prometheus.Metric).Write(&m))
4443
return m.GetCounter().GetValue()
4544
}
4645

47-
func newTestChecker(delegate *mockDelegate, ttl time.Duration) *auth.CachedAdminChecker {
46+
func newTestChecker(delegate *mockDelegate) *auth.CachedAdminChecker {
4847
reg := prometheus.NewRegistry()
49-
return auth.NewCachedAdminChecker(delegate, ttl, reg, nil)
48+
return auth.NewCachedAdminChecker(delegate, time.Minute, reg, nil)
5049
}
5150

5251
func TestCachedAdminChecker_CacheHit(t *testing.T) {
5352
delegate := &mockDelegate{response: true}
54-
checker := newTestChecker(delegate, time.Minute)
53+
checker := newTestChecker(delegate)
5554
user := &token.UserContext{Username: "alice", Groups: []string{"admins"}}
5655

5756
assert.True(t, checker.IsAdmin(context.Background(), user))
@@ -62,7 +61,7 @@ func TestCachedAdminChecker_CacheHit(t *testing.T) {
6261

6362
func TestCachedAdminChecker_CacheMiss(t *testing.T) {
6463
delegate := &mockDelegate{response: false}
65-
checker := newTestChecker(delegate, time.Minute)
64+
checker := newTestChecker(delegate)
6665
user := &token.UserContext{Username: "bob", Groups: []string{"users"}}
6766

6867
assert.False(t, checker.IsAdmin(context.Background(), user))
@@ -91,7 +90,7 @@ func TestCachedAdminChecker_TTLExpiry(t *testing.T) {
9190

9291
func TestCachedAdminChecker_DifferentUsers(t *testing.T) {
9392
delegate := &mockDelegate{response: true}
94-
checker := newTestChecker(delegate, time.Minute)
93+
checker := newTestChecker(delegate)
9594

9695
alice := &token.UserContext{Username: "alice", Groups: []string{"admins"}}
9796
bob := &token.UserContext{Username: "bob", Groups: []string{"admins"}}
@@ -104,7 +103,7 @@ func TestCachedAdminChecker_DifferentUsers(t *testing.T) {
104103

105104
func TestCachedAdminChecker_SameUserDifferentGroups(t *testing.T) {
106105
delegate := &mockDelegate{response: true}
107-
checker := newTestChecker(delegate, time.Minute)
106+
checker := newTestChecker(delegate)
108107

109108
adminAlice := &token.UserContext{Username: "alice", Groups: []string{"admins"}}
110109
userAlice := &token.UserContext{Username: "alice", Groups: []string{"users"}}
@@ -117,7 +116,7 @@ func TestCachedAdminChecker_SameUserDifferentGroups(t *testing.T) {
117116

118117
func TestCachedAdminChecker_GroupOrderIrrelevant(t *testing.T) {
119118
delegate := &mockDelegate{response: true}
120-
checker := newTestChecker(delegate, time.Minute)
119+
checker := newTestChecker(delegate)
121120

122121
user1 := &token.UserContext{Username: "alice", Groups: []string{"b", "a", "c"}}
123122
user2 := &token.UserContext{Username: "alice", Groups: []string{"c", "a", "b"}}
@@ -130,15 +129,15 @@ func TestCachedAdminChecker_GroupOrderIrrelevant(t *testing.T) {
130129

131130
func TestCachedAdminChecker_NilUserReturnsFalse(t *testing.T) {
132131
delegate := &mockDelegate{response: true}
133-
checker := newTestChecker(delegate, time.Minute)
132+
checker := newTestChecker(delegate)
134133

135134
assert.False(t, checker.IsAdmin(context.Background(), nil))
136135
assert.Equal(t, 0, delegate.getCalls())
137136
}
138137

139138
func TestCachedAdminChecker_EmptyUsernameReturnsFalse(t *testing.T) {
140139
delegate := &mockDelegate{response: true}
141-
checker := newTestChecker(delegate, time.Minute)
140+
checker := newTestChecker(delegate)
142141

143142
user := &token.UserContext{Username: "", Groups: []string{"admins"}}
144143
assert.False(t, checker.IsAdmin(context.Background(), user))
@@ -162,18 +161,18 @@ func TestCachedAdminChecker_Metrics(t *testing.T) {
162161
checker.IsAdmin(context.Background(), user)
163162

164163
hits, misses := checker.Metrics()
165-
assert.Equal(t, float64(0), counterValue(hits))
166-
assert.Equal(t, float64(1), counterValue(misses))
164+
assert.InDelta(t, 0, counterValue(t, hits), 0)
165+
assert.InDelta(t, 1, counterValue(t, misses), 0)
167166

168167
checker.IsAdmin(context.Background(), user)
169168

170-
assert.Equal(t, float64(1), counterValue(hits))
171-
assert.Equal(t, float64(1), counterValue(misses))
169+
assert.InDelta(t, 1, counterValue(t, hits), 0)
170+
assert.InDelta(t, 1, counterValue(t, misses), 0)
172171
}
173172

174173
func TestCachedAdminChecker_ConcurrentAccess(t *testing.T) {
175174
delegate := &mockDelegate{response: true}
176-
checker := newTestChecker(delegate, time.Minute)
175+
checker := newTestChecker(delegate)
177176

178177
user := &token.UserContext{Username: "alice", Groups: []string{"admins"}}
179178

@@ -209,7 +208,7 @@ func TestCachedAdminChecker_NonPositiveTTLPanics(t *testing.T) {
209208

210209
func TestCachedAdminChecker_FalseResultIsCached(t *testing.T) {
211210
delegate := &mockDelegate{response: false}
212-
checker := newTestChecker(delegate, time.Minute)
211+
checker := newTestChecker(delegate)
213212
user := &token.UserContext{Username: "alice", Groups: []string{"users"}}
214213

215214
assert.False(t, checker.IsAdmin(context.Background(), user))

0 commit comments

Comments
 (0)