hs-test: retry command on test setup failure
[vpp.git] / extras / hs-test / container.go
index 1dc49b7..812198d 100644 (file)
@@ -6,6 +6,7 @@ import (
        "os/exec"
        "strings"
        "text/template"
+       "time"
 
        "github.com/edwarnicke/exechelper"
 )
@@ -129,11 +130,26 @@ func (c *Container) getContainerArguments() string {
        args := "--ulimit nofile=90000:90000 --cap-add=all --privileged --network host --rm"
        args += c.getVolumesAsCliOption()
        args += c.getEnvVarsAsCliOption()
+       if *vppSourceFileDir != "" {
+               args += fmt.Sprintf(" -v %s:%s", *vppSourceFileDir, *vppSourceFileDir)
+       }
        args += " --name " + c.name + " " + c.image
        args += " " + c.extraRunningArgs
        return args
 }
 
+func (c *Container) runWithRetry(cmd string) error {
+       nTries := 5
+       for i := 0; i < nTries; i++ {
+               err := exechelper.Run(cmd)
+               if err == nil {
+                       return nil
+               }
+               time.Sleep(1 * time.Second)
+       }
+       return fmt.Errorf("failed to run container command")
+}
+
 func (c *Container) create() error {
        cmd := "docker create " + c.getContainerArguments()
        c.suite.log(cmd)
@@ -143,7 +159,7 @@ func (c *Container) create() error {
 func (c *Container) start() error {
        cmd := "docker start " + c.name
        c.suite.log(cmd)
-       return exechelper.Run(cmd)
+       return c.runWithRetry(cmd)
 }
 
 func (c *Container) prepareCommand() (string, error) {
@@ -176,8 +192,7 @@ func (c *Container) run() error {
        if err != nil {
                return err
        }
-
-       return exechelper.Run(cmd)
+       return c.runWithRetry(cmd)
 }
 
 func (c *Container) addVolume(hostDir string, containerDir string, isDefaultWorkDir bool) {
@@ -216,16 +231,12 @@ func (c *Container) getEnvVarsAsCliOption() string {
        return cliOption
 }
 
-func (c *Container) newVppInstance(additionalConfig ...Stanza) (*VppInstance, error) {
+func (c *Container) newVppInstance(cpus []int, additionalConfigs ...Stanza) (*VppInstance, error) {
        vpp := new(VppInstance)
        vpp.container = c
-
-       if len(additionalConfig) > 0 {
-               vpp.additionalConfig = additionalConfig[0]
-       }
-
+       vpp.cpus = cpus
+       vpp.additionalConfig = append(vpp.additionalConfig, additionalConfigs...)
        c.vppInstance = vpp
-
        return vpp, nil
 }