You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by zh...@apache.org on 2021/10/09 07:20:58 UTC

[apisix-ingress-controller] branch master updated: feat: Change field retries to value from pointer. (#647)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new a01888b  feat: Change field retries to value from pointer. (#647)
a01888b is described below

commit a01888bd195f59ae08a5e1399dd26f2ac438880a
Author: chen zhuo <ch...@126.com>
AuthorDate: Sat Oct 9 15:20:50 2021 +0800

    feat: Change field retries to value from pointer. (#647)
    
    Co-authored-by: zhuo.chen <zh...@upai.com>
    Co-authored-by: Jintao Zhang <zh...@gmail.com>
---
 pkg/ingress/manifest_test.go                       | 15 ++--
 pkg/kube/apisix/apis/config/v1/types.go            |  2 +-
 .../apisix/apis/config/v1/zz_generated.deepcopy.go |  5 ++
 pkg/kube/translation/apisix_upstream.go            |  4 +-
 pkg/kube/translation/apisix_upstream_test.go       | 14 ++--
 pkg/types/apisix/v1/types.go                       |  2 +-
 pkg/types/apisix/v1/zz_generated.deepcopy.go       |  5 ++
 .../features/{retries_timeout.go => retries.go}    | 88 +++++++++++++++++-----
 8 files changed, 101 insertions(+), 34 deletions(-)

diff --git a/pkg/ingress/manifest_test.go b/pkg/ingress/manifest_test.go
index 3ad5e3a..8f8b285 100644
--- a/pkg/ingress/manifest_test.go
+++ b/pkg/ingress/manifest_test.go
@@ -121,6 +121,7 @@ func TestDiffStreamRoutes(t *testing.T) {
 }
 
 func TestDiffUpstreams(t *testing.T) {
+	retries := 3
 	news := []*apisixv1.Upstream{
 		{
 			Metadata: apisixv1.Metadata{
@@ -131,7 +132,7 @@ func TestDiffUpstreams(t *testing.T) {
 			Metadata: apisixv1.Metadata{
 				ID: "3",
 			},
-			Retries: 3,
+			Retries: &retries,
 		},
 	}
 	added, updated, deleted := diffUpstreams(nil, news)
@@ -140,8 +141,9 @@ func TestDiffUpstreams(t *testing.T) {
 	assert.Len(t, added, 2)
 	assert.Equal(t, added[0].ID, "1")
 	assert.Equal(t, added[1].ID, "3")
-	assert.Equal(t, added[1].Retries, 3)
+	assert.Equal(t, *added[1].Retries, 3)
 
+	retries1 := 5
 	olds := []*apisixv1.Upstream{
 		{
 			Metadata: apisixv1.Metadata{
@@ -152,7 +154,7 @@ func TestDiffUpstreams(t *testing.T) {
 			Metadata: apisixv1.Metadata{
 				ID: "3",
 			},
-			Retries: 5,
+			Retries: &retries1,
 			Timeout: &apisixv1.UpstreamTimeout{
 				Connect: 10,
 			},
@@ -164,7 +166,7 @@ func TestDiffUpstreams(t *testing.T) {
 	assert.Len(t, deleted, 2)
 	assert.Equal(t, deleted[0].ID, "2")
 	assert.Equal(t, deleted[1].ID, "3")
-	assert.Equal(t, deleted[1].Retries, 5)
+	assert.Equal(t, *deleted[1].Retries, 5)
 	assert.Equal(t, deleted[1].Timeout.Connect, 10)
 
 	added, updated, deleted = diffUpstreams(olds, news)
@@ -173,12 +175,13 @@ func TestDiffUpstreams(t *testing.T) {
 	assert.Len(t, updated, 1)
 	assert.Equal(t, updated[0].ID, "3")
 	assert.Nil(t, updated[0].Timeout)
-	assert.Equal(t, updated[0].Retries, 3)
+	assert.Equal(t, *updated[0].Retries, 3)
 	assert.Len(t, deleted, 1)
 	assert.Equal(t, deleted[0].ID, "2")
 }
 
 func TestManifestDiff(t *testing.T) {
+	retries := 2
 	m := &manifest{
 		routes: []*apisixv1.Route{
 			{
@@ -198,7 +201,7 @@ func TestManifestDiff(t *testing.T) {
 				Metadata: apisixv1.Metadata{
 					ID: "4",
 				},
-				Retries: 2,
+				Retries: &retries,
 			},
 		},
 	}
diff --git a/pkg/kube/apisix/apis/config/v1/types.go b/pkg/kube/apisix/apis/config/v1/types.go
index 61d9f3f..5c212a5 100644
--- a/pkg/kube/apisix/apis/config/v1/types.go
+++ b/pkg/kube/apisix/apis/config/v1/types.go
@@ -113,7 +113,7 @@ type ApisixUpstreamConfig struct {
 	// How many times that the proxy (Apache APISIX) should do when
 	// errors occur (error, timeout or bad http status codes like 500, 502).
 	// +optional
-	Retries int `json:"retries,omitempty" yaml:"retries,omitempty"`
+	Retries *int `json:"retries,omitempty" yaml:"retries,omitempty"`
 
 	// Timeout settings for the read, send and connect to the upstream.
 	// +optional
diff --git a/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go b/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go
index 2dfed52..5775017 100644
--- a/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go
+++ b/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go
@@ -347,6 +347,11 @@ func (in *ApisixUpstreamConfig) DeepCopyInto(out *ApisixUpstreamConfig) {
 		*out = new(LoadBalancer)
 		**out = **in
 	}
+	if in.Retries != nil {
+		in, out := &in.Retries, &out.Retries
+		*out = new(int)
+		**out = **in
+	}
 	if in.Timeout != nil {
 		in, out := &in.Timeout, &out.Timeout
 		*out = new(UpstreamTimeout)
diff --git a/pkg/kube/translation/apisix_upstream.go b/pkg/kube/translation/apisix_upstream.go
index 40fd598..d0e5b87 100644
--- a/pkg/kube/translation/apisix_upstream.go
+++ b/pkg/kube/translation/apisix_upstream.go
@@ -19,8 +19,8 @@ import (
 	apisixv1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
 )
 
-func (t *translator) translateUpstreamRetriesAndTimeout(retries int, timeout *configv1.UpstreamTimeout, ups *apisixv1.Upstream) error {
-	if retries < 0 {
+func (t *translator) translateUpstreamRetriesAndTimeout(retries *int, timeout *configv1.UpstreamTimeout, ups *apisixv1.Upstream) error {
+	if retries != nil && *retries < 0 {
 		return &translateError{
 			field:  "retries",
 			reason: "invalid value",
diff --git a/pkg/kube/translation/apisix_upstream_test.go b/pkg/kube/translation/apisix_upstream_test.go
index 0dc2703..2293838 100644
--- a/pkg/kube/translation/apisix_upstream_test.go
+++ b/pkg/kube/translation/apisix_upstream_test.go
@@ -372,22 +372,25 @@ func TestTranslateUpstreamActiveHealthCheckUnusually(t *testing.T) {
 
 func TestUpstreamRetriesAndTimeout(t *testing.T) {
 	tr := &translator{}
-	err := tr.translateUpstreamRetriesAndTimeout(-1, nil, nil)
+	retries := -1
+	err := tr.translateUpstreamRetriesAndTimeout(&retries, nil, nil)
 	assert.Equal(t, err, &translateError{
 		field:  "retries",
 		reason: "invalid value",
 	})
 
 	var ups apisixv1.Upstream
-	err = tr.translateUpstreamRetriesAndTimeout(3, nil, &ups)
+	retries = 3
+	err = tr.translateUpstreamRetriesAndTimeout(&retries, nil, &ups)
 	assert.Nil(t, err)
-	assert.Equal(t, ups.Retries, 3)
+	assert.Equal(t, *ups.Retries, 3)
 
 	timeout := &configv1.UpstreamTimeout{
 		Connect: metav1.Duration{Duration: time.Second},
 		Read:    metav1.Duration{Duration: -1},
 	}
-	err = tr.translateUpstreamRetriesAndTimeout(3, timeout, &ups)
+	retries = 3
+	err = tr.translateUpstreamRetriesAndTimeout(&retries, timeout, &ups)
 	assert.Equal(t, err, &translateError{
 		field:  "timeout.read",
 		reason: "invalid value",
@@ -397,7 +400,8 @@ func TestUpstreamRetriesAndTimeout(t *testing.T) {
 		Connect: metav1.Duration{Duration: time.Second},
 		Read:    metav1.Duration{Duration: 15 * time.Second},
 	}
-	err = tr.translateUpstreamRetriesAndTimeout(3, timeout, &ups)
+	retries = 3
+	err = tr.translateUpstreamRetriesAndTimeout(&retries, timeout, &ups)
 	assert.Nil(t, err)
 	assert.Equal(t, ups.Timeout, &apisixv1.UpstreamTimeout{
 		Connect: 1,
diff --git a/pkg/types/apisix/v1/types.go b/pkg/types/apisix/v1/types.go
index 5838028..a9b127f 100644
--- a/pkg/types/apisix/v1/types.go
+++ b/pkg/types/apisix/v1/types.go
@@ -182,7 +182,7 @@ type Upstream struct {
 	Checks  *UpstreamHealthCheck `json:"checks,omitempty" yaml:"checks,omitempty"`
 	Nodes   UpstreamNodes        `json:"nodes" yaml:"nodes"`
 	Scheme  string               `json:"scheme,omitempty" yaml:"scheme,omitempty"`
-	Retries int                  `json:"retries,omitempty" yaml:"retries,omitempty"`
+	Retries *int                 `json:"retries,omitempty" yaml:"retries,omitempty"`
 	Timeout *UpstreamTimeout     `json:"timeout,omitempty" yaml:"timeout,omitempty"`
 }
 
diff --git a/pkg/types/apisix/v1/zz_generated.deepcopy.go b/pkg/types/apisix/v1/zz_generated.deepcopy.go
index 0ca8e2c..7115b74 100644
--- a/pkg/types/apisix/v1/zz_generated.deepcopy.go
+++ b/pkg/types/apisix/v1/zz_generated.deepcopy.go
@@ -438,6 +438,11 @@ func (in *Upstream) DeepCopyInto(out *Upstream) {
 		*out = make(UpstreamNodes, len(*in))
 		copy(*out, *in)
 	}
+	if in.Retries != nil {
+		in, out := &in.Retries, &out.Retries
+		*out = new(int)
+		**out = **in
+	}
 	if in.Timeout != nil {
 		in, out := &in.Timeout, &out.Timeout
 		*out = new(UpstreamTimeout)
diff --git a/test/e2e/features/retries_timeout.go b/test/e2e/features/retries.go
similarity index 67%
rename from test/e2e/features/retries_timeout.go
rename to test/e2e/features/retries.go
index 6366ffa..f81d08e 100644
--- a/test/e2e/features/retries_timeout.go
+++ b/test/e2e/features/retries.go
@@ -33,22 +33,8 @@ var _ = ginkgo.Describe("retries", func() {
 		APISIXRouteVersion:    "apisix.apache.org/v2beta2",
 	}
 	s := scaffold.NewScaffold(opts)
-	ginkgo.It("active check", func() {
-		backendSvc, backendPorts := s.DefaultHTTPBackend()
 
-		au := fmt.Sprintf(`
-apiVersion: apisix.apache.org/v1
-kind: ApisixUpstream
-metadata:
-  name: %s
-spec:
-  retries: 3
-`, backendSvc)
-		err := s.CreateResourceFromString(au)
-		assert.Nil(ginkgo.GinkgoT(), err, "create ApisixUpstream")
-		time.Sleep(2 * time.Second)
-
-		ar := fmt.Sprintf(`
+	routeTpl := `
 apiVersion: apisix.apache.org/v2beta2
 kind: ApisixRoute
 metadata:
@@ -64,19 +50,83 @@ spec:
     backends:
     - serviceName: %s
       servicePort: %d
-`, backendSvc, backendPorts[0])
-		err = s.CreateResourceFromString(ar)
+`
+	ginkgo.It("is missing", func() {
+		backendSvc, backendPorts := s.DefaultHTTPBackend()
+		ar := fmt.Sprintf(routeTpl, backendSvc, backendPorts[0])
+		err := s.CreateResourceFromString(ar)
 		assert.Nil(ginkgo.GinkgoT(), err)
 		time.Sleep(5 * time.Second)
 
+		au := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v1
+kind: ApisixUpstream
+metadata:
+  name: %s
+spec:
+`, backendSvc)
+		err = s.CreateResourceFromString(au)
+		assert.Nil(ginkgo.GinkgoT(), err, "create ApisixUpstream")
+		time.Sleep(2 * time.Second)
+
+		ups, err := s.ListApisixUpstreams()
+		assert.Nil(ginkgo.GinkgoT(), err)
+		assert.Len(ginkgo.GinkgoT(), ups, 1)
+		assert.Nil(ginkgo.GinkgoT(), ups[0].Retries)
+	})
+
+	ginkgo.It("is zero", func() {
+		backendSvc, backendPorts := s.DefaultHTTPBackend()
+		ar := fmt.Sprintf(routeTpl, backendSvc, backendPorts[0])
+		err := s.CreateResourceFromString(ar)
+		assert.Nil(ginkgo.GinkgoT(), err)
+		time.Sleep(5 * time.Second)
+
+		au := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v1
+kind: ApisixUpstream
+metadata:
+  name: %s
+spec:
+  retries: 0
+`, backendSvc)
+		err = s.CreateResourceFromString(au)
+		assert.Nil(ginkgo.GinkgoT(), err, "create ApisixUpstream")
+		time.Sleep(2 * time.Second)
+
+		ups, err := s.ListApisixUpstreams()
+		assert.Nil(ginkgo.GinkgoT(), err)
+		assert.Len(ginkgo.GinkgoT(), ups, 1)
+		assert.Equal(ginkgo.GinkgoT(), *ups[0].Retries, 0)
+	})
+
+	ginkgo.It("is a positive number", func() {
+		backendSvc, backendPorts := s.DefaultHTTPBackend()
+		ar := fmt.Sprintf(routeTpl, backendSvc, backendPorts[0])
+		err := s.CreateResourceFromString(ar)
+		assert.Nil(ginkgo.GinkgoT(), err)
+		time.Sleep(5 * time.Second)
+
+		au := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v1
+kind: ApisixUpstream
+metadata:
+  name: %s
+spec:
+  retries: 3
+`, backendSvc)
+		err = s.CreateResourceFromString(au)
+		assert.Nil(ginkgo.GinkgoT(), err, "create ApisixUpstream")
+		time.Sleep(2 * time.Second)
+
 		ups, err := s.ListApisixUpstreams()
 		assert.Nil(ginkgo.GinkgoT(), err)
 		assert.Len(ginkgo.GinkgoT(), ups, 1)
-		assert.Equal(ginkgo.GinkgoT(), ups[0].Retries, 3)
+		assert.Equal(ginkgo.GinkgoT(), *ups[0].Retries, 3)
 	})
 })
 
-var _ = ginkgo.Describe("timeout", func() {
+var _ = ginkgo.Describe("retries timeout", func() {
 	opts := &scaffold.Options{
 		Name:                  "default",
 		Kubeconfig:            scaffold.GetKubeconfig(),