New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replaced the flake-manager, issue-cacher, and issue-sync with the clu… #2450
Conversation
Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). 📝 Please follow instructions at https://github.com/kubernetes/kubernetes/wiki/CLA-FAQ to sign the CLA. It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify. Thanks.
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here. |
0247502
to
f911658
Compare
/assign @rmmh you'll need to sign the CLA follow the instruction from the bot first. |
Is it possible to put the delete of the old munger in its own commit? 4,000 changed lines is extremely challenging to review. Also cluster makes me think of a kubernetes cluster. Can you choose a different name than cluster-manager? |
@k8s-bot bazel test this |
9a0df2c
to
2b87217
Compare
comment |
mungegithub/mungers/issue-creator.go
Outdated
if len(rawIssues) == 0 { | ||
glog.Warningf("IssueCreator found no issues in the repo '%s/%s' authored by %s.\n", creator.config.getOrg(), creator.config.getProject(), creator.authorName) | ||
} | ||
//allocate 10% extra capacity since issues may be added and this list is big so copy is expensive |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
copying a few thousand pointers is not expensive, don't bother with this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
mungegithub/mungers/issue-creator.go
Outdated
if !creator.refresh() { | ||
glog.Fatalf("Failed to get the list of all issues created by %s in repo '%s/%s' while initing IssueCreator.\n", creator.authorName, creator.config.getOrg(), creator.config.getProject()) | ||
} | ||
creator.allIssues_fetchfreq, _ = time.ParseDuration(fmt.Sprintf("%dm", refreshFreqMins)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
refreshFreqMins * time.Minutes
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
mungegithub/mungers/issue-creator.go
Outdated
} | ||
} | ||
|
||
func (creator *IssueCreator) refresh() bool { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can't call this function every minute, that is prohibitively expensive. issue-cacher.go follows the correct pattern of doing the enumeration once, and then updating using changed issues using the Munge()
method.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
mungegithub/mungers/issue-creator.go
Outdated
//this type wraps the github.Config type so that it can match the RepoClient interface | ||
type githubConfig github.Config | ||
|
||
//gets the underlying *github.Config |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Throughout: these comments should be complete sentences starting with the function name, to make godoc work.
"RealConfig returns the underlying github.Config."
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
I think you should use issue-cacher.go instead of deleting it. This new "refresh every minute" implementation will slow down the entire munger. All that should be required is changing issue-cacher.go's keyFromIssue to extract cluster IDs from issue bodies when present. |
I remain unconvinced that we want a monolithic munger binary verses a bunch of small focused programs that prow triggers on a periodic basis |
I do not think this program needs to run more than once per day |
bump the CLA check |
2b87217
to
a1b0150
Compare
var assignee *string | ||
if owner != "" { | ||
assignee = &owner | ||
if len(owners) == 0 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not quite correct. You want a nil assignees pointer by default, and set it to the address of owners if it's not empty.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like there are still a bunch of comments that have not been responded to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. (Used empty slice since nil doesn't behave well with the github client).
return matchCount == 1 | ||
} | ||
|
||
//We also need a dummy Issue implementation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unnecessary comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
priority int //-1 indicates no priority | ||
} | ||
|
||
func (issue *fakeIssue) Title() string { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should be func (i *fakeIssue) Title() string {
(throughout)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
return nil | ||
} | ||
|
||
//checks that exactly 1 issue in fc.issues matches the parameters and that no |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Verify checks...
(and end with a period)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
} | ||
|
||
func TestIssueCreator(tt *testing.T) { | ||
t = tt |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just rename the function parameter
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. (made t a field instead of a global)
for i := 0; i < len(issue.Assignees); i++ { | ||
assignees[i] = *issue.Assignees[i].Login | ||
} | ||
if !stringSlicesEqual(assignees, owners) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
use reflect.deepEqual instead
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Boo!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
@@ -111,3 +111,21 @@ func TestIssueUsersAll(t *testing.T) { | |||
t.Errorf("AllUsers (%s) doesn't match expected list: %s", users.AllUsers().List(), expected) | |||
} | |||
} | |||
|
|||
func TestFetchWebFileContents(t *testing.T) { | |||
goodurl := "https://storage.googleapis.com/k8s-gubernator/triage/failure_data.json" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In general, don't write tests that require external network connectivity.
You can use net/http/httptest if you really need to test this function. Otherwise I wouldn't bother-- it's pretty trivial.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
body, err := ioutil.ReadAll(resp.Body) | ||
if err != nil { | ||
return nil, err | ||
} else { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove the else { }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
glog.Fatalln("ERROR: ", err) | ||
} | ||
//ensure that this dict has the keys it should | ||
if _, exists := buildsDict[keyColumns]; !exists { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
_, ok
is more idiomatic Go
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
var clusters []*Cluster | ||
|
||
//first parse the "clustered" and "builds" keys from the top level | ||
topLevelDict := make(map[string]json.RawMessage) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you unmarshal to a struct instead of a map? You can then test each of the members for being non-empty.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
//load job and build data | ||
allJobs := loadJobData(topLevelDict[keyBuilds]) | ||
//only consider failures that occured after this time | ||
cutoffTime := time.Now().AddDate(0, 0, -1*filer.windowDays).Unix() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-filer.WindowDays
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
glog.Fatalln("ERROR: ", err) | ||
} | ||
for _, cluster := range rawClusters { | ||
clust := new(Cluster) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clust := &Cluster{filer: filer, testFailed: ... }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
topLevelDict := make(map[string]json.RawMessage) | ||
err := json.Unmarshal(jsonIn, &topLevelDict) | ||
if err != nil { | ||
glog.Fatalln("ERROR: ", err) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't use Fatal in production code unless it's actually unrecoverable. The SQ going offline is very disruptive. Log an error and return nil, or make parseClusters return ([]*Cluster, err).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
a1b0150
to
1693fac
Compare
mungegithub/mungers/issue-creator.go
Outdated
|
||
//Munge updates the IssueCreator's cache of issues if the munge object provided is an issue authored by the currently authenticated user. | ||
func (creator *IssueCreator) Munge(obj *github.MungeObject) { | ||
//ignore pull requests |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
none of the comments in this function are necessary
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/issue-creator.go
Outdated
//Initialize prepares an IssueCreator for use by other mungers. | ||
//This includes determining the currently authenticated user, fetching all issues created by that user | ||
//from github, fetching the labels that are valid for the repo, and initializing the test owner and sig data. | ||
func (creator *IssueCreator) Initialize(config *github.Config, feats *features.Features) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
throughout: the method signature should be func (c *IssueCreator)
or func (ic *IssueCreator)
. Go style prefers terse method receivers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/issue-creator.go
Outdated
authorName string | ||
//allIssues is a local cache of all issues in the repo authored by the currently authenticated user. | ||
//MungeObjects are keyed by issue number | ||
allIssues map[int]*github.MungeObject |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this could be map[int]*github.Issue
without losing anything-- I think you only access the .Issue field of the mungeobject. That would also remove the need for the somewhat strange NewEmptyMungeObject
function.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I originally did have that map type, but I switched it to MungeObject so that an Issue interface implementation can get more info about the github issues if it needs it. Specifically I was thinking that it might be useful to retrieve the comments for the issue which is a functionality provided by MungeObject. Should I switch it back?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. (switched back to *githubapi.Issue value type)
@@ -0,0 +1,19 @@ | |||
name,owner,auto-assigned,sig |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
delete this file entirely, now that it's unused
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
@@ -112,3 +115,20 @@ func IsValidUser(u *github.User) bool { | |||
func IsMungeBot(u *github.User) bool { | |||
return IsValidUser(u) && *u.Login == BotName | |||
} | |||
|
|||
//fetches raw data from a url (used to fetch json file) | |||
func FetchWebFileContents(url string) ([]byte, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rename to "ReadHTTP" for symmetry with bytes.ReadFile
and fix the comment. You can also make submit-queue-batch.go:getJobs use this instead. :-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
fmt.Fprintf(&buf, "Failure stats over time range '%s' to '%s'\n", cutoffTime.Format(time.RFC822), time.Now().Format(time.RFC822)) | ||
//totals | ||
fmt.Fprintf(&buf, "%d tests failed, %d jobs failed, %d builds failed.\n###### Top failed tests by jobs failed:\n", clust.totalTests, clust.totalJobs, clust.totalBuilds) | ||
//build top tests failed info |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
use a table for these? https://help.github.com/articles/organizing-information-with-tables/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
//build top jobs failed info | ||
fmt.Fprintln(&buf, "###### Top failed jobs by builds failed:") | ||
for _, job := range clust.topJobsFailed(clust.filer.topJobsCount) { | ||
fmt.Fprintf(&buf, "%s: %d builds\n", job, len(clust.jobsFailed[job].builds)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
linking directly to an example failure for each of the failed jobs would be helpful
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
if len(closedIssues) > 0 { | ||
fmt.Fprintln(&buf, "###### Previously issues for this cluster:") | ||
for _, closed := range closedIssues { | ||
fmt.Fprintln(&buf, closed.Issue.HTMLURL) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fmt.Fprintf(&buf, "#%d ", closed.Issue.Number)
should display better.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made the changes you requested. Ready for you to review again.
mungegithub/mungers/triage-filer.go
Outdated
|
||
//now we know we need to make a new issue | ||
var buf bytes.Buffer | ||
fmt.Fprintf(&buf, "#### Cluster [%s] More data at: %s#%s\n", clust.ID(), clust.filer.triageURL, clust.ID()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Turn "more data" into a link: fmt.Fprintf(&buf, "#### Cluster [%s] [more data](%s#%s)\n", clust.ID(), clust.filer.triageURL, clust.ID())
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/triage-filer.go
Outdated
//now we know we need to make a new issue | ||
var buf bytes.Buffer | ||
fmt.Fprintf(&buf, "#### Cluster [%s] More data at: %s#%s\n", clust.ID(), clust.filer.triageURL, clust.ID()) | ||
fmt.Fprintf(&buf, "Failure stats over time range '%s' to '%s'\n", cutoffTime.Format(time.RFC822), time.Now().Format(time.RFC822)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
again, the time range should be specified based on what's in the data file, not the current time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
flake-manager.test-owners-csv: /gitrepos/kubernetes/test/test_owners.csv | ||
triage-filer.test-owners-csv: /gitrepos/kubernetes/test/test_owners.csv | ||
triage-filer.windowdays: "5" | ||
triage-filer.synccount: "10" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we please actually start with 3 or 5 instead of 10? I'm worried 10 issues every day will be too many. I'd much rather have too few issues than too many.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
@@ -41,7 +41,9 @@ data: | |||
# munger specific options. | |||
path-label.path-label-config: "" | |||
block-path.block-path-config: "" | |||
flake-manager.test-owners-csv: "" | |||
triage-filer.test-owners-csv: "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sure this makes sense... Is there a triage page for test-infra failures?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
@@ -42,7 +42,9 @@ data: | |||
# munger specific options. | |||
path-label.path-label-config: "" | |||
block-path.block-path-config: "" | |||
flake-manager.test-owners-csv: "" | |||
triage-filer.test-owners-csv: "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as test-infra comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/issue-creator.go
Outdated
ListAllIssues(options *githubapi.IssueListByRepoOptions) ([]*githubapi.Issue, error) | ||
NewIssue(title, body string, labels, owners []string) (*github.MungeObject, error) | ||
|
||
getDryRun() bool |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the correct golang pattern? I would expect isDryRun()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/issue-creator.go
Outdated
creator.config = RepoClient(&cfg) | ||
|
||
//load test owner/SIG data | ||
var err error |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is there a reason why you are doing this over creator.owners, err := testowner.NewReloading()
and if err := creator.load(); err != nil
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ack. (Cannot define a new variable and assign to a field in a single assignment statement in go)
mungegithub/mungers/issue-creator.go
Outdated
func (creator *IssueCreator) loadCache() error { | ||
//try to get the current authenticated user | ||
user, err := creator.config.GetUser("") | ||
if err != nil || user == nil || user.Login == nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suspect it will be more helpful to return a specific error message for each of these scenarios.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
mungegithub/mungers/issue-creator.go
Outdated
owners := issue.Owners() | ||
labels := issue.Labels() | ||
if prio, ok := issue.Priority(); ok { | ||
labels = append(labels, "priority/P"+strconv.Itoa(prio)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I actually think these labels are deprecated. Can we just skip setting a priority? Alternatively use the new priority/random-annoying-string
labels
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Priorities are not currently used but are now of type string instead of an int.
mungegithub/mungers/triage-filer.go
Outdated
cmd.Flags().IntVar(&filer.topClustersCount, "triagesynccount", 10, "The number of clusters to sync issues for on github.") | ||
cmd.Flags().StringVar(&filer.triageURL, "triageURL", "https://go.k8s.io/triage", "The url prefix to add before cluster hash to create a link to the triage page for a specific cluster.") | ||
cmd.Flags().IntVar(&filer.windowDays, "triagewindowdays", 5, "The size of the sliding time window (in days) that is used to determine which failures to consider.") | ||
cmd.Flags().IntVar(&filer.syncFreqMins, "triagesyncfreq", 60, "The frequency at which to run the TriageFiler in minutes.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would duration be a better fit here? https://golang.org/pkg/flag/#Duration
Also can you default this to once a day? I really want to minimize the number of issues we automatically file. Said this elsewhere but too few auto-filed issues is WAY better than too many -- since too many just overwhelms people and they give up, reducing the value of all issues.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made the requested changes. Ready to be reviewed again.
1a71ca5
to
1a8eef7
Compare
FYI when you are ready for another round of reviews please leave a reply on each of the comments (Done, Ack, or anything else, really) to let us know to review again. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The size of this PR makes my head hurt
} | ||
|
||
// AddFlags will add any requested flags to the cobra `cmd`. | ||
func (f *TriageFiler) AddFlags(cmd *cobra.Command, config *github.Config) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thoughts:
-
Is it important to start with these as flags rather than consts? It is cheap/trivial to release a new version.
-
Should all of these start with triage?
-
Shouldn't the words be separated with hyphens? Aka
cluster-data-url
&c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed all but the 2 most important flags to constants. I kept the triage-sync-count (the number of failure clusters to sync) and triage-window-days (the size of the sliding window) flags since we may want to mess with these frequently at first.
Both of the names start with triage and use hyphens now.
return nil, err | ||
} | ||
defer resp.Body.Close() | ||
if resp.StatusCode != http.StatusOK { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should probably automatically retry 500 level errors a few times
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
d0c225c
to
ad1b242
Compare
…ilures identified on the triage page.
…ync. These are replaced by the triage-filer.
/lgtm |
…ster-manager and issue-creator. This change replaces the munger that created issues for individual flakes with a munger that creates issues for flakes based on the clustering data on the triage page.
Design Doc:
https://docs.google.com/a/google.com/document/d/1nnAI8lCCamcluvhh10Bz8vR9moSTyez1dCchU1qnCOI/edit?usp=sharing