func getTestSQ(startThreads bool, config *github_util.Config, server *httptest.Server) *SubmitQueue { // TODO: Remove this line when we fix the plumbing regarding the fake/real e2e tester. admin.Mux = admin.NewConcurrentMux() sq := new(SubmitQueue) sq.RequiredStatusContexts = []string{notRequiredReTestContext1, notRequiredReTestContext2} sq.RequiredRetestContexts = []string{requiredReTestContext1, requiredReTestContext2} sq.BlockingJobNames = []string{"foo"} sq.WeakStableJobNames = []string{"bar"} sq.githubE2EQueue = map[int]*github_util.MungeObject{} sq.githubE2EPollTime = 50 * time.Millisecond sq.clock = util.NewFakeClock(time.Time{}) sq.lastMergeTime = sq.clock.Now() sq.lastE2EStable = true sq.prStatus = map[string]submitStatus{} sq.lastPRStatus = map[string]submitStatus{} sq.lgtmTimeCache = mungerutil.NewLabelTimeCache(lgtmLabel) sq.startTime = sq.clock.Now() sq.healthHistory = make([]healthRecord, 0) sq.DoNotMergeMilestones = []string{doNotMergeMilestone} sq.e2e = &fake_e2e.FakeE2ETester{ JobNames: sq.BlockingJobNames, WeakStableJobNames: sq.WeakStableJobNames, } if startThreads { sq.internalInitialize(config, nil, server.URL) sq.EachLoop() } return sq }
// internalInitialize will initialize the munger. // if overrideUrl is specified, will create testUtils func (sq *SubmitQueue) internalInitialize(config *github.Config, features *features.Features, overrideUrl string) error { sq.Lock() defer sq.Unlock() // Clean up all of our flags which we wish --flag="" to mean []string{} sq.BlockingJobNames = cleanStringSlice(sq.BlockingJobNames) sq.NonBlockingJobNames = cleanStringSlice(sq.NonBlockingJobNames) sq.PresubmitJobNames = cleanStringSlice(sq.PresubmitJobNames) sq.WeakStableJobNames = cleanStringSlice(sq.WeakStableJobNames) sq.RequiredStatusContexts = cleanStringSlice(sq.RequiredStatusContexts) sq.RequiredRetestContexts = cleanStringSlice(sq.RequiredRetestContexts) sq.DoNotMergeMilestones = cleanStringSlice(sq.DoNotMergeMilestones) sq.Metadata.RepoPullUrl = fmt.Sprintf("https://github.com/%s/%s/pulls/", config.Org, config.Project) sq.Metadata.ProjectName = strings.Title(config.Project) sq.githubConfig = config // TODO: This is not how injection for tests should work. if sq.FakeE2E { sq.e2e = &fake_e2e.FakeE2ETester{ JobNames: sq.BlockingJobNames, WeakStableJobNames: sq.WeakStableJobNames, } } else { var gcs *utils.Utils if overrideUrl != "" { gcs = utils.NewTestUtils("bucket", "logs", overrideUrl) } else { gcs = utils.NewWithPresubmitDetection( sq.features.GCSInfo.BucketName, sq.features.GCSInfo.LogDir, sq.features.GCSInfo.PullKey, sq.features.GCSInfo.PullLogDir, ) } sq.e2e = (&e2e.RealE2ETester{ BlockingJobNames: sq.BlockingJobNames, NonBlockingJobNames: sq.NonBlockingJobNames, WeakStableJobNames: sq.WeakStableJobNames, BuildStatus: map[string]e2e.BuildInfo{}, GoogleGCSBucketUtils: gcs, }).Init(admin.Mux) } sq.lgtmTimeCache = mungerutil.NewLabelTimeCache(lgtmLabel) if len(config.Address) > 0 { if len(config.WWWRoot) > 0 { http.Handle("/", gziphandler.GzipHandler(http.FileServer(http.Dir(config.WWWRoot)))) } http.Handle("/prs", gziphandler.GzipHandler(http.HandlerFunc(sq.servePRs))) http.Handle("/history", gziphandler.GzipHandler(http.HandlerFunc(sq.serveHistory))) http.Handle("/github-e2e-queue", gziphandler.GzipHandler(http.HandlerFunc(sq.serveGithubE2EStatus))) http.Handle("/google-internal-ci", gziphandler.GzipHandler(http.HandlerFunc(sq.serveGoogleInternalStatus))) http.Handle("/merge-info", gziphandler.GzipHandler(http.HandlerFunc(sq.serveMergeInfo))) http.Handle("/priority-info", gziphandler.GzipHandler(http.HandlerFunc(sq.servePriorityInfo))) http.Handle("/health", gziphandler.GzipHandler(http.HandlerFunc(sq.serveHealth))) http.Handle("/health.svg", gziphandler.GzipHandler(http.HandlerFunc(sq.serveHealthSVG))) http.Handle("/sq-stats", gziphandler.GzipHandler(http.HandlerFunc(sq.serveSQStats))) http.Handle("/flakes", gziphandler.GzipHandler(http.HandlerFunc(sq.serveFlakes))) http.Handle("/metadata", gziphandler.GzipHandler(http.HandlerFunc(sq.serveMetadata))) config.ServeDebugStats("/stats") go http.ListenAndServe(config.Address, nil) } admin.Mux.HandleFunc("/api/emergency/stop", sq.EmergencyStopHTTP) admin.Mux.HandleFunc("/api/emergency/resume", sq.EmergencyStopHTTP) admin.Mux.HandleFunc("/api/emergency/status", sq.EmergencyStopHTTP) if sq.githubE2EPollTime == 0 { sq.githubE2EPollTime = githubE2EPollTime } sq.healthHistory = make([]healthRecord, 0) go sq.handleGithubE2EAndMerge() go sq.updateGoogleE2ELoop() if sq.AdminPort != 0 { go http.ListenAndServe(fmt.Sprintf("0.0.0.0:%v", sq.AdminPort), admin.Mux) } return nil }