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  }