mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-11-04 10:01:05 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
//go:build integration
 | 
						|
// +build integration
 | 
						|
 | 
						|
package headscale
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/ory/dockertest/v3"
 | 
						|
	"github.com/ory/dockertest/v3/docker"
 | 
						|
)
 | 
						|
 | 
						|
func ExecuteCommand(resource *dockertest.Resource, cmd []string, env []string) (string, error) {
 | 
						|
	var stdout bytes.Buffer
 | 
						|
	var stderr bytes.Buffer
 | 
						|
 | 
						|
	// TODO(kradalby): Make configurable
 | 
						|
	timeout := 10 * time.Second
 | 
						|
 | 
						|
	type result struct {
 | 
						|
		exitCode int
 | 
						|
		err      error
 | 
						|
	}
 | 
						|
 | 
						|
	resultChan := make(chan result, 1)
 | 
						|
 | 
						|
	// Run your long running function in it's own goroutine and pass back it's
 | 
						|
	// response into our channel.
 | 
						|
	go func() {
 | 
						|
		exitCode, err := resource.Exec(
 | 
						|
			cmd,
 | 
						|
			dockertest.ExecOptions{
 | 
						|
				Env:    append(env, "LOG_LEVEL=error"),
 | 
						|
				StdOut: &stdout,
 | 
						|
				StdErr: &stderr,
 | 
						|
			},
 | 
						|
		)
 | 
						|
		resultChan <- result{exitCode, err}
 | 
						|
	}()
 | 
						|
 | 
						|
	// Listen on our channel AND a timeout channel - which ever happens first.
 | 
						|
	select {
 | 
						|
	case res := <-resultChan:
 | 
						|
		if res.err != nil {
 | 
						|
			return "", res.err
 | 
						|
		}
 | 
						|
 | 
						|
		if res.exitCode != 0 {
 | 
						|
			fmt.Println("Command: ", cmd)
 | 
						|
			fmt.Println("stdout: ", stdout.String())
 | 
						|
			fmt.Println("stderr: ", stderr.String())
 | 
						|
			return "", fmt.Errorf("command failed with: %s", stderr.String())
 | 
						|
		}
 | 
						|
 | 
						|
		return stdout.String(), nil
 | 
						|
	case <-time.After(timeout):
 | 
						|
		return "", fmt.Errorf("command timed out after %s", timeout)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func DockerRestartPolicy(config *docker.HostConfig) {
 | 
						|
	// set AutoRemove to true so that stopped container goes away by itself
 | 
						|
	config.AutoRemove = true
 | 
						|
	config.RestartPolicy = docker.RestartPolicy{
 | 
						|
		Name: "no",
 | 
						|
	}
 | 
						|
}
 |