Skip to content

Commit cbe0530

Browse files
committed
BUG/MEDIUM: prometheus: remove prometheus from user defined mapping
prometheus should only be allowed to be read from controller admin port, not on the same frontent as normal traffic
1 parent 02035e8 commit cbe0530

File tree

4 files changed

+161
-106
lines changed

4 files changed

+161
-106
lines changed

go.mod

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/haproxytech/kubernetes-ingress
33
go 1.24.0
44

55
require (
6+
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5
67
github.com/Masterminds/semver/v3 v3.4.0
78
github.com/fasthttp/router v1.5.4
89
github.com/go-openapi/swag v0.23.1
@@ -38,6 +39,7 @@ require (
3839
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
3940
github.com/fsnotify/fsnotify v1.9.0 // indirect
4041
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
42+
github.com/go-faker/faker/v4 v4.6.1 // indirect
4143
github.com/go-logr/logr v1.4.3 // indirect
4244
github.com/go-openapi/analysis v0.23.0 // indirect
4345
github.com/go-openapi/errors v0.22.1 // indirect
@@ -75,14 +77,14 @@ require (
7577
go.mongodb.org/mongo-driver v1.17.4 // indirect
7678
go.yaml.in/yaml/v2 v2.4.2 // indirect
7779
go.yaml.in/yaml/v3 v3.0.4 // indirect
78-
golang.org/x/net v0.41.0 // indirect
80+
golang.org/x/net v0.42.0 // indirect
7981
golang.org/x/oauth2 v0.30.0 // indirect
80-
golang.org/x/sync v0.15.0 // indirect
81-
golang.org/x/sys v0.33.0 // indirect
82-
golang.org/x/term v0.32.0 // indirect
83-
golang.org/x/text v0.26.0 // indirect
82+
golang.org/x/sync v0.16.0 // indirect
83+
golang.org/x/sys v0.34.0 // indirect
84+
golang.org/x/term v0.33.0 // indirect
85+
golang.org/x/text v0.27.0 // indirect
8486
golang.org/x/time v0.12.0 // indirect
85-
golang.org/x/tools v0.34.0 // indirect
87+
golang.org/x/tools v0.35.0 // indirect
8688
google.golang.org/protobuf v1.36.6 // indirect
8789
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
8890
gopkg.in/inf.v0 v0.9.1 // indirect

go.sum

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI=
2+
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec=
13
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
24
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
35
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
@@ -22,8 +24,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S
2224
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
2325
github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU=
2426
github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
25-
github.com/go-faker/faker/v4 v4.5.0 h1:ARzAY2XoOL9tOUK+KSecUQzyXQsUaZHefjyF8x6YFHc=
26-
github.com/go-faker/faker/v4 v4.5.0/go.mod h1:p3oq1GRjG2PZ7yqeFFfQI20Xm61DoBDlCA8RiSyZ48M=
27+
github.com/go-faker/faker/v4 v4.6.1 h1:xUyVpAjEtB04l6XFY0V/29oR332rOSPWV4lU8RwDt4k=
28+
github.com/go-faker/faker/v4 v4.6.1/go.mod h1:arSdxNCSt7mOhdk8tEolvHeIJ7eX4OX80wXjKKvkKBY=
2729
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
2830
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
2931
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
@@ -173,34 +175,34 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
173175
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
174176
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
175177
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
176-
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
177-
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
178+
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
179+
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
178180
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
179181
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
180182
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
181183
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
182184
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
183-
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
184-
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
185+
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
186+
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
185187
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
186188
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
187189
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
188-
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
189-
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
190-
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
191-
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
190+
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
191+
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
192+
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
193+
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
192194
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
193195
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
194-
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
195-
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
196+
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
197+
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
196198
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
197199
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
198200
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
199201
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
200202
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
201203
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
202-
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
203-
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
204+
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
205+
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
204206
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
205207
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
206208
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

pkg/controller/builder.go

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,15 @@
1515
package controller
1616

1717
import (
18+
"bytes"
19+
"encoding/base64"
1820
"errors"
21+
"log"
1922
"os"
2023
"strconv"
2124

25+
"github.com/GehirnInc/crypt"
26+
_ "github.com/GehirnInc/crypt/sha256_crypt"
2227
"github.com/fasthttp/router"
2328
"github.com/prometheus/client_golang/prometheus/promhttp"
2429
"github.com/valyala/fasthttp"
@@ -209,7 +214,7 @@ func addControllerMetricData(builder *Builder, chShutdown chan struct{}) {
209214
runningServices += " pprof"
210215
}
211216
if builder.osArgs.PrometheusEnabled {
212-
rtr.GET(handler.PROMETHEUS_URL_PATH, fasthttpadaptor.NewFastHTTPHandler(promhttp.Handler()))
217+
rtr.GET(handler.PROMETHEUS_URL_PATH, prometheusHandler())
213218
runningServices += ", prometheus"
214219
}
215220
rtr.GET("/healtz", requestHandler)
@@ -268,3 +273,62 @@ func requestHandler(ctx *fasthttp.RequestCtx) {
268273
ctx.Response.Header.Set("X-HAProxy-Ingress-Controller", "healtz")
269274
}
270275
}
276+
277+
func prometheusHandler() func(ctx *fasthttp.RequestCtx) {
278+
prometheusHandler := fasthttpadaptor.NewFastHTTPHandler(promhttp.Handler())
279+
return func(ctx *fasthttp.RequestCtx) {
280+
authActive := handler.PrometheusAuthActive()
281+
if !authActive {
282+
prometheusHandler(ctx)
283+
return
284+
}
285+
286+
auth := ctx.Request.Header.Peek("Authorization")
287+
if auth == nil {
288+
ctx.Response.Header.Set("WWW-Authenticate", `Basic realm="Restricted"`)
289+
ctx.SetStatusCode(fasthttp.StatusUnauthorized)
290+
return
291+
}
292+
293+
const prefix = "Basic "
294+
if !bytes.HasPrefix(auth, []byte(prefix)) {
295+
ctx.SetStatusCode(fasthttp.StatusUnauthorized)
296+
return
297+
}
298+
299+
encoded := auth[len(prefix):]
300+
decoded, err := base64.StdEncoding.DecodeString(string(encoded))
301+
if err != nil {
302+
ctx.SetStatusCode(fasthttp.StatusUnauthorized)
303+
return
304+
}
305+
306+
parts := bytes.SplitN(decoded, []byte{':'}, 2)
307+
if len(parts) != 2 {
308+
ctx.SetStatusCode(fasthttp.StatusUnauthorized)
309+
return
310+
}
311+
312+
crypter := crypt.SHA256.New()
313+
users := handler.PrometheusAuthUsers()
314+
userOK := false
315+
for user, passwordData := range users {
316+
if user != string(parts[0]) {
317+
continue
318+
}
319+
computed, err := crypter.Generate(parts[1], []byte(passwordData.Salt))
320+
if err != nil {
321+
log.Printf("Error during comparison: %v", err)
322+
}
323+
if computed == passwordData.Password {
324+
userOK = true
325+
break
326+
}
327+
}
328+
if !userOK {
329+
ctx.SetStatusCode(fasthttp.StatusUnauthorized)
330+
return
331+
}
332+
prometheusHandler(ctx)
333+
}
334+
}

pkg/handler/prometheus.go

Lines changed: 72 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package handler
33
import (
44
"fmt"
55
"strings"
6+
"sync"
67

78
"github.com/haproxytech/kubernetes-ingress/pkg/annotations"
89
"github.com/haproxytech/kubernetes-ingress/pkg/haproxy"
9-
"github.com/haproxytech/kubernetes-ingress/pkg/haproxy/instance"
1010
k8ssync "github.com/haproxytech/kubernetes-ingress/pkg/k8s/sync"
1111
"github.com/haproxytech/kubernetes-ingress/pkg/store"
1212
)
@@ -16,29 +16,69 @@ type PrometheusEndpoint struct {
1616
PodNs string
1717
}
1818

19+
var (
20+
prometheusUsers map[string]prometheusAuthUser
21+
prometheusUsersActive bool
22+
prometheusMu sync.RWMutex
23+
)
24+
1925
//nolint:golint, stylecheck
2026
const (
2127
PROMETHEUS_URL_PATH = "/metrics"
2228
PROMETHEUS_SERVICE_NAME = "prometheus"
2329
)
2430

31+
type prometheusAuthUser struct {
32+
Password string
33+
Salt string
34+
}
35+
36+
func PrometheusAuthUsers() map[string]prometheusAuthUser {
37+
prometheusMu.RLock()
38+
defer prometheusMu.RUnlock()
39+
users := make(map[string]prometheusAuthUser, len(prometheusUsers))
40+
for user, passwordData := range prometheusUsers {
41+
users[user] = prometheusAuthUser{
42+
Password: passwordData.Password,
43+
Salt: passwordData.Salt,
44+
}
45+
}
46+
return users
47+
}
48+
49+
func PrometheusAuthActive() bool {
50+
prometheusMu.RLock()
51+
defer prometheusMu.RUnlock()
52+
return prometheusUsersActive
53+
}
54+
2555
func (handler PrometheusEndpoint) Update(k store.K8s, h haproxy.HAProxy, a annotations.Annotations) (err error) {
2656
if handler.PodNs == "" {
27-
return
57+
return nil
2858
}
2959

30-
prometheusSvcName := "prometheus"
31-
prometheusBackendName := fmt.Sprintf("%s_svc_%s_http", handler.PodNs, PROMETHEUS_SERVICE_NAME)
32-
33-
status := store.EMPTY
3460
var secret *store.Secret
35-
_, errBackend := h.BackendGet(prometheusBackendName)
36-
backendExists := errBackend == nil
3761

3862
annSecret := annotations.String("prometheus-endpoint-auth-secret", k.ConfigMaps.Main.Annotations)
39-
var secretExists, secretChanged, userListChanged bool
40-
userListExists, _ := h.UserListExistsByGroup("haproxy-controller-prometheus")
63+
prometheusMu.RLock()
64+
prometheusUsersActiveLocal := prometheusUsersActive
65+
prometheusMu.RUnlock()
66+
67+
if annSecret != "" && !prometheusUsersActiveLocal {
68+
prometheusMu.Lock()
69+
prometheusUsersActive = true
70+
prometheusMu.Unlock()
71+
} else if annSecret == "" && prometheusUsersActiveLocal {
72+
prometheusMu.Lock()
73+
prometheusUsersActive = false
74+
prometheusUsers = nil
75+
prometheusMu.Unlock()
76+
}
77+
if annSecret == "" {
78+
return nil
79+
}
4180

81+
var secretExists bool
4282
// Does the secret exist in store ? ...
4383
if annSecret != "" {
4484
secretFQN := strings.Split(annSecret, "/")
@@ -47,87 +87,34 @@ func (handler PrometheusEndpoint) Update(k store.K8s, h haproxy.HAProxy, a annot
4787
if ns != nil {
4888
secret = ns.Secret[secretFQN[1]]
4989
secretExists = secret != nil && secret.Status != store.DELETED
50-
secretChanged = secret.Status == store.MODIFIED
5190
}
5291
}
53-
userListChanged = secretChanged || !userListExists
54-
} else {
55-
userListChanged = userListExists
56-
}
57-
58-
if !backendExists {
59-
status = store.ADDED
60-
}
61-
62-
if !userListChanged && status == store.EMPTY && (!secretExists || (secretExists && secret.Status == store.EMPTY)) {
63-
return
64-
}
65-
66-
svc := &store.Service{
67-
Namespace: handler.PodNs,
68-
Name: prometheusSvcName,
69-
Status: status,
70-
Annotations: k.ConfigMaps.Main.Annotations,
71-
Ports: []store.ServicePort{
72-
{
73-
Name: "http",
74-
Protocol: "http",
75-
Port: 8765,
76-
Status: status,
77-
},
78-
},
79-
Faked: true,
80-
}
81-
endpoints := &store.Endpoints{
82-
Namespace: handler.PodNs,
83-
Service: prometheusSvcName,
84-
SliceName: prometheusSvcName,
85-
Status: status,
86-
Ports: map[string]*store.PortEndpoints{
87-
"http": {
88-
Port: int64(h.Env.ControllerPort),
89-
Addresses: map[string]struct{}{"127.0.0.1": {}},
90-
},
91-
},
92-
}
93-
94-
if status != store.EMPTY {
95-
k.EventService(k.GetNamespace(svc.Namespace), svc)
96-
k.EventEndpoints(k.GetNamespace(endpoints.Namespace), endpoints, func(*store.RuntimeBackend, bool) error { return nil })
97-
}
98-
99-
ing := &store.Ingress{
100-
Status: status,
101-
Faked: true,
102-
IngressCore: store.IngressCore{
103-
Namespace: handler.PodNs,
104-
Name: "prometheus",
105-
Rules: map[string]*store.IngressRule{"": {
106-
Paths: map[string]*store.IngressPath{
107-
PROMETHEUS_URL_PATH: {
108-
SvcNamespace: svc.Namespace,
109-
SvcName: svc.Name,
110-
Path: PROMETHEUS_URL_PATH,
111-
SvcPortString: "http",
112-
PathTypeMatch: store.PATH_TYPE_IMPLEMENTATION_SPECIFIC,
113-
},
114-
},
115-
}},
116-
},
11792
}
11893

11994
if secretExists {
120-
ing.Annotations = map[string]string{
121-
"auth-type": "basic-auth",
122-
"auth-secret": annSecret,
95+
// first see if we need to do something
96+
prometheusMu.RLock()
97+
// prometheusUsers != nil, not len, there is a diff in logic
98+
if secret.Status == store.EMPTY && prometheusUsers != nil {
99+
prometheusMu.RUnlock()
100+
return nil
123101
}
102+
prometheusMu.RUnlock()
103+
104+
// then fill users if needed
105+
prometheusMu.Lock()
106+
prometheusUsers = make(map[string]prometheusAuthUser)
107+
for user, password := range secret.Data {
108+
partsPass := strings.Split(string(password), "$")
109+
salt := fmt.Sprintf("$%s$%s$", partsPass[1], partsPass[2])
110+
prometheusUsers[user] = prometheusAuthUser{
111+
Password: string(password),
112+
Salt: salt,
113+
}
114+
logger.Debugf("Adding prometheus user '%s' from secret '%s'", user, annSecret)
115+
}
116+
prometheusUsersActive = true
117+
prometheusMu.Unlock()
124118
}
125-
126-
if userListChanged || status != store.EMPTY || secretExists && secret.Status != store.EMPTY {
127-
k.EventIngress(k.GetNamespace(ing.Namespace), ing, "fakeUID", "fakeResourceVersion")
128-
}
129-
130-
instance.ReloadIf(status != store.EMPTY, "creation/modification of prometheus endpoint")
131-
132119
return nil
133120
}

0 commit comments

Comments
 (0)