From 1fa70268fba9b5aa5fa99cdc63bf541ac04f2e00 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 21 Jun 2021 17:14:00 -0700 Subject: [PATCH 1/6] Add golangci-lint config --- .github/workflows/lint.yml | 2 +- .golangci.yml | 34 ++++++++++++++++++++++++++++++++++ Makefile | 6 +----- 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 .golangci.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0c5a06f7..9d4aae5a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -30,4 +30,4 @@ jobs: - name: Lint Code uses: golangci/golangci-lint-action@v2 with: - args: --timeout ${{ env.GOLANGCI_TIMEOUT }} --issues-exit-code=0 ./client/... + args: --timeout ${{ env.GOLANGCI_TIMEOUT }} diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..96ec11d1 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,34 @@ +linters-settings: + misspell: + locale: US + +linters: + enable: + - asciicheck + - deadcode + - errcheck + - errorlint + - gofmt + - gofumpt + - goimports + - gosec + - gosimple + - govet + - ineffassign + - makezero + - misspell + - nilerr + - noctx + - predeclared + - staticcheck + - structcheck + - typecheck + - unconvert + - unparam + - unused + - varcheck + - wastedassign + disable-all: true +issues: + max-issues-per-linter: 0 + max-same-issues: 0 diff --git a/Makefile b/Makefile index 3b682368..a6888f8b 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,6 @@ DOCKER_NGINX_PLUS?=nginx-plus DOCKER_NGINX_PLUS_HELPER?=nginx-plus-helper GOLANG_CONTAINER=golang:1.16 -GOLANGCI_CONTAINER=golangci/golangci-lint:latest export TEST_API_ENDPOINT=http://$(DOCKER_NGINX_PLUS):8080/api export TEST_API_ENDPOINT_OF_HELPER=http://$(DOCKER_NGINX_PLUS_HELPER):8080/api @@ -15,10 +14,7 @@ export TEST_UNAVAILABLE_STREAM_ADDRESS=$(DOCKER_NGINX_PLUS):8081 test: docker-build run-nginx-plus test-run configure-no-stream-block test-run-no-stream-block clean lint: - docker run --rm \ - -v $(shell pwd):/go/src/github.com/nginxinc/nginx-plus-go-client \ - -w /go/src/github.com/nginxinc/nginx-plus-go-client \ - $(GOLANGCI_CONTAINER) golangci-lint run + docker run --pull always --rm -v $(shell pwd):/nginx-plus-go-client -w /nginx-plus-go-client -v $(shell go env GOCACHE):/cache/go -e GOCACHE=/cache/go -e GOLANGCI_LINT_CACHE=/cache/go -v $(shell go env GOPATH)/pkg:/go/pkg golangci/golangci-lint:latest golangci-lint --color always run docker-build: docker build --secret id=nginx-repo.crt,src=docker/nginx-repo.crt --secret id=nginx-repo.key,src=docker/nginx-repo.key --build-arg NGINX_PLUS_VERSION=$(NGINX_PLUS_VERSION) -t $(NGINX_IMAGE) docker From 55287285f6af49d82aeb50d4aa0d1eb305f91884 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 21 Jun 2021 17:16:53 -0700 Subject: [PATCH 2/6] Run gofumports in the project --- client/nginx.go | 2 +- client/nginx_test.go | 364 +++++++++++++++++++++++-------------------- tests/client_test.go | 8 +- 3 files changed, 195 insertions(+), 179 deletions(-) diff --git a/client/nginx.go b/client/nginx.go index fb737e90..d4105fa8 100644 --- a/client/nginx.go +++ b/client/nginx.go @@ -421,7 +421,7 @@ func NewNginxClient(httpClient *http.Client, apiEndpoint string) (*NginxClient, return NewNginxClientWithVersion(httpClient, apiEndpoint, APIVersion) } -//NewNginxClientWithVersion creates an NginxClient with the given version of NGINX Plus API. +// NewNginxClientWithVersion creates an NginxClient with the given version of NGINX Plus API. func NewNginxClientWithVersion(httpClient *http.Client, apiEndpoint string, version int) (*NginxClient, error) { if !versionSupported(version) { return nil, fmt.Errorf("API version %v is not supported by the client", version) diff --git a/client/nginx_test.go b/client/nginx_test.go index 10938627..b8aa4eb8 100644 --- a/client/nginx_test.go +++ b/client/nginx_test.go @@ -7,107 +7,116 @@ import ( func TestDetermineUpdates(t *testing.T) { maxConns := 1 - var tests = []struct { + tests := []struct { updated []UpstreamServer nginx []UpstreamServer expectedToAdd []UpstreamServer expectedToDelete []UpstreamServer expectedToUpdate []UpstreamServer - }{{ - updated: []UpstreamServer{ - { - Server: "10.0.0.3:80", - }, - { - Server: "10.0.0.4:80", - }, - }, - nginx: []UpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", + }{ + { + updated: []UpstreamServer{ + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - { - ID: 2, - Server: "10.0.0.2:80", + nginx: []UpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, }, - }, - expectedToAdd: []UpstreamServer{ - { - Server: "10.0.0.3:80", + expectedToAdd: []UpstreamServer{ + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - { - Server: "10.0.0.4:80", + expectedToDelete: []UpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, }, }, - expectedToDelete: []UpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }, - { - ID: 2, - Server: "10.0.0.2:80", + { + updated: []UpstreamServer{ + { + Server: "10.0.0.2:80", + }, + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - }}, { - updated: []UpstreamServer{ - { - Server: "10.0.0.2:80", + nginx: []UpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, + { + ID: 3, + Server: "10.0.0.3:80", + }, }, - { - Server: "10.0.0.3:80", + expectedToAdd: []UpstreamServer{ + { + Server: "10.0.0.4:80", + }, }, - { - Server: "10.0.0.4:80", + expectedToDelete: []UpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, }, }, - nginx: []UpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }, - { - ID: 2, - Server: "10.0.0.2:80", + { + updated: []UpstreamServer{ + { + Server: "10.0.0.1:80", + }, + { + Server: "10.0.0.2:80", + }, + { + Server: "10.0.0.3:80", + }, }, - { - ID: 3, - Server: "10.0.0.3:80", + nginx: []UpstreamServer{ + { + Server: "10.0.0.1:80", + }, + { + Server: "10.0.0.2:80", + }, + { + Server: "10.0.0.3:80", + }, }, }, - expectedToAdd: []UpstreamServer{ - { - Server: "10.0.0.4:80", - }}, - expectedToDelete: []UpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }}, - }, { - updated: []UpstreamServer{ - { - Server: "10.0.0.1:80", - }, - { - Server: "10.0.0.2:80", - }, - { - Server: "10.0.0.3:80", - }}, - nginx: []UpstreamServer{ - { - Server: "10.0.0.1:80", - }, - { - Server: "10.0.0.2:80", - }, - { - Server: "10.0.0.3:80", - }, - }}, { - // empty values - }, + { + // empty values + }, { updated: []UpstreamServer{ { @@ -137,7 +146,8 @@ func TestDetermineUpdates(t *testing.T) { Server: "10.0.0.1:80", MaxConns: &maxConns, }, - }}, + }, + }, } for _, test := range tests { @@ -150,110 +160,119 @@ func TestDetermineUpdates(t *testing.T) { func TestStreamDetermineUpdates(t *testing.T) { maxConns := 1 - var tests = []struct { + tests := []struct { updated []StreamUpstreamServer nginx []StreamUpstreamServer expectedToAdd []StreamUpstreamServer expectedToDelete []StreamUpstreamServer expectedToUpdate []StreamUpstreamServer - }{{ - updated: []StreamUpstreamServer{ - { - Server: "10.0.0.3:80", - }, - { - Server: "10.0.0.4:80", - }, - }, - nginx: []StreamUpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", + }{ + { + updated: []StreamUpstreamServer{ + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - { - ID: 2, - Server: "10.0.0.2:80", + nginx: []StreamUpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, }, - }, - expectedToAdd: []StreamUpstreamServer{ - { - Server: "10.0.0.3:80", + expectedToAdd: []StreamUpstreamServer{ + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - { - Server: "10.0.0.4:80", + expectedToDelete: []StreamUpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, }, }, - expectedToDelete: []StreamUpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }, - { - ID: 2, - Server: "10.0.0.2:80", + { + updated: []StreamUpstreamServer{ + { + Server: "10.0.0.2:80", + }, + { + Server: "10.0.0.3:80", + }, + { + Server: "10.0.0.4:80", + }, }, - }}, { - updated: []StreamUpstreamServer{ - { - Server: "10.0.0.2:80", + nginx: []StreamUpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, + { + ID: 3, + Server: "10.0.0.3:80", + }, }, - { - Server: "10.0.0.3:80", + expectedToAdd: []StreamUpstreamServer{ + { + Server: "10.0.0.4:80", + }, }, - { - Server: "10.0.0.4:80", + expectedToDelete: []StreamUpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, }, }, - nginx: []StreamUpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }, - { - ID: 2, - Server: "10.0.0.2:80", + { + updated: []StreamUpstreamServer{ + { + Server: "10.0.0.1:80", + }, + { + Server: "10.0.0.2:80", + }, + { + Server: "10.0.0.3:80", + }, }, - { - ID: 3, - Server: "10.0.0.3:80", + nginx: []StreamUpstreamServer{ + { + ID: 1, + Server: "10.0.0.1:80", + }, + { + ID: 2, + Server: "10.0.0.2:80", + }, + { + ID: 3, + Server: "10.0.0.3:80", + }, }, }, - expectedToAdd: []StreamUpstreamServer{ - { - Server: "10.0.0.4:80", - }}, - expectedToDelete: []StreamUpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }}, - }, { - updated: []StreamUpstreamServer{ - { - Server: "10.0.0.1:80", - }, - { - Server: "10.0.0.2:80", - }, - { - Server: "10.0.0.3:80", - }}, - nginx: []StreamUpstreamServer{ - { - ID: 1, - Server: "10.0.0.1:80", - }, - { - ID: 2, - Server: "10.0.0.2:80", - }, - { - ID: 3, - Server: "10.0.0.3:80", - }, - }}, { - // empty values - }, + { + // empty values + }, { updated: []StreamUpstreamServer{ { @@ -283,7 +302,8 @@ func TestStreamDetermineUpdates(t *testing.T) { Server: "10.0.0.1:80", MaxConns: &maxConns, }, - }}, + }, + }, } for _, test := range tests { @@ -296,7 +316,7 @@ func TestStreamDetermineUpdates(t *testing.T) { func TestAddPortToServer(t *testing.T) { // More info about addresses http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server - var tests = []struct { + tests := []struct { address string expected string msg string diff --git a/tests/client_test.go b/tests/client_test.go index 59775a85..3430dd73 100644 --- a/tests/client_test.go +++ b/tests/client_test.go @@ -33,7 +33,6 @@ var ( func TestStreamClient(t *testing.T) { httpClient := &http.Client{} c, err := client.NewNginxClient(httpClient, helpers.GetAPIEndpoint()) - if err != nil { t.Fatalf("Error when creating a client: %v", err) } @@ -90,7 +89,6 @@ func TestStreamClient(t *testing.T) { } streamAdded, streamDeleted, streamUpdated, err := c.UpdateStreamServers(streamUpstream, streamServers1) - if err != nil { t.Fatalf("Error when updating servers: %v", err) } @@ -117,7 +115,6 @@ func TestStreamClient(t *testing.T) { // updating with the same servers added, deleted, updated, err := c.UpdateStreamServers(streamUpstream, streamServers1) - if err != nil { t.Fatalf("Error when updating servers: %v", err) } @@ -201,7 +198,8 @@ func TestStreamClient(t *testing.T) { }, { Server: "127.0.0.2:8004", - }, { + }, + { Server: "127.0.0.2:8005", }, } @@ -303,7 +301,6 @@ func TestStreamUpstreamServer(t *testing.T) { func TestClient(t *testing.T) { httpClient := &http.Client{} c, err := client.NewNginxClient(httpClient, helpers.GetAPIEndpoint()) - if err != nil { t.Fatalf("Error when creating a client: %v", err) } @@ -364,7 +361,6 @@ func TestClient(t *testing.T) { } added, deleted, updated, err := c.UpdateHTTPServers(upstream, servers1) - if err != nil { t.Fatalf("Error when updating servers: %v", err) } From 6bdb6ee84037c9ecc9bddbdd0b8679f85143a5fb Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 21 Jun 2021 17:49:25 -0700 Subject: [PATCH 3/6] Fix issues for errorlint --- client/nginx.go | 159 +++++++++++++++++---------------- tests/client_no_stream_test.go | 2 +- tests/client_test.go | 70 +++++++-------- 3 files changed, 117 insertions(+), 114 deletions(-) diff --git a/client/nginx.go b/client/nginx.go index d4105fa8..dbe25ec5 100644 --- a/client/nginx.go +++ b/client/nginx.go @@ -428,7 +428,7 @@ func NewNginxClientWithVersion(httpClient *http.Client, apiEndpoint string, vers } versions, err := getAPIVersions(httpClient, apiEndpoint) if err != nil { - return nil, fmt.Errorf("error accessing the API: %v", err) + return nil, fmt.Errorf("error accessing the API: %w", err) } found := false for _, v := range *versions { @@ -459,7 +459,7 @@ func versionSupported(n int) bool { func getAPIVersions(httpClient *http.Client, endpoint string) (*versions, error) { resp, err := httpClient.Get(endpoint) if err != nil { - return nil, fmt.Errorf("%v is not accessible: %v", endpoint, err) + return nil, fmt.Errorf("%v is not accessible: %w", endpoint, err) } defer resp.Body.Close() @@ -469,13 +469,13 @@ func getAPIVersions(httpClient *http.Client, endpoint string) (*versions, error) body, err := ioutil.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("error while reading body of the response: %v", err) + return nil, fmt.Errorf("error while reading body of the response: %w", err) } var vers versions err = json.Unmarshal(body, &vers) if err != nil { - return nil, fmt.Errorf("error unmarshalling versions, got %q response: %v", string(body), err) + return nil, fmt.Errorf("error unmarshalling versions, got %q response: %w", string(body), err) } return &vers, nil @@ -498,13 +498,13 @@ func createResponseMismatchError(respBody io.ReadCloser) *internalError { func readAPIErrorResponse(respBody io.ReadCloser) (*apiErrorResponse, error) { body, err := ioutil.ReadAll(respBody) if err != nil { - return nil, fmt.Errorf("failed to read the response body: %v", err) + return nil, fmt.Errorf("failed to read the response body: %w", err) } var apiErr apiErrorResponse err = json.Unmarshal(body, &apiErr) if err != nil { - return nil, fmt.Errorf("error unmarshalling apiErrorResponse: got %q response: %v", string(body), err) + return nil, fmt.Errorf("error unmarshalling apiErrorResponse: got %q response: %w", string(body), err) } return &apiErr, nil @@ -523,7 +523,7 @@ func (client *NginxClient) GetHTTPServers(upstream string) ([]UpstreamServer, er var servers []UpstreamServer err := client.get(path, &servers) if err != nil { - return nil, fmt.Errorf("failed to get the HTTP servers of upstream %v: %v", upstream, err) + return nil, fmt.Errorf("failed to get the HTTP servers of upstream %v: %w", upstream, err) } return servers, nil @@ -533,7 +533,7 @@ func (client *NginxClient) GetHTTPServers(upstream string) ([]UpstreamServer, er func (client *NginxClient) AddHTTPServer(upstream string, server UpstreamServer) error { id, err := client.getIDOfHTTPServer(upstream, server.Server) if err != nil { - return fmt.Errorf("failed to add %v server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to add %v server to %v upstream: %w", server.Server, upstream, err) } if id != -1 { return fmt.Errorf("failed to add %v server to %v upstream: server already exists", server.Server, upstream) @@ -542,7 +542,7 @@ func (client *NginxClient) AddHTTPServer(upstream string, server UpstreamServer) path := fmt.Sprintf("http/upstreams/%v/servers/", upstream) err = client.post(path, &server) if err != nil { - return fmt.Errorf("failed to add %v server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to add %v server to %v upstream: %w", server.Server, upstream, err) } return nil @@ -552,7 +552,7 @@ func (client *NginxClient) AddHTTPServer(upstream string, server UpstreamServer) func (client *NginxClient) DeleteHTTPServer(upstream string, server string) error { id, err := client.getIDOfHTTPServer(upstream, server) if err != nil { - return fmt.Errorf("failed to remove %v server from %v upstream: %v", server, upstream, err) + return fmt.Errorf("failed to remove %v server from %v upstream: %w", server, upstream, err) } if id == -1 { return fmt.Errorf("failed to remove %v server from %v upstream: server doesn't exist", server, upstream) @@ -561,7 +561,7 @@ func (client *NginxClient) DeleteHTTPServer(upstream string, server string) erro path := fmt.Sprintf("http/upstreams/%v/servers/%v", upstream, id) err = client.delete(path, http.StatusOK) if err != nil { - return fmt.Errorf("failed to remove %v server from %v upstream: %v", server, upstream, err) + return fmt.Errorf("failed to remove %v server from %v upstream: %w", server, upstream, err) } return nil @@ -574,7 +574,7 @@ func (client *NginxClient) DeleteHTTPServer(upstream string, server string) erro func (client *NginxClient) UpdateHTTPServers(upstream string, servers []UpstreamServer) (added []UpstreamServer, deleted []UpstreamServer, updated []UpstreamServer, err error) { serversInNginx, err := client.GetHTTPServers(upstream) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %w", upstream, err) } // We assume port 80 if no port is set for servers. @@ -589,21 +589,21 @@ func (client *NginxClient) UpdateHTTPServers(upstream string, servers []Upstream for _, server := range toAdd { err := client.AddHTTPServer(upstream, server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %w", upstream, err) } } for _, server := range toDelete { err := client.DeleteHTTPServer(upstream, server.Server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %w", upstream, err) } } for _, server := range toUpdate { err := client.UpdateHTTPServer(upstream, server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update servers of %v upstream: %w", upstream, err) } } @@ -692,7 +692,7 @@ func determineUpdates(updatedServers []UpstreamServer, nginxServers []UpstreamSe func (client *NginxClient) getIDOfHTTPServer(upstream string, name string) (int, error) { servers, err := client.GetHTTPServers(upstream) if err != nil { - return -1, fmt.Errorf("error getting id of server %v of upstream %v: %v", name, upstream, err) + return -1, fmt.Errorf("error getting id of server %v of upstream %v: %w", name, upstream, err) } for _, s := range servers { @@ -708,7 +708,7 @@ func (client *NginxClient) get(path string, data interface{}) error { url := fmt.Sprintf("%v/%v/%v", client.apiEndpoint, client.version, path) resp, err := client.httpClient.Get(url) if err != nil { - return fmt.Errorf("failed to get %v: %v", path, err) + return fmt.Errorf("failed to get %v: %w", path, err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { @@ -719,12 +719,12 @@ func (client *NginxClient) get(path string, data interface{}) error { body, err := ioutil.ReadAll(resp.Body) if err != nil { - return fmt.Errorf("failed to read the response body: %v", err) + return fmt.Errorf("failed to read the response body: %w", err) } err = json.Unmarshal(body, data) if err != nil { - return fmt.Errorf("error unmarshaling response %q: %v", string(body), err) + return fmt.Errorf("error unmarshaling response %q: %w", string(body), err) } return nil } @@ -734,12 +734,12 @@ func (client *NginxClient) post(path string, input interface{}) error { jsonInput, err := json.Marshal(input) if err != nil { - return fmt.Errorf("failed to marshall input: %v", err) + return fmt.Errorf("failed to marshall input: %w", err) } resp, err := client.httpClient.Post(url, "application/json", bytes.NewBuffer(jsonInput)) if err != nil { - return fmt.Errorf("failed to post %v: %v", path, err) + return fmt.Errorf("failed to post %v: %w", path, err) } defer resp.Body.Close() if resp.StatusCode != http.StatusCreated { @@ -756,12 +756,12 @@ func (client *NginxClient) delete(path string, expectedStatusCode int) error { req, err := http.NewRequest(http.MethodDelete, path, nil) if err != nil { - return fmt.Errorf("failed to create a delete request: %v", err) + return fmt.Errorf("failed to create a delete request: %w", err) } resp, err := client.httpClient.Do(req) if err != nil { - return fmt.Errorf("failed to create delete request: %v", err) + return fmt.Errorf("failed to create delete request: %w", err) } defer resp.Body.Close() @@ -778,17 +778,17 @@ func (client *NginxClient) patch(path string, input interface{}, expectedStatusC jsonInput, err := json.Marshal(input) if err != nil { - return fmt.Errorf("failed to marshall input: %v", err) + return fmt.Errorf("failed to marshall input: %w", err) } req, err := http.NewRequest(http.MethodPatch, path, bytes.NewBuffer(jsonInput)) if err != nil { - return fmt.Errorf("failed to create a patch request: %v", err) + return fmt.Errorf("failed to create a patch request: %w", err) } resp, err := client.httpClient.Do(req) if err != nil { - return fmt.Errorf("failed to create patch request: %v", err) + return fmt.Errorf("failed to create patch request: %w", err) } defer resp.Body.Close() @@ -813,7 +813,7 @@ func (client *NginxClient) GetStreamServers(upstream string) ([]StreamUpstreamSe var servers []StreamUpstreamServer err := client.get(path, &servers) if err != nil { - return nil, fmt.Errorf("failed to get stream servers of upstream server %v: %v", upstream, err) + return nil, fmt.Errorf("failed to get stream servers of upstream server %v: %w", upstream, err) } return servers, nil } @@ -822,7 +822,7 @@ func (client *NginxClient) GetStreamServers(upstream string) ([]StreamUpstreamSe func (client *NginxClient) AddStreamServer(upstream string, server StreamUpstreamServer) error { id, err := client.getIDOfStreamServer(upstream, server.Server) if err != nil { - return fmt.Errorf("failed to add %v stream server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to add %v stream server to %v upstream: %w", server.Server, upstream, err) } if id != -1 { return fmt.Errorf("failed to add %v stream server to %v upstream: server already exists", server.Server, upstream) @@ -831,7 +831,7 @@ func (client *NginxClient) AddStreamServer(upstream string, server StreamUpstrea path := fmt.Sprintf("stream/upstreams/%v/servers/", upstream) err = client.post(path, &server) if err != nil { - return fmt.Errorf("failed to add %v stream server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to add %v stream server to %v upstream: %w", server.Server, upstream, err) } return nil } @@ -840,7 +840,7 @@ func (client *NginxClient) AddStreamServer(upstream string, server StreamUpstrea func (client *NginxClient) DeleteStreamServer(upstream string, server string) error { id, err := client.getIDOfStreamServer(upstream, server) if err != nil { - return fmt.Errorf("failed to remove %v stream server from %v upstream: %v", server, upstream, err) + return fmt.Errorf("failed to remove %v stream server from %v upstream: %w", server, upstream, err) } if id == -1 { return fmt.Errorf("failed to remove %v stream server from %v upstream: server doesn't exist", server, upstream) @@ -849,7 +849,7 @@ func (client *NginxClient) DeleteStreamServer(upstream string, server string) er path := fmt.Sprintf("stream/upstreams/%v/servers/%v", upstream, id) err = client.delete(path, http.StatusOK) if err != nil { - return fmt.Errorf("failed to remove %v stream server from %v upstream: %v", server, upstream, err) + return fmt.Errorf("failed to remove %v stream server from %v upstream: %w", server, upstream, err) } return nil } @@ -861,7 +861,7 @@ func (client *NginxClient) DeleteStreamServer(upstream string, server string) er func (client *NginxClient) UpdateStreamServers(upstream string, servers []StreamUpstreamServer) (added []StreamUpstreamServer, deleted []StreamUpstreamServer, updated []StreamUpstreamServer, err error) { serversInNginx, err := client.GetStreamServers(upstream) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %w", upstream, err) } var formattedServers []StreamUpstreamServer @@ -875,21 +875,21 @@ func (client *NginxClient) UpdateStreamServers(upstream string, servers []Stream for _, server := range toAdd { err := client.AddStreamServer(upstream, server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %w", upstream, err) } } for _, server := range toDelete { err := client.DeleteStreamServer(upstream, server.Server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %w", upstream, err) } } for _, server := range toUpdate { err := client.UpdateStreamServer(upstream, server) if err != nil { - return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %v", upstream, err) + return nil, nil, nil, fmt.Errorf("failed to update stream servers of %v upstream: %w", upstream, err) } } @@ -899,7 +899,7 @@ func (client *NginxClient) UpdateStreamServers(upstream string, servers []Stream func (client *NginxClient) getIDOfStreamServer(upstream string, name string) (int, error) { servers, err := client.GetStreamServers(upstream) if err != nil { - return -1, fmt.Errorf("error getting id of stream server %v of upstream %v: %v", name, upstream, err) + return -1, fmt.Errorf("error getting id of stream server %v of upstream %v: %w", name, upstream, err) } for _, s := range servers { @@ -993,72 +993,72 @@ func determineStreamUpdates(updatedServers []StreamUpstreamServer, nginxServers func (client *NginxClient) GetStats() (*Stats, error) { info, err := client.GetNginxInfo() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } caches, err := client.GetCaches() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } processes, err := client.GetProcesses() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } slabs, err := client.GetSlabs() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } cons, err := client.GetConnections() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } requests, err := client.GetHTTPRequests() if err != nil { - return nil, fmt.Errorf("Failed to get stats: %v", err) + return nil, fmt.Errorf("Failed to get stats: %w", err) } ssl, err := client.GetSSL() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } zones, err := client.GetServerZones() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } upstreams, err := client.GetUpstreams() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } streamZones, err := client.GetStreamServerZones() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } streamUpstreams, err := client.GetStreamUpstreams() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } streamZoneSync, err := client.GetStreamZoneSync() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } locationZones, err := client.GetLocationZones() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } resolvers, err := client.GetResolvers() if err != nil { - return nil, fmt.Errorf("failed to get stats: %v", err) + return nil, fmt.Errorf("failed to get stats: %w", err) } return &Stats{ @@ -1084,7 +1084,7 @@ func (client *NginxClient) GetNginxInfo() (*NginxInfo, error) { var info NginxInfo err := client.get("nginx", &info) if err != nil { - return nil, fmt.Errorf("failed to get info: %v", err) + return nil, fmt.Errorf("failed to get info: %w", err) } return &info, nil } @@ -1094,7 +1094,7 @@ func (client *NginxClient) GetCaches() (*Caches, error) { var caches Caches err := client.get("http/caches", &caches) if err != nil { - return nil, fmt.Errorf("failed to get caches: %v", err) + return nil, fmt.Errorf("failed to get caches: %w", err) } return &caches, nil } @@ -1104,7 +1104,7 @@ func (client *NginxClient) GetSlabs() (*Slabs, error) { var slabs Slabs err := client.get("slabs", &slabs) if err != nil { - return nil, fmt.Errorf("failed to get slabs: %v", err) + return nil, fmt.Errorf("failed to get slabs: %w", err) } return &slabs, nil } @@ -1114,7 +1114,7 @@ func (client *NginxClient) GetConnections() (*Connections, error) { var cons Connections err := client.get("connections", &cons) if err != nil { - return nil, fmt.Errorf("failed to get connections: %v", err) + return nil, fmt.Errorf("failed to get connections: %w", err) } return &cons, nil } @@ -1124,7 +1124,7 @@ func (client *NginxClient) GetHTTPRequests() (*HTTPRequests, error) { var requests HTTPRequests err := client.get("http/requests", &requests) if err != nil { - return nil, fmt.Errorf("failed to get http requests: %v", err) + return nil, fmt.Errorf("failed to get http requests: %w", err) } return &requests, nil } @@ -1134,7 +1134,7 @@ func (client *NginxClient) GetSSL() (*SSL, error) { var ssl SSL err := client.get("ssl", &ssl) if err != nil { - return nil, fmt.Errorf("failed to get ssl: %v", err) + return nil, fmt.Errorf("failed to get ssl: %w", err) } return &ssl, nil } @@ -1144,7 +1144,7 @@ func (client *NginxClient) GetServerZones() (*ServerZones, error) { var zones ServerZones err := client.get("http/server_zones", &zones) if err != nil { - return nil, fmt.Errorf("failed to get server zones: %v", err) + return nil, fmt.Errorf("failed to get server zones: %w", err) } return &zones, err } @@ -1154,12 +1154,13 @@ func (client *NginxClient) GetStreamServerZones() (*StreamServerZones, error) { var zones StreamServerZones err := client.get("stream/server_zones", &zones) if err != nil { - if err, ok := err.(*internalError); ok { - if err.Code == pathNotFoundCode { + var ie *internalError + if errors.As(err, &ie) { + if ie.Code == pathNotFoundCode { return &zones, nil } } - return nil, fmt.Errorf("failed to get stream server zones: %v", err) + return nil, fmt.Errorf("failed to get stream server zones: %w", err) } return &zones, err } @@ -1169,7 +1170,7 @@ func (client *NginxClient) GetUpstreams() (*Upstreams, error) { var upstreams Upstreams err := client.get("http/upstreams", &upstreams) if err != nil { - return nil, fmt.Errorf("failed to get upstreams: %v", err) + return nil, fmt.Errorf("failed to get upstreams: %w", err) } return &upstreams, nil } @@ -1179,12 +1180,13 @@ func (client *NginxClient) GetStreamUpstreams() (*StreamUpstreams, error) { var upstreams StreamUpstreams err := client.get("stream/upstreams", &upstreams) if err != nil { - if err, ok := err.(*internalError); ok { - if err.Code == pathNotFoundCode { + var ie *internalError + if errors.As(err, &ie) { + if ie.Code == pathNotFoundCode { return &upstreams, nil } } - return nil, fmt.Errorf("failed to get stream upstreams: %v", err) + return nil, fmt.Errorf("failed to get stream upstreams: %w", err) } return &upstreams, nil } @@ -1194,12 +1196,13 @@ func (client *NginxClient) GetStreamZoneSync() (*StreamZoneSync, error) { var streamZoneSync StreamZoneSync err := client.get("stream/zone_sync", &streamZoneSync) if err != nil { - if err, ok := err.(*internalError); ok { - if err.Code == pathNotFoundCode { + var ie *internalError + if errors.As(err, &ie) { + if ie.Code == pathNotFoundCode { return nil, nil } } - return nil, fmt.Errorf("failed to get stream zone sync: %v", err) + return nil, fmt.Errorf("failed to get stream zone sync: %w", err) } return &streamZoneSync, err @@ -1213,7 +1216,7 @@ func (client *NginxClient) GetLocationZones() (*LocationZones, error) { } err := client.get("http/location_zones", &locationZones) if err != nil { - return nil, fmt.Errorf("failed to get location zones: %v", err) + return nil, fmt.Errorf("failed to get location zones: %w", err) } return &locationZones, err @@ -1227,7 +1230,7 @@ func (client *NginxClient) GetResolvers() (*Resolvers, error) { } err := client.get("resolvers", &resolvers) if err != nil { - return nil, fmt.Errorf("failed to get resolvers: %v", err) + return nil, fmt.Errorf("failed to get resolvers: %w", err) } return &resolvers, err @@ -1238,7 +1241,7 @@ func (client *NginxClient) GetProcesses() (*Processes, error) { var processes Processes err := client.get("processes", &processes) if err != nil { - return nil, fmt.Errorf("failed to get processes: %v", err) + return nil, fmt.Errorf("failed to get processes: %w", err) } return &processes, err @@ -1273,7 +1276,7 @@ func (client *NginxClient) getKeyValPairs(zone string, stream bool) (KeyValPairs var keyValPairs KeyValPairs err := client.get(path, &keyValPairs) if err != nil { - return nil, fmt.Errorf("failed to get keyvals for %v/%v zone: %v", base, zone, err) + return nil, fmt.Errorf("failed to get keyvals for %v/%v zone: %w", base, zone, err) } return keyValPairs, nil } @@ -1298,7 +1301,7 @@ func (client *NginxClient) getAllKeyValPairs(stream bool) (KeyValPairsByZone, er var keyValPairsByZone KeyValPairsByZone err := client.get(path, &keyValPairsByZone) if err != nil { - return nil, fmt.Errorf("failed to get keyvals for all %v zones: %v", base, err) + return nil, fmt.Errorf("failed to get keyvals for all %v zones: %w", base, err) } return keyValPairsByZone, nil } @@ -1326,7 +1329,7 @@ func (client *NginxClient) addKeyValPair(zone string, key string, val string, st input := KeyValPairs{key: val} err := client.post(path, &input) if err != nil { - return fmt.Errorf("failed to add key value pair for %v/%v zone: %v", base, zone, err) + return fmt.Errorf("failed to add key value pair for %v/%v zone: %w", base, zone, err) } return nil } @@ -1354,7 +1357,7 @@ func (client *NginxClient) modifyKeyValPair(zone string, key string, val string, input := KeyValPairs{key: val} err := client.patch(path, &input, http.StatusNoContent) if err != nil { - return fmt.Errorf("failed to update key value pair for %v/%v zone: %v", base, zone, err) + return fmt.Errorf("failed to update key value pair for %v/%v zone: %w", base, zone, err) } return nil } @@ -1387,7 +1390,7 @@ func (client *NginxClient) deleteKeyValuePair(zone string, key string, stream bo path := fmt.Sprintf("%v/keyvals/%v", base, zone) err := client.patch(path, &keyval, http.StatusNoContent) if err != nil { - return fmt.Errorf("failed to remove key values pair for %v/%v zone: %v", base, zone, err) + return fmt.Errorf("failed to remove key values pair for %v/%v zone: %w", base, zone, err) } return nil } @@ -1414,7 +1417,7 @@ func (client *NginxClient) deleteKeyValPairs(zone string, stream bool) error { path := fmt.Sprintf("%v/keyvals/%v", base, zone) err := client.delete(path, http.StatusNoContent) if err != nil { - return fmt.Errorf("failed to remove all key value pairs for %v/%v zone: %v", base, zone, err) + return fmt.Errorf("failed to remove all key value pairs for %v/%v zone: %w", base, zone, err) } return nil } @@ -1425,7 +1428,7 @@ func (client *NginxClient) UpdateHTTPServer(upstream string, server UpstreamServ server.ID = 0 err := client.patch(path, &server, http.StatusOK) if err != nil { - return fmt.Errorf("failed to update %v server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to update %v server to %v upstream: %w", server.Server, upstream, err) } return nil @@ -1437,7 +1440,7 @@ func (client *NginxClient) UpdateStreamServer(upstream string, server StreamUpst server.ID = 0 err := client.patch(path, &server, http.StatusOK) if err != nil { - return fmt.Errorf("failed to update %v stream server to %v upstream: %v", server.Server, upstream, err) + return fmt.Errorf("failed to update %v stream server to %v upstream: %w", server.Server, upstream, err) } return nil diff --git a/tests/client_no_stream_test.go b/tests/client_no_stream_test.go index 6a7221a4..45348848 100644 --- a/tests/client_no_stream_test.go +++ b/tests/client_no_stream_test.go @@ -21,7 +21,7 @@ func TestStatsNoStream(t *testing.T) { stats, err := c.GetStats() if err != nil { - t.Errorf("Error getting stats: %v", err) + t.Errorf("Error getting stats: %w", err) } if stats.Connections.Accepted < 1 { diff --git a/tests/client_test.go b/tests/client_test.go index 3430dd73..bbdd6671 100644 --- a/tests/client_test.go +++ b/tests/client_test.go @@ -69,7 +69,7 @@ func TestStreamClient(t *testing.T) { streamServers, err := c.GetStreamServers(streamUpstream) if err != nil { - t.Errorf("Error getting stream servers: %v", err) + t.Errorf("Error getting stream servers: %w", err) } if len(streamServers) != 0 { t.Errorf("Expected 0 servers, got %v", streamServers) @@ -275,7 +275,7 @@ func TestStreamUpstreamServer(t *testing.T) { } err = c.AddStreamServer(streamUpstream, streamServer) if err != nil { - t.Errorf("Error adding upstream server: %v", err) + t.Errorf("Error adding upstream server: %w", err) } servers, err := c.GetStreamServers(streamUpstream) if err != nil { @@ -294,7 +294,7 @@ func TestStreamUpstreamServer(t *testing.T) { // remove stream upstream servers _, _, _, err = c.UpdateStreamServers(streamUpstream, []client.StreamUpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove servers: %v", err) + t.Errorf("Couldn't remove servers: %w", err) } } @@ -551,7 +551,7 @@ func TestUpstreamServer(t *testing.T) { } err = c.AddHTTPServer(upstream, server) if err != nil { - t.Errorf("Error adding upstream server: %v", err) + t.Errorf("Error adding upstream server: %w", err) } servers, err := c.GetHTTPServers(upstream) if err != nil { @@ -570,7 +570,7 @@ func TestUpstreamServer(t *testing.T) { // remove upstream servers _, _, _, err = c.UpdateHTTPServers(upstream, []client.UpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove servers: %v", err) + t.Errorf("Couldn't remove servers: %w", err) } } @@ -586,12 +586,12 @@ func TestStats(t *testing.T) { } err = c.AddHTTPServer(upstream, server) if err != nil { - t.Errorf("Error adding upstream server: %v", err) + t.Errorf("Error adding upstream server: %w", err) } stats, err := c.GetStats() if err != nil { - t.Errorf("Error getting stats: %v", err) + t.Errorf("Error getting stats: %w", err) } // NginxInfo @@ -689,7 +689,7 @@ func TestStats(t *testing.T) { // cleanup upstream servers _, _, _, err = c.UpdateHTTPServers(upstream, []client.UpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove servers: %v", err) + t.Errorf("Couldn't remove servers: %w", err) } } @@ -720,7 +720,7 @@ func TestUpstreamServerDefaultParameters(t *testing.T) { } err = c.AddHTTPServer(upstream, server) if err != nil { - t.Errorf("Error adding upstream server: %v", err) + t.Errorf("Error adding upstream server: %w", err) } servers, err := c.GetHTTPServers(upstream) if err != nil { @@ -739,7 +739,7 @@ func TestUpstreamServerDefaultParameters(t *testing.T) { // remove upstream servers _, _, _, err = c.UpdateHTTPServers(upstream, []client.UpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove servers: %v", err) + t.Errorf("Couldn't remove servers: %w", err) } } @@ -755,13 +755,13 @@ func TestStreamStats(t *testing.T) { } err = c.AddStreamServer(streamUpstream, server) if err != nil { - t.Errorf("Error adding stream upstream server: %v", err) + t.Errorf("Error adding stream upstream server: %w", err) } // make connection so we have stream server zone stats - ignore response _, err = net.Dial("tcp", helpers.GetStreamAddress()) if err != nil { - t.Errorf("Error making tcp connection: %v", err) + t.Errorf("Error making tcp connection: %w", err) } // wait for health checks @@ -769,7 +769,7 @@ func TestStreamStats(t *testing.T) { stats, err := c.GetStats() if err != nil { - t.Errorf("Error getting stats: %v", err) + t.Errorf("Error getting stats: %w", err) } if stats.Connections.Active == 0 { @@ -809,7 +809,7 @@ func TestStreamStats(t *testing.T) { // cleanup stream upstream servers _, _, _, err = c.UpdateStreamServers(streamUpstream, []client.StreamUpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove stream servers: %v", err) + t.Errorf("Couldn't remove stream servers: %w", err) } } @@ -838,7 +838,7 @@ func TestStreamUpstreamServerDefaultParameters(t *testing.T) { } err = c.AddStreamServer(streamUpstream, streamServer) if err != nil { - t.Errorf("Error adding upstream server: %v", err) + t.Errorf("Error adding upstream server: %w", err) } streamServers, err := c.GetStreamServers(streamUpstream) if err != nil { @@ -857,7 +857,7 @@ func TestStreamUpstreamServerDefaultParameters(t *testing.T) { // cleanup stream upstream servers _, _, _, err = c.UpdateStreamServers(streamUpstream, []client.StreamUpstreamServer{}) if err != nil { - t.Errorf("Couldn't remove stream servers: %v", err) + t.Errorf("Couldn't remove stream servers: %w", err) } } @@ -871,7 +871,7 @@ func TestKeyValue(t *testing.T) { err = c.AddKeyValPair(zoneName, "key1", "val1") if err != nil { - t.Errorf("Couldn't set keyvals: %v", err) + t.Errorf("Couldn't set keyvals: %w", err) } var keyValPairs client.KeyValPairs @@ -888,7 +888,7 @@ func TestKeyValue(t *testing.T) { keyValuPairsByZone, err := c.GetAllKeyValPairs() if err != nil { - t.Errorf("Couldn't get keyvals, %v", err) + t.Errorf("Couldn't get keyvals, %w", err) } expectedKeyValPairsByZone := client.KeyValPairsByZone{ zoneName: expectedKeyValPairs, @@ -901,12 +901,12 @@ func TestKeyValue(t *testing.T) { expectedKeyValPairs["key1"] = "valModified1" err = c.ModifyKeyValPair(zoneName, "key1", "valModified1") if err != nil { - t.Errorf("couldn't set keyval: %v", err) + t.Errorf("couldn't set keyval: %w", err) } keyValPairs, err = c.GetKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } if !reflect.DeepEqual(expectedKeyValPairs, keyValPairs) { t.Errorf("maps are not equal. expected: %+v, got: %+v", expectedKeyValPairs, keyValPairs) @@ -920,7 +920,7 @@ func TestKeyValue(t *testing.T) { err = c.AddKeyValPair(zoneName, "key2", "val2") if err != nil { - t.Errorf("error adding another key/val pair: %v", err) + t.Errorf("error adding another key/val pair: %w", err) } err = c.DeleteKeyValuePair(zoneName, "key1") @@ -933,7 +933,7 @@ func TestKeyValue(t *testing.T) { } keyValPairs, err = c.GetKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } if !reflect.DeepEqual(keyValPairs, expectedKeyValPairs2) { t.Errorf("didn't delete key1 %+v", keyValPairs) @@ -941,12 +941,12 @@ func TestKeyValue(t *testing.T) { err = c.DeleteKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't delete all: %v", err) + t.Errorf("couldn't delete all: %w", err) } keyValPairs, err = c.GetKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } if len(keyValPairs) > 0 { t.Errorf("zone should be empty after bulk delete") @@ -969,7 +969,7 @@ func TestKeyValueStream(t *testing.T) { err = c.AddStreamKeyValPair(zoneName, "key1", "val1") if err != nil { - t.Errorf("Couldn't set keyvals: %v", err) + t.Errorf("Couldn't set keyvals: %w", err) } keyValPairs, err := c.GetStreamKeyValPairs(zoneName) @@ -985,7 +985,7 @@ func TestKeyValueStream(t *testing.T) { keyValPairsByZone, err := c.GetAllStreamKeyValPairs() if err != nil { - t.Errorf("Couldn't get keyvals, %v", err) + t.Errorf("Couldn't get keyvals, %w", err) } expectedKeyValuePairsByZone := client.KeyValPairsByZone{ zoneName: expectedKeyValPairs, @@ -999,12 +999,12 @@ func TestKeyValueStream(t *testing.T) { expectedKeyValPairs["key1"] = "valModified1" err = c.ModifyStreamKeyValPair(zoneName, "key1", "valModified1") if err != nil { - t.Errorf("couldn't set keyval: %v", err) + t.Errorf("couldn't set keyval: %w", err) } keyValPairs, err = c.GetStreamKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } if !reflect.DeepEqual(expectedKeyValPairs, keyValPairs) { t.Errorf("maps are not equal. expected: %+v, got: %+v", expectedKeyValPairs, keyValPairs) @@ -1018,7 +1018,7 @@ func TestKeyValueStream(t *testing.T) { err = c.AddStreamKeyValPair(zoneName, "key2", "val2") if err != nil { - t.Errorf("error adding another key/val pair: %v", err) + t.Errorf("error adding another key/val pair: %w", err) } err = c.DeleteStreamKeyValuePair(zoneName, "key1") @@ -1028,7 +1028,7 @@ func TestKeyValueStream(t *testing.T) { keyValPairs, err = c.GetStreamKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } expectedKeyValPairs2 := client.KeyValPairs{ "key2": "val2", @@ -1039,12 +1039,12 @@ func TestKeyValueStream(t *testing.T) { err = c.DeleteStreamKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't delete all: %v", err) + t.Errorf("couldn't delete all: %w", err) } keyValPairs, err = c.GetStreamKeyValPairs(zoneName) if err != nil { - t.Errorf("couldn't get keyval: %v", err) + t.Errorf("couldn't get keyval: %w", err) } if len(keyValPairs) > 0 { t.Errorf("zone should be empty after bulk delete") @@ -1070,7 +1070,7 @@ func TestStreamZoneSync(t *testing.T) { err = c1.AddStreamKeyValPair(streamZoneSync, "key1", "val1") if err != nil { - t.Errorf("Couldn't set keyvals: %v", err) + t.Errorf("Couldn't set keyvals: %w", err) } // wait for nodes to sync information of synced zones @@ -1078,7 +1078,7 @@ func TestStreamZoneSync(t *testing.T) { statsC1, err := c1.GetStats() if err != nil { - t.Errorf("Error getting stats: %v", err) + t.Errorf("Error getting stats: %w", err) } if statsC1.StreamZoneSync == nil { @@ -1118,7 +1118,7 @@ func TestStreamZoneSync(t *testing.T) { statsC2, err := c2.GetStats() if err != nil { - t.Errorf("Error getting stats: %v", err) + t.Errorf("Error getting stats: %w", err) } if statsC2.StreamZoneSync == nil { From 96fe4ae13b6121defc7e2d799b27035f7c2a94ea Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 21 Jun 2021 17:51:34 -0700 Subject: [PATCH 4/6] Fix spelling error --- tests/client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client_test.go b/tests/client_test.go index bbdd6671..7fc0c642 100644 --- a/tests/client_test.go +++ b/tests/client_test.go @@ -640,7 +640,7 @@ func TestStats(t *testing.T) { t.Errorf("Slab slots not visible in stats: %v", val.Slots) } } else { - t.Errorf("Slab stats for upsteam '%v' not found", upstream) + t.Errorf("Slab stats for upstream '%v' not found", upstream) } if stats.HTTPRequests.Total < 1 { From 4c929dd37ac9393b6c52b1c7083d64ebf4775d26 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 21 Jun 2021 17:59:31 -0700 Subject: [PATCH 5/6] Use NewRequestWithContext --- client/nginx.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/client/nginx.go b/client/nginx.go index dbe25ec5..cccca383 100644 --- a/client/nginx.go +++ b/client/nginx.go @@ -2,6 +2,7 @@ package client import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -10,6 +11,7 @@ import ( "net/http" "reflect" "strings" + "time" ) const ( @@ -752,9 +754,12 @@ func (client *NginxClient) post(path string, input interface{}) error { } func (client *NginxClient) delete(path string, expectedStatusCode int) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + path = fmt.Sprintf("%v/%v/%v/", client.apiEndpoint, client.version, path) - req, err := http.NewRequest(http.MethodDelete, path, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodDelete, path, nil) if err != nil { return fmt.Errorf("failed to create a delete request: %w", err) } @@ -774,6 +779,9 @@ func (client *NginxClient) delete(path string, expectedStatusCode int) error { } func (client *NginxClient) patch(path string, input interface{}, expectedStatusCode int) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + path = fmt.Sprintf("%v/%v/%v/", client.apiEndpoint, client.version, path) jsonInput, err := json.Marshal(input) @@ -781,7 +789,7 @@ func (client *NginxClient) patch(path string, input interface{}, expectedStatusC return fmt.Errorf("failed to marshall input: %w", err) } - req, err := http.NewRequest(http.MethodPatch, path, bytes.NewBuffer(jsonInput)) + req, err := http.NewRequestWithContext(ctx, http.MethodPatch, path, bytes.NewBuffer(jsonInput)) if err != nil { return fmt.Errorf("failed to create a patch request: %w", err) } From 7b5e5ed4c91d6eb5684d3ddb57f4ca3c72254dd7 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Tue, 22 Jun 2021 14:39:48 -0700 Subject: [PATCH 6/6] Add ctx to http requests --- client/nginx.go | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/client/nginx.go b/client/nginx.go index cccca383..7d481c12 100644 --- a/client/nginx.go +++ b/client/nginx.go @@ -459,11 +459,17 @@ func versionSupported(n int) bool { } func getAPIVersions(httpClient *http.Client, endpoint string) (*versions, error) { - resp, err := httpClient.Get(endpoint) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) + if err != nil { + return nil, fmt.Errorf("failed to create a get request: %w", err) + } + resp, err := httpClient.Do(req) if err != nil { return nil, fmt.Errorf("%v is not accessible: %w", endpoint, err) } - defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("%v is not accessible: expected %v response, got %v", endpoint, http.StatusOK, resp.StatusCode) @@ -707,12 +713,20 @@ func (client *NginxClient) getIDOfHTTPServer(upstream string, name string) (int, } func (client *NginxClient) get(path string, data interface{}) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + url := fmt.Sprintf("%v/%v/%v", client.apiEndpoint, client.version, path) - resp, err := client.httpClient.Get(url) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return fmt.Errorf("failed to create a get request: %w", err) + } + + resp, err := client.httpClient.Do(req) if err != nil { return fmt.Errorf("failed to get %v: %w", path, err) } - defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return createResponseMismatchError(resp.Body).Wrap(fmt.Sprintf( "expected %v response, got %v", @@ -732,6 +746,9 @@ func (client *NginxClient) get(path string, data interface{}) error { } func (client *NginxClient) post(path string, input interface{}) error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + url := fmt.Sprintf("%v/%v/%v", client.apiEndpoint, client.version, path) jsonInput, err := json.Marshal(input) @@ -739,11 +756,16 @@ func (client *NginxClient) post(path string, input interface{}) error { return fmt.Errorf("failed to marshall input: %w", err) } - resp, err := client.httpClient.Post(url, "application/json", bytes.NewBuffer(jsonInput)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewBuffer(jsonInput)) + if err != nil { + return fmt.Errorf("failed to create a post request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := client.httpClient.Do(req) if err != nil { return fmt.Errorf("failed to post %v: %w", path, err) } - defer resp.Body.Close() if resp.StatusCode != http.StatusCreated { return createResponseMismatchError(resp.Body).Wrap(fmt.Sprintf( "expected %v response, got %v", @@ -768,8 +790,6 @@ func (client *NginxClient) delete(path string, expectedStatusCode int) error { if err != nil { return fmt.Errorf("failed to create delete request: %w", err) } - defer resp.Body.Close() - if resp.StatusCode != expectedStatusCode { return createResponseMismatchError(resp.Body).Wrap(fmt.Sprintf( "failed to complete delete request: expected %v response, got %v",