Skip to content

Commit 38ae245

Browse files
committed
feat: list available endpoints in /statusz for kubelet
1 parent 1e04b17 commit 38ae245

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

pkg/kubelet/server/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ func (a *filteringContainer) Handle(path string, handler http.Handler) {
160160
a.HandleWithFilter(path, handler)
161161
a.registeredHandlePaths = append(a.registeredHandlePaths, path)
162162
}
163+
163164
func (a *filteringContainer) RegisteredHandlePaths() []string {
164165
return a.registeredHandlePaths
165166
}
@@ -576,7 +577,7 @@ func (s *Server) InstallAuthRequiredHandlers() {
576577

577578
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) {
578579
s.addMetricsBucketMatcher("statusz")
579-
statusz.Install(s.restfulCont, ComponentKubelet, statusz.NewRegistry(compatibility.DefaultBuildEffectiveVersion()))
580+
statusz.Install(s.restfulCont, ComponentKubelet, statusz.NewRegistry(compatibility.DefaultBuildEffectiveVersion(), statusz.WithListedPaths(s.restfulCont.RegisteredHandlePaths())))
580581
}
581582

582583
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {

pkg/kubelet/server/server_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"net/http/httputil"
2929
"net/url"
3030
"reflect"
31+
"regexp"
3132
"strconv"
3233
"strings"
3334
"testing"
@@ -1832,6 +1833,33 @@ func TestTrimURLPath(t *testing.T) {
18321833
}
18331834
}
18341835

1836+
func TestComponentStatusz(t *testing.T) {
1837+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, zpagesfeatures.ComponentStatusz, true)
1838+
fw := newServerTest()
1839+
defer fw.testHTTPServer.Close()
1840+
1841+
req, err := http.NewRequest(http.MethodGet, fw.testHTTPServer.URL+"/statusz", nil)
1842+
require.NoError(t, err)
1843+
req.Header.Set("Accept", "text/plain")
1844+
resp, err := http.DefaultClient.Do(req)
1845+
assert.NoError(t, err)
1846+
defer resp.Body.Close()
1847+
1848+
respByte, err := io.ReadAll(resp.Body)
1849+
assert.NoError(t, err)
1850+
assert.Equal(t, http.StatusOK, resp.StatusCode)
1851+
respStr := string(respByte)
1852+
statuszPathOutput := regexp.MustCompile("Paths.*\n").FindString(respStr)
1853+
assert.NotEqual(t, "", statuszPathOutput, "/statusz response should contain 'Paths' line")
1854+
listedPaths := regexp.MustCompile("/\\S+").FindAllString(statuszPathOutput, -1)
1855+
assert.NotEmpty(t, listedPaths, "/statusz response should contain listed paths when ComponentStatusz feature gate enabled")
1856+
for _, path := range listedPaths {
1857+
resp, err := http.Get(fw.testHTTPServer.URL + path)
1858+
assert.NoError(t, err)
1859+
assert.Equal(t, http.StatusOK, resp.StatusCode, "/statusz provided listed paths should return 200 status code")
1860+
}
1861+
}
1862+
18351863
func TestFineGrainedAuthz(t *testing.T) {
18361864
// Enable features.ContainerCheckpoint during test
18371865
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.KubeletFineGrainedAuthz, true)

0 commit comments

Comments
 (0)