github.com/saucelabs/saucectl@v0.175.1/internal/cmd/run/imagerunner.go (about) 1 package run 2 3 import ( 4 "os" 5 6 cmds "github.com/saucelabs/saucectl/internal/cmd" 7 "github.com/saucelabs/saucectl/internal/config" 8 "github.com/saucelabs/saucectl/internal/http" 9 "github.com/saucelabs/saucectl/internal/imagerunner" 10 "github.com/saucelabs/saucectl/internal/region" 11 "github.com/saucelabs/saucectl/internal/report" 12 "github.com/saucelabs/saucectl/internal/report/json" 13 "github.com/saucelabs/saucectl/internal/report/table" 14 "github.com/saucelabs/saucectl/internal/saucecloud" 15 "github.com/saucelabs/saucectl/internal/segment" 16 "github.com/saucelabs/saucectl/internal/usage" 17 "github.com/spf13/cobra" 18 "golang.org/x/text/cases" 19 "golang.org/x/text/language" 20 ) 21 22 func runImageRunner(cmd *cobra.Command) (int, error) { 23 config.ValidateSchema(gFlags.cfgFilePath) 24 p, err := imagerunner.FromFile(gFlags.cfgFilePath) 25 if err != nil { 26 return 1, err 27 } 28 29 if err := applyImageRunnerFlags(&p); err != nil { 30 return 1, err 31 } 32 imagerunner.SetDefaults(&p) 33 34 if err := imagerunner.Validate(p); err != nil { 35 return 1, err 36 } 37 38 regio := region.FromString(p.Sauce.Region) 39 tracker := segment.DefaultTracker 40 if regio == region.Staging { 41 tracker.Enabled = false 42 } 43 44 go func() { 45 props := usage.Properties{} 46 props.SetFramework("imagerunner").SetFlags(cmd.Flags()).SetSauceConfig(p.Sauce). 47 SetArtifacts(p.Artifacts).SetNumSuites(len(p.Suites)) 48 tracker.Collect(cases.Title(language.English).String(cmds.FullName(cmd)), props) 49 _ = tracker.Close() 50 }() 51 52 reporters := []report.Reporter{ 53 &table.Reporter{ 54 Dst: os.Stdout, 55 }, 56 } 57 if !gFlags.async { 58 if p.Reporters.JSON.Enabled { 59 reporters = append(reporters, &json.Reporter{ 60 WebhookURL: p.Reporters.JSON.WebhookURL, 61 Filename: p.Reporters.JSON.Filename, 62 }) 63 } 64 } 65 66 cleanupArtifacts(p.Artifacts) 67 68 creds := regio.Credentials() 69 70 asyncEventManager, err := http.NewAsyncEventMgr() 71 if err != nil { 72 return 1, err 73 } 74 75 imageRunnerClient := http.NewImageRunner(regio.APIBaseURL(), creds, imgExecTimeout, asyncEventManager) 76 restoClient := http.NewResto(regio.APIBaseURL(), creds.Username, creds.AccessKey, 0) 77 78 r := saucecloud.NewImgRunner(p, &imageRunnerClient, &restoClient, asyncEventManager, 79 reporters, gFlags.async) 80 81 return r.RunProject() 82 } 83 84 func applyImageRunnerFlags(p *imagerunner.Project) error { 85 if gFlags.selectedSuite != "" { 86 if err := imagerunner.FilterSuites(p, gFlags.selectedSuite); err != nil { 87 return err 88 } 89 } 90 return nil 91 }