Skip to content

Commit 70c0193

Browse files
committed
Add GetMaxAPIVersion to get max supported API
1 parent 698c8a6 commit 70c0193

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

client/nginx.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,23 @@ func versionSupported(n int) bool {
610610
return false
611611
}
612612

613+
// GetMaxAPIVersion returns the maximum API version supported by the server and the client.
614+
func (client *NginxClient) GetMaxAPIVersion() (int, error) {
615+
serverVersions, err := client.getAPIVersions(client.httpClient, client.apiEndpoint)
616+
if err != nil {
617+
return 0, fmt.Errorf("failed to get max API version: %w", err)
618+
}
619+
620+
maxServerVersion := slices.Max(*serverVersions)
621+
maxClientVersion := slices.Max(supportedAPIVersions)
622+
623+
if maxServerVersion > maxClientVersion {
624+
return maxClientVersion, nil
625+
}
626+
627+
return maxServerVersion, nil
628+
}
629+
613630
func (client *NginxClient) getAPIVersions(httpClient *http.Client, endpoint string) (*versions, error) {
614631
ctx, cancel := context.WithTimeout(context.Background(), client.ctxTimeout)
615632
defer cancel()

client/nginx_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,3 +752,67 @@ func TestGetStats_SSL(t *testing.T) {
752752
t.Fatalf("SSL stats: expected %v, actual %v", testStats, stats.SSL)
753753
}
754754
}
755+
756+
func TestGetMaxAPIVersionServer(t *testing.T) {
757+
t.Parallel()
758+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
759+
switch {
760+
case r.RequestURI == "/":
761+
_, err := w.Write([]byte(`[4, 5, 6, 7]`))
762+
if err != nil {
763+
t.Fatalf("unexpected error: %v", err)
764+
}
765+
default:
766+
_, err := w.Write([]byte(`{}`))
767+
if err != nil {
768+
t.Fatalf("unexpected error: %v", err)
769+
}
770+
}
771+
}))
772+
defer ts.Close()
773+
774+
c, err := NewNginxClient(ts.URL)
775+
if err != nil {
776+
t.Fatalf("unexpected error: %v", err)
777+
}
778+
779+
maxVer, err := c.GetMaxAPIVersion()
780+
if err != nil {
781+
t.Fatalf("unexpected error: %v", err)
782+
}
783+
if maxVer != 7 {
784+
t.Fatalf("expected 7, got %v", maxVer)
785+
}
786+
}
787+
788+
func TestGetMaxAPIVersionClient(t *testing.T) {
789+
t.Parallel()
790+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
791+
switch {
792+
case r.RequestURI == "/":
793+
_, err := w.Write([]byte(`[4, 5, 6, 7, 8, 9, 25]`))
794+
if err != nil {
795+
t.Fatalf("unexpected error: %v", err)
796+
}
797+
default:
798+
_, err := w.Write([]byte(`{}`))
799+
if err != nil {
800+
t.Fatalf("unexpected error: %v", err)
801+
}
802+
}
803+
}))
804+
defer ts.Close()
805+
806+
c, err := NewNginxClient(ts.URL)
807+
if err != nil {
808+
t.Fatalf("unexpected error: %v", err)
809+
}
810+
811+
maxVer, err := c.GetMaxAPIVersion()
812+
if err != nil {
813+
t.Fatalf("unexpected error: %v", err)
814+
}
815+
if maxVer != c.apiVersion {
816+
t.Fatalf("expected %v, got %v", c.apiVersion, maxVer)
817+
}
818+
}

docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# syntax=docker/dockerfile:1.7
1+
# syntax=docker/dockerfile:1.8
22
FROM debian:12-slim
33

44
LABEL maintainer="NGINX Docker Maintainers <integrations@nginx.com>"

0 commit comments

Comments
 (0)