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

zhangke 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 3ea8e50  Refactor setup part (#15)
3ea8e50 is described below

commit 3ea8e501eb5e29176432a58ac0f40846be6fc816
Author: Humbert Zhang <[email protected]>
AuthorDate: Thu Mar 25 14:55:56 2021 +0800

    Refactor setup part (#15)
    
    * refactor setup part
    
    * fix bugs and polish codes
    
    * polish comment
---
 commands/cleanup/cleanup.go         |   4 +-
 commands/run/run.go                 |  22 ++++++++
 commands/verify/verify.go           |   6 +--
 examples/simple/e2e.yaml            |  41 +++++++--------
 internal/components/setup/common.go |  17 +++---
 internal/components/setup/kind.go   | 100 ++++++++++++++++++++----------------
 internal/config/e2eConfig.go        |  19 +++----
 internal/constant/kind.go           |  13 +++++
 8 files changed, 130 insertions(+), 92 deletions(-)

diff --git a/commands/cleanup/cleanup.go b/commands/cleanup/cleanup.go
index d5d2024..dd87482 100644
--- a/commands/cleanup/cleanup.go
+++ b/commands/cleanup/cleanup.go
@@ -34,7 +34,7 @@ var Cleanup = &cobra.Command{
        Use:   "cleanup",
        Short: "",
        RunE: func(cmd *cobra.Command, args []string) error {
-               err := cleanupAccordingE2E()
+               err := DoCleanupAccordingE2E()
                if err != nil {
                        err = fmt.Errorf("[Cleanup] %s", err)
                        return err
@@ -43,7 +43,7 @@ var Cleanup = &cobra.Command{
        },
 }
 
-func cleanupAccordingE2E() error {
+func DoCleanupAccordingE2E() error {
        e2eConfig := config.GlobalConfig.E2EConfig
        if e2eConfig.Setup.Env == constant.Kind {
                err := cleanup.KindCleanUp(&e2eConfig)
diff --git a/commands/run/run.go b/commands/run/run.go
index 5827d9d..2a32006 100644
--- a/commands/run/run.go
+++ b/commands/run/run.go
@@ -18,7 +18,10 @@
 package run
 
 import (
+       "github.com/apache/skywalking-infra-e2e/commands/cleanup"
        "github.com/apache/skywalking-infra-e2e/commands/setup"
+       "github.com/apache/skywalking-infra-e2e/commands/trigger"
+       "github.com/apache/skywalking-infra-e2e/commands/verify"
        "github.com/apache/skywalking-infra-e2e/internal/config"
        "github.com/apache/skywalking-infra-e2e/internal/logger"
 
@@ -50,9 +53,28 @@ func runAccordingE2E() error {
        }
        logger.Log.Infof("setup part finished successfully")
 
+       // cleanup part
+       defer func() {
+               err = cleanup.DoCleanupAccordingE2E()
+               if err != nil {
+                       logger.Log.Errorf("cleanup part error: %s", err)
+               }
+               logger.Log.Infof("cleanup part finished successfully")
+       }()
+
        // trigger part
+       err = trigger.DoActionAccordingE2E()
+       if err != nil {
+               return err
+       }
+       logger.Log.Infof("trigger part finished successfully")
 
        // verify part
+       err = verify.DoVerifyAccordingConfig()
+       if err != nil {
+               return err
+       }
+       logger.Log.Infof("verify part finished successfully")
 
        return nil
 }
diff --git a/commands/verify/verify.go b/commands/verify/verify.go
index 0e700b9..290cf26 100644
--- a/commands/verify/verify.go
+++ b/commands/verify/verify.go
@@ -48,7 +48,7 @@ var Verify = &cobra.Command{
                        return verifySingleCase(expected, actual, query)
                }
                // If there is no given flags.
-               return verifyAccordingConfig()
+               return DoVerifyAccordingConfig()
        },
 }
 
@@ -84,8 +84,8 @@ func verifySingleCase(expectedFile, actualFile, query string) 
error {
        return nil
 }
 
-// verifyAccordingConfig reads cases from the config file and verifies them.
-func verifyAccordingConfig() error {
+// DoVerifyAccordingConfig reads cases from the config file and verifies them.
+func DoVerifyAccordingConfig() error {
        if config.GlobalConfig.Error != nil {
                return config.GlobalConfig.Error
        }
diff --git a/examples/simple/e2e.yaml b/examples/simple/e2e.yaml
index e486887..f71d3a8 100644
--- a/examples/simple/e2e.yaml
+++ b/examples/simple/e2e.yaml
@@ -18,38 +18,33 @@
 setup:
   env: kind
   file: kind.yaml
-  manifests:
-    - path: busybox1.yaml
-      wait: 
-        - namespace: default
-          resource: pod/busybox1 
-          for: condition=Ready
-    - path: manifests,manifests2
+  steps:
+    - command: |
+        if test -d "$TMPDIR"; then
+            :
+        else
+            TMPDIR=/tmp
+        fi
+
+        cp $TMPDIR/e2e-k8s.config ~/.kube/config
+        export ISTIO_VERSION=1.9.1
+        istioctl version || (curl -L https://istio.io/downloadIstio | sh - && 
sudo mv $PWD/istio-$ISTIO_VERSION/bin/istioctl /usr/local/bin/)
+        istioctl install -y --set profile=demo \
+            --set 
meshConfig.defaultConfig.envoyMetricsService.address=skywalking-oap.istio-system:11800
 \
+            --set values.telemetry.v2.enabled=false
+        kubectl label namespace default istio-injection=enabled
+    - path: busybox1.yaml,manifests
       wait:
         - namespace: default
           resource: pod
-          label-selector: app=busybox2
-          for: condition=Ready
-        - namespace: default
-          resource: pod
           for: condition=Ready
-  runs: # commands are serial within one code block and parallel between code 
blocks
-    - command: | # it can be a shell script or anything executable
-        cp $TMPDIR/e2e-k8s.config ~/.kube/config
+    - command: |
         kubectl create deployment nginx1 --image=nginx
       wait:
         - namespace: default
           resource: deployment/nginx1
           for: condition=Available
-    - command: |
-        cp $TMPDIR/e2e-k8s.config ~/.kube/config
-        kubectl create deployment nginx2 \
-                                  --image=nginx
-      wait:
-        - namespace: default
-          resource: deployment/nginx2
-          for: condition=Available
-  timeout: 600
+  timeout: 1200
 
 trigger:
   action: http
diff --git a/internal/components/setup/common.go 
b/internal/components/setup/common.go
index cae40c4..bf3aa9b 100644
--- a/internal/components/setup/common.go
+++ b/internal/components/setup/common.go
@@ -29,20 +29,17 @@ import (
 )
 
 // RunCommandsAndWait Concurrently run commands and wait for conditions.
-func RunCommandsAndWait(runs []config.Run, timeout time.Duration) error {
+func RunCommandsAndWait(run config.Run, timeout time.Duration) error {
        waitSet := util.NewWaitSet(timeout)
 
-       for idx := range runs {
-               run := runs[idx]
-               commands := run.Command
-               if len(commands) < 1 {
-                       continue
-               }
-
-               waitSet.WaitGroup.Add(1)
-               go executeCommandsAndWait(commands, run.Waits, waitSet)
+       commands := run.Command
+       if len(commands) < 1 {
+               return nil
        }
 
+       waitSet.WaitGroup.Add(1)
+       go executeCommandsAndWait(commands, run.Waits, waitSet)
+
        go func() {
                waitSet.WaitGroup.Wait()
                close(waitSet.FinishChan)
diff --git a/internal/components/setup/kind.go 
b/internal/components/setup/kind.go
index c4c4f27..915a207 100644
--- a/internal/components/setup/kind.go
+++ b/internal/components/setup/kind.go
@@ -58,10 +58,10 @@ func KindSetup(e2eConfig *config.E2EConfig) error {
                return fmt.Errorf("no kind config file was provided")
        }
 
-       manifests := e2eConfig.Setup.Manifests
+       manifests := e2eConfig.Setup.Steps
        // if no manifests was provided, then no need to create the cluster.
        if manifests == nil {
-               logger.Log.Info("no manifests is provided")
+               logger.Log.Info("no steps is provided")
                return nil
        }
 
@@ -75,6 +75,7 @@ func KindSetup(e2eConfig *config.E2EConfig) error {
                return err
        }
 
+       // run commands and manifests
        timeout := e2eConfig.Setup.Timeout
        var waitTimeout time.Duration
        if timeout <= 0 {
@@ -82,28 +83,40 @@ func KindSetup(e2eConfig *config.E2EConfig) error {
        } else {
                waitTimeout = time.Duration(timeout) * time.Second
        }
-
        logger.Log.Debugf("wait timeout is %d seconds", 
int(waitTimeout.Seconds()))
 
        // record time now
        timeNow := time.Now()
 
-       err = createManifestsAndWait(c, dc, manifests, waitTimeout)
-       if err != nil {
-               return err
-       }
+       for _, step := range e2eConfig.Setup.Steps {
+               if step.Path != "" && step.Command == "" {
+                       manifest := config.Manifest{
+                               Path:  step.Path,
+                               Waits: step.Waits,
+                       }
+                       err = createManifestAndWait(c, dc, manifest, 
waitTimeout)
+                       if err != nil {
+                               return err
+                       }
+               } else if step.Command != "" && step.Path == "" {
+                       command := config.Run{
+                               Command: step.Command,
+                               Waits:   step.Waits,
+                       }
 
-       // calculates new timeout. manifests and run of setup uses the same 
countdown.
-       runWaitTimeout := NewTimeout(timeNow, waitTimeout)
-       if runWaitTimeout <= 0 {
-               return fmt.Errorf("kind setup timeout")
-       }
+                       err := RunCommandsAndWait(command, waitTimeout)
+                       if err != nil {
+                               return err
+                       }
+               } else {
+                       return fmt.Errorf("step parameter error, one Path or 
one Command should be specified, but got %+v", step)
+               }
 
-       if len(e2eConfig.Setup.Runs) > 0 {
-               logger.Log.Debugf("executing commands...")
-               err := RunCommandsAndWait(e2eConfig.Setup.Runs, runWaitTimeout)
-               if err != nil {
-                       return err
+               waitTimeout = NewTimeout(timeNow, waitTimeout)
+               timeNow = time.Now()
+
+               if waitTimeout <= 0 {
+                       return fmt.Errorf("kind setup timeout")
                }
        }
        return nil
@@ -123,8 +136,8 @@ func createKindCluster(kindConfigPath string) error {
        return nil
 }
 
-// createManifestsAndWait creates manifests in k8s cluster and concurrent 
waits according to the manifests' wait conditions.
-func createManifestsAndWait(c *kubernetes.Clientset, dc dynamic.Interface, 
manifests []config.Manifest, timeout time.Duration) error {
+// createManifestAndWait creates manifests in k8s cluster and concurrent waits 
according to the manifests' wait conditions.
+func createManifestAndWait(c *kubernetes.Clientset, dc dynamic.Interface, 
manifest config.Manifest, timeout time.Duration) error {
        waitSet := util.NewWaitSet(timeout)
 
        kubeConfigYaml, err := ioutil.ReadFile(kubeConfigPath)
@@ -132,32 +145,29 @@ func createManifestsAndWait(c *kubernetes.Clientset, dc 
dynamic.Interface, manif
                return err
        }
 
-       for idx := range manifests {
-               manifest := manifests[idx]
-               waits := manifest.Waits
-               err := createByManifest(c, dc, manifest)
-               if err != nil {
-                       return err
-               }
-
-               // len() for nil slices is defined as zero
-               if len(waits) == 0 {
-                       logger.Log.Info("no wait-for strategy is provided")
-                       continue
-               }
+       waits := manifest.Waits
+       err = createByManifest(c, dc, manifest)
+       if err != nil {
+               return err
+       }
 
-               for idx := range waits {
-                       wait := waits[idx]
-                       logger.Log.Infof("waiting for %+v", wait)
+       // len() for nil slices is defined as zero
+       if len(waits) == 0 {
+               logger.Log.Info("no wait-for strategy is provided")
+               return nil
+       }
 
-                       options, err := getWaitOptions(kubeConfigYaml, &wait)
-                       if err != nil {
-                               return err
-                       }
+       for idx := range waits {
+               wait := waits[idx]
+               logger.Log.Infof("waiting for %+v", wait)
 
-                       waitSet.WaitGroup.Add(1)
-                       go concurrentlyWait(&wait, options, waitSet)
+               options, err := getWaitOptions(kubeConfigYaml, &wait)
+               if err != nil {
+                       return err
                }
+
+               waitSet.WaitGroup.Add(1)
+               go concurrentlyWait(&wait, options, waitSet)
        }
 
        go func() {
@@ -167,12 +177,12 @@ func createManifestsAndWait(c *kubernetes.Clientset, dc 
dynamic.Interface, manif
 
        select {
        case <-waitSet.FinishChan:
-               logger.Log.Infof("create and wait for manifests ready success")
+               logger.Log.Infof("create and wait for manifest ready success")
        case err := <-waitSet.ErrChan:
-               logger.Log.Errorf("failed to wait for manifests to be ready")
+               logger.Log.Errorf("failed to wait for manifest to be ready")
                return err
        case <-time.After(waitSet.Timeout):
-               return fmt.Errorf("wait for manifests ready timeout after %d 
seconds", int(timeout.Seconds()))
+               return fmt.Errorf("wait for manifest ready timeout after %d 
seconds", int(timeout.Seconds()))
        }
 
        return nil
@@ -214,7 +224,7 @@ func getWaitOptions(kubeConfigYaml []byte, wait 
*config.Wait) (options *ctlwait.
 }
 
 func createByManifest(c *kubernetes.Clientset, dc dynamic.Interface, manifest 
config.Manifest) error {
-       files, err := util.GetManifests(manifest.GetPath())
+       files, err := util.GetManifests(manifest.Path)
        if err != nil {
                logger.Log.Error("get manifests failed")
                return err
diff --git a/internal/config/e2eConfig.go b/internal/config/e2eConfig.go
index af90953..23620f1 100644
--- a/internal/config/e2eConfig.go
+++ b/internal/config/e2eConfig.go
@@ -28,11 +28,16 @@ type E2EConfig struct {
 }
 
 type Setup struct {
-       Env       string     `yaml:"env"`
-       File      string     `yaml:"file"`
-       Manifests []Manifest `yaml:"manifests"`
-       Runs      []Run      `yaml:"runs"`
-       Timeout   int        `yaml:"timeout"`
+       Env     string `yaml:"env"`
+       File    string `yaml:"file"`
+       Steps   []Step `yaml:"steps"`
+       Timeout int    `yaml:"timeout"`
+}
+
+type Step struct {
+       Path    string `yaml:"path"`
+       Command string `yaml:"command"`
+       Waits   []Wait `yaml:"wait"`
 }
 
 func (s *Setup) GetFile() string {
@@ -44,10 +49,6 @@ type Manifest struct {
        Waits []Wait `yaml:"wait"`
 }
 
-func (m Manifest) GetPath() string {
-       return m.Path
-}
-
 type Run struct {
        Command string `yaml:"command"`
        Waits   []Wait `yaml:"wait"`
diff --git a/internal/constant/kind.go b/internal/constant/kind.go
index b6bb7cb..9f0ec8a 100644
--- a/internal/constant/kind.go
+++ b/internal/constant/kind.go
@@ -32,8 +32,21 @@ const (
        K8sClusterConfigFileName = "e2e-k8s.config"
        DefaultWaitTimeout       = 600 * time.Second
        SingleDefaultWaitTimeout = 30 * 60 * time.Second
+       StepTypeManifest         = "manifest"
+       StepTypeCommand          = "command"
 )
 
+func init() {
+       tmpDirEnv := os.Getenv("TMPDIR")
+       // TMPDIR maybe "", try to set tmpdir here, so that user can get 
kubeconfig from TMPDIR.
+       if tmpDirEnv == "" {
+               err := os.Setenv("TMPDIR", "/tmp")
+               if err != nil {
+                       panic(err)
+               }
+       }
+}
+
 var (
        True                     = true
        False                    = false

Reply via email to