github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/cmd/chore/e2e/run/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	"math"
     8  	"os"
     9  	"os/exec"
    10  	"os/signal"
    11  	"strings"
    12  	"syscall"
    13  	"time"
    14  
    15  	"github.com/caos/orbos/pkg/orb"
    16  
    17  	"github.com/afiskon/promtail-client/promtail"
    18  	"github.com/caos/orbos/internal/helpers"
    19  )
    20  
    21  func main() {
    22  
    23  	var (
    24  		settings                          programSettings
    25  		from                              int
    26  		graphiteURL, graphiteKey, lokiURL string
    27  		returnCode                        int
    28  	)
    29  
    30  	defer func() {
    31  		if err := recover(); err != nil {
    32  			panic(err)
    33  		}
    34  
    35  		os.Exit(returnCode)
    36  	}()
    37  
    38  	const (
    39  		orbDefault         = "~/.orb/config"
    40  		orbUsage           = "Path to the orbconfig file which points to the orb the end-to-end testing should be performed on"
    41  		graphiteURLDefault = ""
    42  		graphiteURLUsage   = "https://<your-subdomain>.hosted-metrics.grafana.net/metrics"
    43  		graphiteKeyDefault = ""
    44  		graphiteKeyUsage   = "your api key from grafana.net -- should be editor role"
    45  		lokiURLDefault     = ""
    46  		lokiURLUsage       = "https://<instanceId>:<apiKey>@<instanceUrl>/api/prom/push"
    47  		fromDefault        = 1
    48  		fromUsage          = "step to continue e2e tests from"
    49  		cleanupDefault     = true
    50  		cleanupUsage       = "destroy orb after tests are done"
    51  	)
    52  
    53  	flag.StringVar(&settings.orbconfig, "orbconfig", orbDefault, orbUsage)
    54  	flag.StringVar(&settings.orbconfig, "f", orbDefault, orbUsage+" (shorthand)")
    55  	flag.StringVar(&graphiteURL, "graphiteurl", graphiteURLDefault, graphiteURLUsage)
    56  	flag.StringVar(&graphiteURL, "g", graphiteURLDefault, graphiteURLUsage+" (shorthand)")
    57  	flag.StringVar(&graphiteKey, "graphitekey", graphiteKeyDefault, graphiteKeyUsage)
    58  	flag.StringVar(&graphiteKey, "k", graphiteKeyDefault, graphiteKeyUsage+" (shorthand)")
    59  	flag.StringVar(&lokiURL, "lokiurl", lokiURLDefault, lokiURLUsage)
    60  	flag.StringVar(&lokiURL, "l", lokiURLDefault, lokiURLUsage+" (shorthand)")
    61  	flag.BoolVar(&settings.cleanup, "cleanup", cleanupDefault, cleanupUsage)
    62  	flag.BoolVar(&settings.cleanup, "c", cleanupDefault, cleanupUsage+" (shorthand)")
    63  	flag.IntVar(&from, "from", fromDefault, fromUsage)
    64  	flag.IntVar(&from, "s", fromDefault, fromUsage)
    65  
    66  	flag.Parse()
    67  
    68  	if from > math.MaxUint8 {
    69  		panic(fmt.Errorf("maximum from value is %d", math.MaxUint8))
    70  	}
    71  
    72  	settings.from = uint8(from)
    73  
    74  	out, err := exec.Command("git", "branch", "--show-current").Output()
    75  	if err != nil {
    76  		panic(fmt.Errorf("%s: %w", string(out), err))
    77  	}
    78  
    79  	settings.branch = strings.ReplaceAll(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(strings.TrimSpace(string(out)), "refs/"), "heads/"), "origin/"), ".", "-")
    80  
    81  	orbCfg, err := orb.ParseOrbConfig(helpers.PruneHome(settings.orbconfig))
    82  	if err != nil {
    83  		panic(err)
    84  	}
    85  
    86  	if err := orb.IsComplete(orbCfg); err != nil {
    87  		panic(err)
    88  	}
    89  
    90  	settings.orbID = strings.ToLower(strings.Split(strings.Split(orbCfg.URL, "/")[1], ".")[0])
    91  
    92  	sendLevel := promtail.DISABLE
    93  	if lokiURL != "" {
    94  		fmt.Println("Sending logs to Loki")
    95  		sendLevel = promtail.INFO
    96  	}
    97  
    98  	settings.logger, err = promtail.NewClientProto(promtail.ClientConfig{
    99  		PushURL:            lokiURL,
   100  		Labels:             fmt.Sprintf(`{e2e_test="true", branch="%s", orb="%s"}`, settings.branch, settings.orbID),
   101  		BatchWait:          1 * time.Second,
   102  		BatchEntriesNumber: 0,
   103  		SendLevel:          sendLevel,
   104  		PrintLevel:         promtail.INFO,
   105  	})
   106  	if err != nil {
   107  		panic(err)
   108  	}
   109  	defer settings.logger.Shutdown()
   110  
   111  	ctx, cancel := context.WithCancel(context.Background())
   112  	defer cancel()
   113  
   114  	signalChannel := make(chan os.Signal)
   115  	signal.Notify(signalChannel,
   116  		syscall.SIGTERM,
   117  		syscall.SIGINT,
   118  		syscall.SIGQUIT,
   119  	)
   120  
   121  	go func() {
   122  		<-signalChannel
   123  		cancel()
   124  	}()
   125  
   126  	testFunc := run
   127  
   128  	if graphiteURL != "" {
   129  		fmt.Println("Sending status to Graphite")
   130  		testFunc = graphite(
   131  			graphiteURL,
   132  			graphiteKey,
   133  			run)
   134  	}
   135  
   136  	fmt.Println("Starting end-to-end test")
   137  	fmt.Println(settings.String())
   138  
   139  	if err := testFunc(ctx, settings); err != nil {
   140  		settings.logger.Errorf("End-to-end test failed: %s", err.Error())
   141  		returnCode = 1
   142  	}
   143  }