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

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git


The following commit(s) were added to refs/heads/main by this push:
     new 64b81f3  Support retry strategy to vefify (#21)
64b81f3 is described below

commit 64b81f3f291026bba3d857c02a9bb6caba0b67e0
Author: mrproliu <[email protected]>
AuthorDate: Mon Jun 21 19:14:10 2021 +0800

    Support retry strategy to vefify (#21)
---
 commands/verify/verify.go    | 35 ++++++++++++++++++++++++++++-------
 examples/compose/e2e.yaml    | 19 +++++++++++++------
 examples/kind/e2e.yaml       | 23 +++++++++++++++--------
 internal/config/e2eConfig.go | 18 ++++++++++++++----
 4 files changed, 70 insertions(+), 25 deletions(-)

diff --git a/commands/verify/verify.go b/commands/verify/verify.go
index 972769a..3307f43 100644
--- a/commands/verify/verify.go
+++ b/commands/verify/verify.go
@@ -19,6 +19,7 @@ package verify
 
 import (
        "fmt"
+       "time"
 
        "github.com/apache/skywalking-infra-e2e/internal/components/verifier"
        "github.com/apache/skywalking-infra-e2e/internal/config"
@@ -91,14 +92,34 @@ func DoVerifyAccordingConfig() error {
 
        e2eConfig := config.GlobalConfig.E2EConfig
 
-       for _, v := range e2eConfig.Verify {
-               if v.GetExpected() != "" {
-                       if err := verifySingleCase(v.GetExpected(), 
v.GetActual(), v.Query); err != nil {
-                               return err
+       retryCount := e2eConfig.Verify.RetryStrategy.Count
+       if retryCount <= 0 {
+               retryCount = 1
+       }
+       retryInterval := e2eConfig.Verify.RetryStrategy.Interval
+       if retryInterval < 0 {
+               retryInterval = 1000
+       }
+
+       var err error
+       for current := 1; current <= retryCount; current++ {
+               for _, v := range e2eConfig.Verify.Cases {
+                       if v.GetExpected() != "" {
+                               if err = verifySingleCase(v.GetExpected(), 
v.GetActual(), v.Query); err != nil {
+                                       break
+                               }
+                       } else {
+                               return fmt.Errorf("the expected data file is 
not specified")
                        }
-               } else {
-                       logger.Log.Error("the expected data file is not 
specified")
+               }
+
+               if err != nil && current != retryCount {
+                       logger.Log.Warnf("verify case failure, will continue 
retry, %v", err)
+                       time.Sleep(time.Duration(retryInterval) * 
time.Millisecond)
+               } else if err == nil {
+                       return nil
                }
        }
-       return nil
+
+       return err
 }
diff --git a/examples/compose/e2e.yaml b/examples/compose/e2e.yaml
index b676518..459a586 100644
--- a/examples/compose/e2e.yaml
+++ b/examples/compose/e2e.yaml
@@ -32,9 +32,16 @@ trigger:
   method: GET
 
 verify:
-  - actual: ../../test/verify/1.actual.yaml
-    expected: ../../test/verify/1.expected.yaml
-  - actual: ../../test/verify/2.actual.yaml
-    expected: ../../test/verify/2.expected.yaml
-  - query: swctl --display yaml 
--base-url=http://127.0.0.1:${oap_12800}/graphql service ls
-    expected: ../../test/verify/3.expected.yaml
\ No newline at end of file
+  # verify with retry strategy
+  retry:
+    # max retry count
+    count: 10
+    # the interval between two retries, in millisecond.
+    interval: 10000
+  cases:
+    - actual: ../../test/verify/1.actual.yaml
+      expected: ../../test/verify/1.expected.yaml
+    - actual: ../../test/verify/2.actual.yaml
+      expected: ../../test/verify/2.expected.yaml
+    - query: swctl --display yaml 
--base-url=http://127.0.0.1:${oap_12800}/graphql service ls
+      expected: ../../test/verify/3.expected.yaml
\ No newline at end of file
diff --git a/examples/kind/e2e.yaml b/examples/kind/e2e.yaml
index 7dc69f1..107ffea 100644
--- a/examples/kind/e2e.yaml
+++ b/examples/kind/e2e.yaml
@@ -56,11 +56,18 @@ trigger:
   method: GET
 
 verify:
-  - actual: ../../test/verify/1.actual.yaml
-    expected: ../../test/verify/1.expected.yaml
-  - actual: ../../test/verify/2.actual.yaml
-    expected: ../../test/verify/2.expected.yaml
-  - actual: ../../test/verify/1.actual.yaml
-    expected: ../../test/verify/2.expected.yaml
-  - query: swctl --display yaml service ls
-    expected: ../../test/verify/3.expected.yaml
+  # verify with retry strategy
+  retry:
+    # max retry count
+    count: 10
+    # the interval between two retries, in millisecond.
+    interval: 10000
+  cases:
+    - actual: ../../test/verify/1.actual.yaml
+      expected: ../../test/verify/1.expected.yaml
+    - actual: ../../test/verify/2.actual.yaml
+      expected: ../../test/verify/2.expected.yaml
+    - actual: ../../test/verify/1.actual.yaml
+      expected: ../../test/verify/2.expected.yaml
+    - query: swctl --display yaml service ls
+      expected: ../../test/verify/3.expected.yaml
diff --git a/internal/config/e2eConfig.go b/internal/config/e2eConfig.go
index dfbc617..8554c9d 100644
--- a/internal/config/e2eConfig.go
+++ b/internal/config/e2eConfig.go
@@ -22,10 +22,10 @@ import 
"github.com/apache/skywalking-infra-e2e/internal/util"
 
 // E2EConfig corresponds to configuration file e2e.yaml.
 type E2EConfig struct {
-       Setup   Setup        `yaml:"setup"`
-       Cleanup Cleanup      `yaml:"cleanup"`
-       Trigger Trigger      `yaml:"trigger"`
-       Verify  []VerifyCase `yaml:"verify"`
+       Setup   Setup   `yaml:"setup"`
+       Cleanup Cleanup `yaml:"cleanup"`
+       Trigger Trigger `yaml:"trigger"`
+       Verify  Verify  `yaml:"verify"`
 }
 
 type Setup struct {
@@ -46,6 +46,11 @@ type Step struct {
        Waits   []Wait `yaml:"wait"`
 }
 
+type Verify struct {
+       RetryStrategy VerifyRetryStrategy `yaml:"retry"`
+       Cases         []VerifyCase        `yaml:"cases"`
+}
+
 func (s *Setup) GetFile() string {
        return util.ResolveAbs(s.File)
 }
@@ -81,6 +86,11 @@ type VerifyCase struct {
        Expected string `yaml:"expected"`
 }
 
+type VerifyRetryStrategy struct {
+       Count    int `yaml:"count"`
+       Interval int `yaml:"interval"`
+}
+
 // GetActual resolves the absolute file path of the actual data file.
 func (v *VerifyCase) GetActual() string {
        return util.ResolveAbs(v.Actual)

Reply via email to