You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2022/02/01 10:00:24 UTC

[apisix-dashboard] branch master updated: fix: retries field to support zero value (#2298)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 49c3a92  fix: retries field to support zero value (#2298)
49c3a92 is described below

commit 49c3a923bbd2133fbb25627dc9d96530c206699e
Author: Chunxiang Yan (Chauncey) <Ch...@gmail.com>
AuthorDate: Tue Feb 1 18:00:16 2022 +0800

    fix: retries field to support zero value (#2298)
---
 api/internal/core/entity/entity.go         |  2 +-
 api/internal/core/entity/format_test.go    | 25 +++++++++++
 api/test/e2enew/upstream/upstream_retry.go | 69 ++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/api/internal/core/entity/entity.go b/api/internal/core/entity/entity.go
index 7472c14..4f06770 100644
--- a/api/internal/core/entity/entity.go
+++ b/api/internal/core/entity/entity.go
@@ -163,7 +163,7 @@ type UpstreamKeepalivePool struct {
 
 type UpstreamDef struct {
 	Nodes         interface{}            `json:"nodes,omitempty"`
-	Retries       int                    `json:"retries,omitempty"`
+	Retries       *int                   `json:"retries,omitempty"`
 	Timeout       *Timeout               `json:"timeout,omitempty"`
 	Type          string                 `json:"type,omitempty"`
 	Checks        interface{}            `json:"checks,omitempty"`
diff --git a/api/internal/core/entity/format_test.go b/api/internal/core/entity/format_test.go
index ec285a0..56e2458 100644
--- a/api/internal/core/entity/format_test.go
+++ b/api/internal/core/entity/format_test.go
@@ -179,3 +179,28 @@ func TestNodesFormat_no_nodes(t *testing.T) {
 	jsonStr := string(res)
 	assert.Contains(t, jsonStr, `null`)
 }
+
+func TestUpstream_nil_and_zero_retries(t *testing.T) {
+	ud0 := UpstreamDef{}
+	// Unmarshal from zero value
+	err := json.Unmarshal([]byte(`{"retries":0}`), &ud0)
+	assert.Nil(t, err)
+	assert.Equal(t, *ud0.Retries, 0)
+
+	// Marshal with zero value
+	marshaled, err := json.Marshal(ud0)
+	assert.Nil(t, err)
+	assert.Contains(t, string(marshaled), `"retries":0`)
+
+	udNull := UpstreamDef{}
+
+	// Unmarshal from null value
+	err = json.Unmarshal([]byte(`{}`), &udNull)
+	assert.Nil(t, err)
+	assert.Nil(t, udNull.Retries)
+
+	// Marshal to null value
+	marshaledNull, err := json.Marshal(udNull)
+	assert.Nil(t, err)
+	assert.Equal(t, string(marshaledNull), `{}`)
+}
diff --git a/api/test/e2enew/upstream/upstream_retry.go b/api/test/e2enew/upstream/upstream_retry.go
index adb81bb..9805624 100644
--- a/api/test/e2enew/upstream/upstream_retry.go
+++ b/api/test/e2enew/upstream/upstream_retry.go
@@ -60,4 +60,73 @@ var _ = ginkgo.Describe("Upstream keepalive pool", func() {
 			ExpectStatus: http.StatusOK,
 		})
 	})
+	ginkgo.It("zero retry field", func() {
+		createUpstreamBody := make(map[string]interface{})
+		createUpstreamBody["nodes"] = []map[string]interface{}{
+			{
+				"host":   base.UpstreamIp,
+				"port":   1980,
+				"weight": 1,
+			}}
+		createUpstreamBody["type"] = "roundrobin"
+		createUpstreamBody["retries"] = 0
+		createUpstreamBody["retry_timeout"] = 5.5
+		_createUpstreamBody, err := json.Marshal(createUpstreamBody)
+		gomega.Expect(err).To(gomega.BeNil())
+		base.RunTestCase(base.HttpTestCase{
+			Object:       base.ManagerApiExpect(),
+			Method:       http.MethodPut,
+			Path:         "/apisix/admin/upstreams/zero-retry",
+			Body:         string(_createUpstreamBody),
+			Headers:      map[string]string{"Authorization": base.GetToken()},
+			ExpectStatus: http.StatusOK,
+		})
+		base.RunTestCase(base.HttpTestCase{
+			Object:       base.ManagerApiExpect(),
+			Method:       http.MethodGet,
+			Path:         "/apisix/admin/upstreams/zero-retry",
+			Body:         string(_createUpstreamBody),
+			Headers:      map[string]string{"Authorization": base.GetToken()},
+			ExpectStatus: http.StatusOK,
+			ExpectBody:   `"retries":0`,
+		})
+	})
+	ginkgo.It("nil retry field", func() {
+		createUpstreamBody := make(map[string]interface{})
+		createUpstreamBody["nodes"] = []map[string]interface{}{
+			{
+				"host":   base.UpstreamIp,
+				"port":   1980,
+				"weight": 1,
+			}}
+		createUpstreamBody["type"] = "roundrobin"
+		_createUpstreamBody, err := json.Marshal(createUpstreamBody)
+		gomega.Expect(err).To(gomega.BeNil())
+		base.RunTestCase(base.HttpTestCase{
+			Object:       base.ManagerApiExpect(),
+			Method:       http.MethodPut,
+			Path:         "/apisix/admin/upstreams/zero-retry",
+			Body:         string(_createUpstreamBody),
+			Headers:      map[string]string{"Authorization": base.GetToken()},
+			ExpectStatus: http.StatusOK,
+		})
+		base.RunTestCase(base.HttpTestCase{
+			Object:       base.ManagerApiExpect(),
+			Method:       http.MethodGet,
+			Path:         "/apisix/admin/upstreams/zero-retry",
+			Headers:      map[string]string{"Authorization": base.GetToken()},
+			ExpectStatus: http.StatusOK,
+			UnexpectBody: `"retries"`,
+		})
+	})
+	ginkgo.It("delete upstream", func() {
+		base.RunTestCase(base.HttpTestCase{
+			Object:       base.ManagerApiExpect(),
+			Method:       http.MethodDelete,
+			Path:         "/apisix/admin/upstreams/zero-retry",
+			Headers:      map[string]string{"Authorization": base.GetToken()},
+			ExpectStatus: http.StatusOK,
+		})
+	})
+
 })