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 }