You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/10/25 09:16:56 UTC

[skywalking-infra-e2e] branch bugfix/kind/ready created (now 31aa9e9)

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

kezhenxu94 pushed a change to branch bugfix/kind/ready
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git.


      at 31aa9e9  Migrate timeout config to Duration style and wait for node ready in KinD setup

This branch includes the following new commits:

     new 31aa9e9  Migrate timeout config to Duration style and wait for node ready in KinD setup

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[skywalking-infra-e2e] 01/01: Migrate timeout config to Duration style and wait for node ready in KinD setup

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch bugfix/kind/ready
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git

commit 31aa9e974d61846612fa47f9896d456d53279d75
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Mon Oct 25 17:16:46 2021 +0800

    Migrate timeout config to Duration style and wait for node ready in KinD setup
---
 README.md                            |  4 +--
 commands/verify/verify.go            |  1 +
 docs/en/setup/Configuration-File.md  |  4 +--
 examples/compose/e2e.yaml            |  2 +-
 examples/kind/e2e.yaml               |  2 +-
 examples/reusing_cases/e2e.yaml      |  4 +--
 internal/components/setup/common.go  |  9 +-----
 internal/components/setup/compose.go | 19 ++---------
 internal/components/setup/kind.go    | 19 +++++++----
 internal/config/e2eConfig.go         | 63 ++++++++++++++++++++++++++++++++----
 internal/config/globalConfig.go      |  4 +++
 11 files changed, 85 insertions(+), 46 deletions(-)

diff --git a/README.md b/README.md
index 302e29d..353c74f 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ SkyWalking Infra E2E is the next generation End-to-End Testing framework that ai
 
 To use skywalking-infra-e2e in GitHub Actions, add a step in your GitHub workflow.
 
-```xml
+```yaml
 - name: Run E2E Test
   uses: apache/skywalking-infra-e2e@main      # always prefer to use a revision instead of `main`.
   with:
@@ -30,4 +30,4 @@ To use skywalking-infra-e2e in GitHub Actions, add a step in your GitHub workflo
 * Submit [an issue](https://github.com/apache/skywalking/issues/new) by using [INFRA] as title prefix.
 * Mail list: **dev@skywalking.apache.org**. Mail to dev-subscribe@skywalking.apache.org, follow the reply to subscribe the mail list.
 * Join `skywalking` channel at [Apache Slack](http://s.apache.org/slack-invite). If the link is not working, find the latest one at [Apache INFRA WIKI](https://cwiki.apache.org/confluence/display/INFRA/Slack+Guest+Invites).
-* Twitter, [ASFSkyWalking](https://twitter.com/ASFSkyWalking)
\ No newline at end of file
+* Twitter, [ASFSkyWalking](https://twitter.com/ASFSkyWalking)
diff --git a/commands/verify/verify.go b/commands/verify/verify.go
index 996bb73..740c4c3 100644
--- a/commands/verify/verify.go
+++ b/commands/verify/verify.go
@@ -120,6 +120,7 @@ func DoVerifyAccordingConfig() error {
 	return nil
 }
 
+// TODO remove this in 2.0.0
 func parseInterval(retryInterval interface{}) (time.Duration, error) {
 	var interval time.Duration
 	var err error
diff --git a/docs/en/setup/Configuration-File.md b/docs/en/setup/Configuration-File.md
index f890599..92c191f 100644
--- a/docs/en/setup/Configuration-File.md
+++ b/docs/en/setup/Configuration-File.md
@@ -25,7 +25,7 @@ Support two kinds of the environment to set up the system.
 setup:
   env: kind
   file: path/to/kind.yaml               # Specified kinD manifest file path
-  timeout: 1200                         # timeout second
+  timeout: 20m                          # timeout second
   init-system-environment: path/to/env  # Import environment file
   steps:                                # customize steps for prepare the environment
     - name: customize setups            # step name
@@ -91,7 +91,7 @@ If you want to access the resource from host, should follow these steps:
 setup:
   env: compose
   file: path/to/compose.yaml            # Specified docker-compose file path
-  timeout: 1200                         # Timeout second
+  timeout: 20m                          # Timeout duration
   init-system-environment: path/to/env  # Import environment file
   steps:                                # Customize steps for prepare the environment
     - name: customize setups            # Step name
diff --git a/examples/compose/e2e.yaml b/examples/compose/e2e.yaml
index fd6348e..397a7a6 100644
--- a/examples/compose/e2e.yaml
+++ b/examples/compose/e2e.yaml
@@ -18,7 +18,7 @@
 setup:
   env: compose
   file: docker-compose.yml
-  timeout: 1200
+  timeout: 20m
   init-system-environment: env
   steps:
     - name: install yq
diff --git a/examples/kind/e2e.yaml b/examples/kind/e2e.yaml
index 581fb72..e92d19b 100644
--- a/examples/kind/e2e.yaml
+++ b/examples/kind/e2e.yaml
@@ -47,7 +47,7 @@ setup:
       - namespace: default
         resource: deployment/nginx1
         port: 80
-  timeout: 1200
+  timeout: 20m
 
 cleanup:
   # always never success failure
diff --git a/examples/reusing_cases/e2e.yaml b/examples/reusing_cases/e2e.yaml
index 2b3a0c1..77ea9d0 100644
--- a/examples/reusing_cases/e2e.yaml
+++ b/examples/reusing_cases/e2e.yaml
@@ -18,7 +18,7 @@
 setup:
   env: compose
   file: docker-compose.yml
-  timeout: 1200
+  timeout: 20m
 
 cleanup:
   # always never success failure
@@ -42,4 +42,4 @@ verify:
     - includes:
         - simple-cases.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
+      expected: ../../test/verify/3.expected.yaml
diff --git a/internal/components/setup/common.go b/internal/components/setup/common.go
index e220fa8..9fc2603 100644
--- a/internal/components/setup/common.go
+++ b/internal/components/setup/common.go
@@ -29,18 +29,11 @@ import (
 	"k8s.io/client-go/kubernetes"
 
 	"github.com/apache/skywalking-infra-e2e/internal/config"
-	"github.com/apache/skywalking-infra-e2e/internal/constant"
 	"github.com/apache/skywalking-infra-e2e/internal/logger"
 	"github.com/apache/skywalking-infra-e2e/internal/util"
 )
 
-func RunStepsAndWait(steps []config.Step, timeout int, k8sCluster *util.K8sClusterInfo) error {
-	var waitTimeout time.Duration
-	if timeout <= 0 {
-		waitTimeout = constant.DefaultWaitTimeout
-	} else {
-		waitTimeout = time.Duration(timeout) * time.Second
-	}
+func RunStepsAndWait(steps []config.Step, waitTimeout time.Duration, k8sCluster *util.K8sClusterInfo) error {
 	logger.Log.Debugf("wait timeout is %d seconds", int(waitTimeout.Seconds()))
 
 	// record time now
diff --git a/internal/components/setup/compose.go b/internal/components/setup/compose.go
index 14b47bb..0543187 100644
--- a/internal/components/setup/compose.go
+++ b/internal/components/setup/compose.go
@@ -25,13 +25,11 @@ import (
 	"regexp"
 	"strconv"
 	"strings"
-	"time"
 
 	"github.com/docker/go-connections/nat"
 	"github.com/testcontainers/testcontainers-go/wait"
 
 	"github.com/apache/skywalking-infra-e2e/internal/config"
-	"github.com/apache/skywalking-infra-e2e/internal/constant"
 	"github.com/apache/skywalking-infra-e2e/internal/logger"
 	"github.com/apache/skywalking-infra-e2e/internal/util"
 
@@ -90,7 +88,7 @@ func ComposeSetup(e2eConfig *config.E2EConfig) error {
 	}
 
 	// run steps
-	err = RunStepsAndWait(e2eConfig.Setup.Steps, e2eConfig.Setup.Timeout, nil)
+	err = RunStepsAndWait(e2eConfig.Setup.Steps, e2eConfig.Setup.GetTimeout(), nil)
 	if err != nil {
 		logger.Log.Errorf("execute steps error: %v", err)
 		return err
@@ -159,13 +157,7 @@ func exportComposeEnv(key, value, service string) error {
 }
 
 func bindWaitPort(e2eConfig *config.E2EConfig, compose *testcontainers.LocalDockerCompose) (map[string][]*hostPortCachedStrategy, error) {
-	timeout := e2eConfig.Setup.Timeout
-	var waitTimeout time.Duration
-	if timeout <= 0 {
-		waitTimeout = constant.DefaultWaitTimeout
-	} else {
-		waitTimeout = time.Duration(timeout) * time.Second
-	}
+	waitTimeout := e2eConfig.Setup.GetTimeout()
 	serviceWithPorts := make(map[string][]*hostPortCachedStrategy)
 	for service, content := range compose.Services {
 		serviceConfig := content.(map[interface{}]interface{})
@@ -248,12 +240,7 @@ func (hp *hostPortCachedStrategy) WaitUntilReady(ctx context.Context, target wai
 
 func waitPortUntilReady(e2eConfig *config.E2EConfig, container *types.Container, dockerProvider *DockerProvider, expectPort int) error {
 	// wait port
-	var waitTimeout time.Duration
-	if e2eConfig.Setup.Timeout <= 0 {
-		waitTimeout = constant.DefaultWaitTimeout
-	} else {
-		waitTimeout = time.Duration(e2eConfig.Setup.Timeout) * time.Second
-	}
+	waitTimeout := e2eConfig.Setup.GetTimeout()
 	waitPort := nat.Port(fmt.Sprintf("%d/tcp", expectPort))
 	target := &DockerContainer{
 		ID:         container.ID,
diff --git a/internal/components/setup/kind.go b/internal/components/setup/kind.go
index eebce1e..7ed8526 100644
--- a/internal/components/setup/kind.go
+++ b/internal/components/setup/kind.go
@@ -94,7 +94,7 @@ func KindSetup(e2eConfig *config.E2EConfig) error {
 		util.ExportEnvVars(profilePath)
 	}
 
-	if err := createKindCluster(kindConfigPath); err != nil {
+	if err := createKindCluster(kindConfigPath, e2eConfig); err != nil {
 		return err
 	}
 
@@ -118,14 +118,14 @@ func KindSetup(e2eConfig *config.E2EConfig) error {
 	}
 
 	// run steps
-	err = RunStepsAndWait(e2eConfig.Setup.Steps, e2eConfig.Setup.Timeout, cluster)
+	err = RunStepsAndWait(e2eConfig.Setup.Steps, e2eConfig.Setup.GetTimeout(), cluster)
 	if err != nil {
 		logger.Log.Errorf("execute steps error: %v", err)
 		return err
 	}
 
 	// expose ports
-	err = exposeKindService(e2eConfig.Setup.Kind.ExposePorts, e2eConfig.Setup.Timeout, kubeConfigPath)
+	err = exposeKindService(e2eConfig.Setup.Kind.ExposePorts, e2eConfig.Setup.GetTimeout(), kubeConfigPath)
 	if err != nil {
 		logger.Log.Errorf("export ports error: %v", err)
 		return err
@@ -148,10 +148,15 @@ func KindCleanNotify() {
 	}
 }
 
-func createKindCluster(kindConfigPath string) error {
+func createKindCluster(kindConfigPath string, e2eConfig *config.E2EConfig) error {
 	// the config file name of the k8s cluster that kind create
 	kubeConfigPath = constant.K8sClusterConfigFilePath
-	args := []string{"create", "cluster", "--config", kindConfigPath, "--kubeconfig", kubeConfigPath}
+	args := []string{
+		"create", "cluster",
+		"--config", kindConfigPath,
+		"--kubeconfig", kubeConfigPath,
+		"--wait", e2eConfig.Setup.GetTimeout().String(),
+	}
 
 	logger.Log.Info("creating kind cluster...")
 	logger.Log.Debugf("cluster create commands: %s %s", constant.KindCommand, strings.Join(args, " "))
@@ -388,7 +393,7 @@ func exposePerKindService(port config.KindExposePort, timeout time.Duration, cli
 	return nil
 }
 
-func exposeKindService(exports []config.KindExposePort, timeout int, kubeConfig string) error {
+func exposeKindService(exports []config.KindExposePort, timeout time.Duration, kubeConfig string) error {
 	// round tripper
 	kubeConfigYaml, err := ioutil.ReadFile(kubeConfig)
 	if err != nil {
@@ -421,7 +426,7 @@ func exposeKindService(exports []config.KindExposePort, timeout int, kubeConfig
 	if timeout <= 0 {
 		waitTimeout = constant.DefaultWaitTimeout
 	} else {
-		waitTimeout = time.Duration(timeout) * time.Second
+		waitTimeout = timeout
 	}
 
 	// stop port-forward channel
diff --git a/internal/config/e2eConfig.go b/internal/config/e2eConfig.go
index e313573..b853309 100644
--- a/internal/config/e2eConfig.go
+++ b/internal/config/e2eConfig.go
@@ -18,7 +18,14 @@
 
 package config
 
-import "github.com/apache/skywalking-infra-e2e/internal/util"
+import (
+	"fmt"
+	"time"
+
+	"github.com/apache/skywalking-infra-e2e/internal/constant"
+	"github.com/apache/skywalking-infra-e2e/internal/logger"
+	"github.com/apache/skywalking-infra-e2e/internal/util"
+)
 
 // E2EConfig corresponds to configuration file e2e.yaml.
 type E2EConfig struct {
@@ -29,12 +36,30 @@ type E2EConfig struct {
 }
 
 type Setup struct {
-	Env                   string    `yaml:"env"`
-	File                  string    `yaml:"file"`
-	Steps                 []Step    `yaml:"steps"`
-	Timeout               int       `yaml:"timeout"`
-	InitSystemEnvironment string    `yaml:"init-system-environment"`
-	Kind                  KindSetup `yaml:"kind"`
+	Env                   string      `yaml:"env"`
+	File                  string      `yaml:"file"`
+	Steps                 []Step      `yaml:"steps"`
+	Timeout               interface{} `yaml:"timeout"`
+	InitSystemEnvironment string      `yaml:"init-system-environment"`
+	Kind                  KindSetup   `yaml:"kind"`
+
+	timeout time.Duration
+}
+
+func (s *Setup) Finalize() error {
+	interval, err := parseInterval(s.Timeout, "setup.timeout")
+	if err != nil {
+		return err
+	}
+	if interval <= 0 {
+		interval = constant.DefaultWaitTimeout
+	}
+	s.timeout = interval
+	return nil
+}
+
+func (s *Setup) GetTimeout() time.Duration {
+	return s.timeout
 }
 
 type Cleanup struct {
@@ -120,3 +145,27 @@ func (v *VerifyCase) GetActual() string {
 func (v *VerifyCase) GetExpected() string {
 	return util.ResolveAbs(v.Expected)
 }
+
+// parseInterval parses a Duration field with number and string content for compatibility,
+// only use this when we previously allow configuring number like 120 and now string like 2m.
+// TODO remove this in 2.0
+func parseInterval(retryInterval interface{}, name string) (time.Duration, error) {
+	var interval time.Duration
+	var err error
+	switch itv := retryInterval.(type) {
+	case int:
+		logger.Log.Warnf("configuring %v with number %v is deprecated and will be removed in future version,"+
+			" please use Duration style instead, such as 10s, 1m.", name, itv)
+		interval = time.Duration(itv) * time.Second
+	case string:
+		if interval, err = time.ParseDuration(itv); err != nil {
+			return 0, err
+		}
+	default:
+		return 0, fmt.Errorf("failed to parse %v: %v", name, retryInterval)
+	}
+	if interval < 0 {
+		interval = constant.DefaultWaitTimeout
+	}
+	return interval, nil
+}
diff --git a/internal/config/globalConfig.go b/internal/config/globalConfig.go
index 7be0ae9..707621d 100644
--- a/internal/config/globalConfig.go
+++ b/internal/config/globalConfig.go
@@ -70,6 +70,10 @@ func ReadGlobalConfigFile() {
 		return
 	}
 
+	if err = GlobalConfig.E2EConfig.Setup.Finalize(); err != nil {
+		GlobalConfig.Error = err
+	}
+
 	GlobalConfig.Error = nil
 	logger.Log.Info("load the e2e config successfully")
 }