From 260fa1a8888123043e763fa4330995f590aaf977 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Thu, 8 Aug 2024 18:36:39 -0700 Subject: [PATCH] Add GetMaxAPIVersion to get max supported API --- client/nginx.go | 17 ++++++++++++ client/nginx_test.go | 64 ++++++++++++++++++++++++++++++++++++++++++++ docker/Dockerfile | 2 +- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/client/nginx.go b/client/nginx.go index d5fff60..a47a33e 100644 --- a/client/nginx.go +++ b/client/nginx.go @@ -610,6 +610,23 @@ func versionSupported(n int) bool { return false } +// GetMaxAPIVersion returns the maximum API version supported by the server and the client. +func (client *NginxClient) GetMaxAPIVersion() (int, error) { + serverVersion, err := client.getAPIVersions(client.httpClient, client.apiEndpoint) + if err != nil { + return 0, fmt.Errorf("failed to get max API version: %w", err) + } + + maxServerVersion := slices.Max(*serverVersion) + maxClientVersion := slices.Max(supportedAPIVersions) + + if maxServerVersion > maxClientVersion { + return maxClientVersion, nil + } + + return maxServerVersion, nil +} + func (client *NginxClient) getAPIVersions(httpClient *http.Client, endpoint string) (*versions, error) { ctx, cancel := context.WithTimeout(context.Background(), client.ctxTimeout) defer cancel() diff --git a/client/nginx_test.go b/client/nginx_test.go index 2cb8a7e..312cf73 100644 --- a/client/nginx_test.go +++ b/client/nginx_test.go @@ -752,3 +752,67 @@ func TestGetStats_SSL(t *testing.T) { t.Fatalf("SSL stats: expected %v, actual %v", testStats, stats.SSL) } } + +func TestGetMaxAPIVersionServer(t *testing.T) { + t.Parallel() + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.RequestURI == "/": + _, err := w.Write([]byte(`[4, 5, 6, 7]`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + default: + _, err := w.Write([]byte(`{}`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + })) + defer ts.Close() + + c, err := NewNginxClient(ts.URL) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + maxVer, err := c.GetMaxAPIVersion() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if maxVer != 7 { + t.Fatalf("expected 7, got %v", maxVer) + } +} + +func TestGetMaxAPIVersionClient(t *testing.T) { + t.Parallel() + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch { + case r.RequestURI == "/": + _, err := w.Write([]byte(`[4, 5, 6, 7, 8, 9, 25]`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + default: + _, err := w.Write([]byte(`{}`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + })) + defer ts.Close() + + c, err := NewNginxClient(ts.URL) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + maxVer, err := c.GetMaxAPIVersion() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if maxVer != c.apiVersion { + t.Fatalf("expected %v, got %v", c.apiVersion, maxVer) + } +} diff --git a/docker/Dockerfile b/docker/Dockerfile index f4ddb37..91bf8c0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.7 +# syntax=docker/dockerfile:1.8 FROM debian:12-slim LABEL maintainer="NGINX Docker Maintainers "