{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments/210782163","pull_request_review_id":147071588,"id":210782163,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMDc4MjE2Mw==","diff_hunk":"@@ -408,6 +435,201 @@ func handleBadge(ja *jobs.JobAgent) http.HandlerFunc {\n \t}\n }\n \n+// handleRequestProwJobViews pre-renders a Spyglass page for a Prowjob source\n+// A valid Prow job view url takes the form:\n+//\n+// /view/prowjob/<jobname>/<buildID>\n+//\n+// Example:\n+// - /view/prowjob/echo-test/1021530234601607168\n+func handleRequestProwJobViews(sg *spyglass.Spyglass, ca *config.Agent) http.HandlerFunc {\n+\treturn func(w http.ResponseWriter, r *http.Request) {\n+\t\tsetHeadersNoCaching(w)\n+\t\tstart := time.Now()\n+\t\tsrc := strings.TrimPrefix(r.URL.Path, \"/view/\")\n+\n+\t\tpage, err := renderSpyglass(sg, ca, src)\n+\t\tif err != nil {\n+\t\t\tlogrus.WithError(err).Error(\"error rendering spyglass page\")\n+\t\t\thttp.Error(w, \"error getting views for job\", http.StatusInternalServerError)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tfmt.Fprint(w, page)\n+\t\telapsed := time.Since(start)\n+\t\tlogrus.WithField(\"duration\", elapsed).Info(\"Loading view for Prowjob completed.\")\n+\t}\n+}\n+\n+// handleRequestGCSJobViews pre-renders a Spyglass page for a GCS source\n+// A valid job GCS Job view url takes the form:\n+//\n+// /view/gcs/<bucketname>/<jobprefix>\n+//\n+// Example:\n+// - /view/gcs/kubernetes-jenkins/logs/ci-kubernetes-e2e-gce-large-performance/121\n+func handleRequestGCSJobViews(sg *spyglass.Spyglass, ca *config.Agent) http.HandlerFunc {\n+\treturn func(w http.ResponseWriter, r *http.Request) {\n+\t\tsetHeadersNoCaching(w)\n+\t\tstart := time.Now()\n+\t\tsrcData := strings.TrimPrefix(r.URL.Path, \"/view/gcs/\")\n+\t\tsrc := fmt.Sprintf(\"gs://%s\", srcData)\n+\n+\t\tpage, err := renderSpyglass(sg, ca, src)\n+\t\tif err != nil {\n+\t\t\tlogrus.WithError(err).Error(\"error rendering spyglass page\")\n+\t\t\thttp.Error(w, \"error getting views for job\", http.StatusInternalServerError)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tfmt.Fprint(w, page)\n+\t\telapsed := time.Since(start)\n+\t\tlogrus.WithField(\"duration\", elapsed).Info(\"Loading view from GCS completed.\")\n+\t}\n+}\n+\n+// handleRequestJobViews handles requests to get all available artifact views for a given job via\n+// a general src parameter, which can contain any string used to obtain job artifacts\n+// A valid general job view url takes the form:\n+//\n+// /view/?src=<URI-encoded-source-string>\n+//\n+// Example:\n+// - /view/?src=gs:%2F%2Fkubernetes-jenkins%2Fpr-logs%2Fpull%2Fkubeflow_kubeflow%2F1195%2Fkubeflow-presubmit%2F2558\n+func handleRequestJobViews(sg *spyglass.Spyglass, ca *config.Agent) http.HandlerFunc {\n+\treturn func(w http.ResponseWriter, r *http.Request) {\n+\t\tsetHeadersNoCaching(w)\n+\t\tstart := time.Now()\n+\t\tsrc := r.URL.Query().Get(\"src\")\n+\t\tif src == \"\" {\n+\t\t\thttp.Error(w, \"missing src query parameter\", http.StatusBadRequest)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tpage, err := renderSpyglass(sg, ca, src)\n+\t\tif err != nil {\n+\t\t\tlogrus.WithError(err).Error(\"error rendering spyglass page\")\n+\t\t\thttp.Error(w, \"error getting views for job\", http.StatusInternalServerError)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tfmt.Fprint(w, page)\n+\t\telapsed := time.Since(start)\n+\t\tlogrus.WithField(\"duration\", elapsed).Info(\"Loading view from generic src completed.\")\n+\t}\n+}\n+\n+// renderSpyglass returns a pre-rendered Spyglass page from the given source string\n+func renderSpyglass(sg *spyglass.Spyglass, ca *config.Agent, src string) (string, error) {\n+\tartifactNames, err := sg.ListArtifacts(src)\n+\tif err != nil {\n+\t\treturn \"\", fmt.Errorf(\"error listing artifacts: %v\", err)\n+\t}\n+\n+\tviewerCache := map[string][]string{}\n+\tviewersRegistry := ca.Config().Deck.Spyglass.Viewers\n+\n+\tfor re, viewerNames := range viewersRegistry {\n+\t\tmatches := []string{}\n+\t\tr, err := regexp.Compile(re)\n+\t\tif err != nil {\n+\t\t\tlogrus.WithError(err).Error(\"Regexp failed to compile.\")\n+\t\t\tcontinue\n+\t\t}\n+\t\tfor _, a := range artifactNames {\n+\t\t\tif r.MatchString(a) {\n+\t\t\t\tmatches = append(matches, a)\n+\t\t\t}\n+\t\t}\n+\t\tfor _, vName := range viewerNames {\n+\t\t\tviewerCache[vName] = matches\n+\t\t}\n+\t}\n+\n+\tviewsStart := time.Now()\n+\tlenses := sg.Views(viewerCache)\n+\tviewsElapsed := time.Since(viewsStart)\n+\tlogrus.WithField(\"duration\", viewsElapsed).Info(\"Loaded spyglass views\")\n+\n+\tvar viewBuf bytes.Buffer\n+\ttype ViewsTemplate struct {\n+\t\tViews       []spyglass.Lens\n+\t\tSource      string\n+\t\tViewerCache map[string][]string\n+\t}\n+\tvTmpl := ViewsTemplate{\n+\t\tViews:       lenses,\n+\t\tSource:      src,\n+\t\tViewerCache: viewerCache,\n+\t}\n+\tt, err := template.ParseFiles(\"/static/template/spyglass-template.html\")\n+\tif err != nil {\n+\t\treturn \"\", fmt.Errorf(\"error parsing template: %v\", err)\n+\t}\n+\n+\tif err = t.Execute(&viewBuf, vTmpl); err != nil {\n+\t\treturn \"\", fmt.Errorf(\"error rendering template: %v\", err)\n+\t}\n+\treturn viewBuf.String(), nil\n+}\n+\n+// handleArtifactView handles requests to load a single view for a job. This is what viewers\n+// will use to call back to themselves.\n+// Query params:\n+// - name: required, specifies the name of the viewer to load\n+// - src: required, specifies the job source from which to fetch artifacts\n+func handleArtifactView(sg *spyglass.Spyglass, ca *config.Agent) http.HandlerFunc {\n+\treturn func(w http.ResponseWriter, r *http.Request) {\n+\t\tstart := time.Now()\n+\t\tsetHeadersNoCaching(w)\n+\t\tw.Header().Set(\"Content-Type\", \"application/json\")\n+\t\tname := r.URL.Query().Get(\"name\")\n+\t\tsrc := r.URL.Query().Get(\"src\")\n+\t\tif name == \"\" {\n+\t\t\thttp.Error(w, \"missing name query parameter\", http.StatusBadRequest)\n+\t\t\treturn\n+\t\t}\n+\t\tif src == \"\" {\n+\t\t\thttp.Error(w, \"missing src query parameter\", http.StatusBadRequest)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tbody, err := ioutil.ReadAll(r.Body)\n+\t\tif err != nil {\n+\t\t\thttp.Error(w, \"failed to read body\", http.StatusBadRequest)","path":"prow/cmd/deck/main.go","position":243,"original_position":243,"commit_id":"ee03d60ba2864a0ad4c21bb121dc47ac7a6e6802","original_commit_id":"ee03d60ba2864a0ad4c21bb121dc47ac7a6e6802","user":{"login":"cjwagner","id":5334145,"node_id":"MDQ6VXNlcjUzMzQxNDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5334145?v=4","gravatar_id":"","url":"https://api.github.com/users/cjwagner","html_url":"https://github.com/cjwagner","followers_url":"https://api.github.com/users/cjwagner/followers","following_url":"https://api.github.com/users/cjwagner/following{/other_user}","gists_url":"https://api.github.com/users/cjwagner/gists{/gist_id}","starred_url":"https://api.github.com/users/cjwagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjwagner/subscriptions","organizations_url":"https://api.github.com/users/cjwagner/orgs","repos_url":"https://api.github.com/users/cjwagner/repos","events_url":"https://api.github.com/users/cjwagner/events{/privacy}","received_events_url":"https://api.github.com/users/cjwagner/received_events","type":"User","site_admin":false},"body":"I think failing to read the request body is a 5xx not a 4xx?","created_at":"2018-08-17T01:03:25Z","updated_at":"2018-08-17T01:16:55Z","html_url":"https://github.com/kubernetes/test-infra/pull/8922#discussion_r210782163","pull_request_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments/210782163"},"html":{"href":"https://github.com/kubernetes/test-infra/pull/8922#discussion_r210782163"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922","id":205607614,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1NjA3NjE0","html_url":"https://github.com/kubernetes/test-infra/pull/8922","diff_url":"https://github.com/kubernetes/test-infra/pull/8922.diff","patch_url":"https://github.com/kubernetes/test-infra/pull/8922.patch","issue_url":"https://api.github.com/repos/kubernetes/test-infra/issues/8922","number":8922,"state":"open","locked":false,"title":"Spyglass Prow implementation, config, and deployment","user":{"login":"paulangton","id":7799565,"node_id":"MDQ6VXNlcjc3OTk1NjU=","avatar_url":"https://avatars3.githubusercontent.com/u/7799565?v=4","gravatar_id":"","url":"https://api.github.com/users/paulangton","html_url":"https://github.com/paulangton","followers_url":"https://api.github.com/users/paulangton/followers","following_url":"https://api.github.com/users/paulangton/following{/other_user}","gists_url":"https://api.github.com/users/paulangton/gists{/gist_id}","starred_url":"https://api.github.com/users/paulangton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulangton/subscriptions","organizations_url":"https://api.github.com/users/paulangton/orgs","repos_url":"https://api.github.com/users/paulangton/repos","events_url":"https://api.github.com/users/paulangton/events{/privacy}","received_events_url":"https://api.github.com/users/paulangton/received_events","type":"User","site_admin":false},"body":"Implementation of Spyglass in Deck, separated out from #8830. This PR should merge after both #8920 and #8921, and will fail until they merge. Contains the details of endpoints, authentication, announcement, front end, config, and actual viewer implementations.\r\n\r\nThe viewer implementations are not the focus of this PR, they are there to show functionality, not production-hardened readiness. For this reason, the deployment of Spyglass links in the main Deck UI are commented out.\r\n\r\n/area prow\r\n/assign @fejta @BenTheElder @stevekuznetsov @krzyzacy","created_at":"2018-08-02T03:17:59Z","updated_at":"2018-08-17T01:16:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"400b3a30208135e3bd26cc4f26e3803bf06efc3c","assignee":{"login":"BenTheElder","id":917931,"node_id":"MDQ6VXNlcjkxNzkzMQ==","avatar_url":"https://avatars2.githubusercontent.com/u/917931?v=4","gravatar_id":"","url":"https://api.github.com/users/BenTheElder","html_url":"https://github.com/BenTheElder","followers_url":"https://api.github.com/users/BenTheElder/followers","following_url":"https://api.github.com/users/BenTheElder/following{/other_user}","gists_url":"https://api.github.com/users/BenTheElder/gists{/gist_id}","starred_url":"https://api.github.com/users/BenTheElder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenTheElder/subscriptions","organizations_url":"https://api.github.com/users/BenTheElder/orgs","repos_url":"https://api.github.com/users/BenTheElder/repos","events_url":"https://api.github.com/users/BenTheElder/events{/privacy}","received_events_url":"https://api.github.com/users/BenTheElder/received_events","type":"User","site_admin":false},"assignees":[{"login":"BenTheElder","id":917931,"node_id":"MDQ6VXNlcjkxNzkzMQ==","avatar_url":"https://avatars2.githubusercontent.com/u/917931?v=4","gravatar_id":"","url":"https://api.github.com/users/BenTheElder","html_url":"https://github.com/BenTheElder","followers_url":"https://api.github.com/users/BenTheElder/followers","following_url":"https://api.github.com/users/BenTheElder/following{/other_user}","gists_url":"https://api.github.com/users/BenTheElder/gists{/gist_id}","starred_url":"https://api.github.com/users/BenTheElder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenTheElder/subscriptions","organizations_url":"https://api.github.com/users/BenTheElder/orgs","repos_url":"https://api.github.com/users/BenTheElder/repos","events_url":"https://api.github.com/users/BenTheElder/events{/privacy}","received_events_url":"https://api.github.com/users/BenTheElder/received_events","type":"User","site_admin":false},{"login":"fejta","id":940341,"node_id":"MDQ6VXNlcjk0MDM0MQ==","avatar_url":"https://avatars2.githubusercontent.com/u/940341?v=4","gravatar_id":"","url":"https://api.github.com/users/fejta","html_url":"https://github.com/fejta","followers_url":"https://api.github.com/users/fejta/followers","following_url":"https://api.github.com/users/fejta/following{/other_user}","gists_url":"https://api.github.com/users/fejta/gists{/gist_id}","starred_url":"https://api.github.com/users/fejta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fejta/subscriptions","organizations_url":"https://api.github.com/users/fejta/orgs","repos_url":"https://api.github.com/users/fejta/repos","events_url":"https://api.github.com/users/fejta/events{/privacy}","received_events_url":"https://api.github.com/users/fejta/received_events","type":"User","site_admin":false},{"login":"krzyzacy","id":1108148,"node_id":"MDQ6VXNlcjExMDgxNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1108148?v=4","gravatar_id":"","url":"https://api.github.com/users/krzyzacy","html_url":"https://github.com/krzyzacy","followers_url":"https://api.github.com/users/krzyzacy/followers","following_url":"https://api.github.com/users/krzyzacy/following{/other_user}","gists_url":"https://api.github.com/users/krzyzacy/gists{/gist_id}","starred_url":"https://api.github.com/users/krzyzacy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krzyzacy/subscriptions","organizations_url":"https://api.github.com/users/krzyzacy/orgs","repos_url":"https://api.github.com/users/krzyzacy/repos","events_url":"https://api.github.com/users/krzyzacy/events{/privacy}","received_events_url":"https://api.github.com/users/krzyzacy/received_events","type":"User","site_admin":false},{"login":"stevekuznetsov","id":7328370,"node_id":"MDQ6VXNlcjczMjgzNzA=","avatar_url":"https://avatars1.githubusercontent.com/u/7328370?v=4","gravatar_id":"","url":"https://api.github.com/users/stevekuznetsov","html_url":"https://github.com/stevekuznetsov","followers_url":"https://api.github.com/users/stevekuznetsov/followers","following_url":"https://api.github.com/users/stevekuznetsov/following{/other_user}","gists_url":"https://api.github.com/users/stevekuznetsov/gists{/gist_id}","starred_url":"https://api.github.com/users/stevekuznetsov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevekuznetsov/subscriptions","organizations_url":"https://api.github.com/users/stevekuznetsov/orgs","repos_url":"https://api.github.com/users/stevekuznetsov/repos","events_url":"https://api.github.com/users/stevekuznetsov/events{/privacy}","received_events_url":"https://api.github.com/users/stevekuznetsov/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"stevekuznetsov","id":7328370,"node_id":"MDQ6VXNlcjczMjgzNzA=","avatar_url":"https://avatars1.githubusercontent.com/u/7328370?v=4","gravatar_id":"","url":"https://api.github.com/users/stevekuznetsov","html_url":"https://github.com/stevekuznetsov","followers_url":"https://api.github.com/users/stevekuznetsov/followers","following_url":"https://api.github.com/users/stevekuznetsov/following{/other_user}","gists_url":"https://api.github.com/users/stevekuznetsov/gists{/gist_id}","starred_url":"https://api.github.com/users/stevekuznetsov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevekuznetsov/subscriptions","organizations_url":"https://api.github.com/users/stevekuznetsov/orgs","repos_url":"https://api.github.com/users/stevekuznetsov/repos","events_url":"https://api.github.com/users/stevekuznetsov/events{/privacy}","received_events_url":"https://api.github.com/users/stevekuznetsov/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":412127043,"node_id":"MDU6TGFiZWw0MTIxMjcwNDM=","url":"https://api.github.com/repos/kubernetes/test-infra/labels/area/prow","name":"area/prow","color":"0052cc","default":false},{"id":484580953,"node_id":"MDU6TGFiZWw0ODQ1ODA5NTM=","url":"https://api.github.com/repos/kubernetes/test-infra/labels/cncf-cla:%20yes","name":"cncf-cla: yes","color":"bfe5bf","default":false},{"id":671133413,"node_id":"MDU6TGFiZWw2NzExMzM0MTM=","url":"https://api.github.com/repos/kubernetes/test-infra/labels/size/XXL","name":"size/XXL","color":"ee0000","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922/commits","review_comments_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922/comments","review_comment_url":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/test-infra/issues/8922/comments","statuses_url":"https://api.github.com/repos/kubernetes/test-infra/statuses/ee03d60ba2864a0ad4c21bb121dc47ac7a6e6802","head":{"label":"paulangton:spyglass-deploy","ref":"spyglass-deploy","sha":"ee03d60ba2864a0ad4c21bb121dc47ac7a6e6802","user":{"login":"paulangton","id":7799565,"node_id":"MDQ6VXNlcjc3OTk1NjU=","avatar_url":"https://avatars3.githubusercontent.com/u/7799565?v=4","gravatar_id":"","url":"https://api.github.com/users/paulangton","html_url":"https://github.com/paulangton","followers_url":"https://api.github.com/users/paulangton/followers","following_url":"https://api.github.com/users/paulangton/following{/other_user}","gists_url":"https://api.github.com/users/paulangton/gists{/gist_id}","starred_url":"https://api.github.com/users/paulangton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulangton/subscriptions","organizations_url":"https://api.github.com/users/paulangton/orgs","repos_url":"https://api.github.com/users/paulangton/repos","events_url":"https://api.github.com/users/paulangton/events{/privacy}","received_events_url":"https://api.github.com/users/paulangton/received_events","type":"User","site_admin":false},"repo":{"id":133848284,"node_id":"MDEwOlJlcG9zaXRvcnkxMzM4NDgyODQ=","name":"test-infra","full_name":"paulangton/test-infra","owner":{"login":"paulangton","id":7799565,"node_id":"MDQ6VXNlcjc3OTk1NjU=","avatar_url":"https://avatars3.githubusercontent.com/u/7799565?v=4","gravatar_id":"","url":"https://api.github.com/users/paulangton","html_url":"https://github.com/paulangton","followers_url":"https://api.github.com/users/paulangton/followers","following_url":"https://api.github.com/users/paulangton/following{/other_user}","gists_url":"https://api.github.com/users/paulangton/gists{/gist_id}","starred_url":"https://api.github.com/users/paulangton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulangton/subscriptions","organizations_url":"https://api.github.com/users/paulangton/orgs","repos_url":"https://api.github.com/users/paulangton/repos","events_url":"https://api.github.com/users/paulangton/events{/privacy}","received_events_url":"https://api.github.com/users/paulangton/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/paulangton/test-infra","description":"Test infrastructure for the Kubernetes project.","fork":true,"url":"https://api.github.com/repos/paulangton/test-infra","forks_url":"https://api.github.com/repos/paulangton/test-infra/forks","keys_url":"https://api.github.com/repos/paulangton/test-infra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/paulangton/test-infra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/paulangton/test-infra/teams","hooks_url":"https://api.github.com/repos/paulangton/test-infra/hooks","issue_events_url":"https://api.github.com/repos/paulangton/test-infra/issues/events{/number}","events_url":"https://api.github.com/repos/paulangton/test-infra/events","assignees_url":"https://api.github.com/repos/paulangton/test-infra/assignees{/user}","branches_url":"https://api.github.com/repos/paulangton/test-infra/branches{/branch}","tags_url":"https://api.github.com/repos/paulangton/test-infra/tags","blobs_url":"https://api.github.com/repos/paulangton/test-infra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/paulangton/test-infra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/paulangton/test-infra/git/refs{/sha}","trees_url":"https://api.github.com/repos/paulangton/test-infra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/paulangton/test-infra/statuses/{sha}","languages_url":"https://api.github.com/repos/paulangton/test-infra/languages","stargazers_url":"https://api.github.com/repos/paulangton/test-infra/stargazers","contributors_url":"https://api.github.com/repos/paulangton/test-infra/contributors","subscribers_url":"https://api.github.com/repos/paulangton/test-infra/subscribers","subscription_url":"https://api.github.com/repos/paulangton/test-infra/subscription","commits_url":"https://api.github.com/repos/paulangton/test-infra/commits{/sha}","git_commits_url":"https://api.github.com/repos/paulangton/test-infra/git/commits{/sha}","comments_url":"https://api.github.com/repos/paulangton/test-infra/comments{/number}","issue_comment_url":"https://api.github.com/repos/paulangton/test-infra/issues/comments{/number}","contents_url":"https://api.github.com/repos/paulangton/test-infra/contents/{+path}","compare_url":"https://api.github.com/repos/paulangton/test-infra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/paulangton/test-infra/merges","archive_url":"https://api.github.com/repos/paulangton/test-infra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/paulangton/test-infra/downloads","issues_url":"https://api.github.com/repos/paulangton/test-infra/issues{/number}","pulls_url":"https://api.github.com/repos/paulangton/test-infra/pulls{/number}","milestones_url":"https://api.github.com/repos/paulangton/test-infra/milestones{/number}","notifications_url":"https://api.github.com/repos/paulangton/test-infra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/paulangton/test-infra/labels{/name}","releases_url":"https://api.github.com/repos/paulangton/test-infra/releases{/id}","deployments_url":"https://api.github.com/repos/paulangton/test-infra/deployments","created_at":"2018-05-17T17:40:39Z","updated_at":"2018-08-11T03:25:33Z","pushed_at":"2018-08-15T07:27:36Z","git_url":"git://github.com/paulangton/test-infra.git","ssh_url":"git@github.com:paulangton/test-infra.git","clone_url":"https://github.com/paulangton/test-infra.git","svn_url":"https://github.com/paulangton/test-infra","homepage":null,"size":59124,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"44bc4c42170d0b1e039657301ae402fd053d9d0d","user":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":57333709,"node_id":"MDEwOlJlcG9zaXRvcnk1NzMzMzcwOQ==","name":"test-infra","full_name":"kubernetes/test-infra","owner":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/test-infra","description":"Test infrastructure for the Kubernetes project.","fork":false,"url":"https://api.github.com/repos/kubernetes/test-infra","forks_url":"https://api.github.com/repos/kubernetes/test-infra/forks","keys_url":"https://api.github.com/repos/kubernetes/test-infra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/test-infra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/test-infra/teams","hooks_url":"https://api.github.com/repos/kubernetes/test-infra/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/test-infra/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/test-infra/events","assignees_url":"https://api.github.com/repos/kubernetes/test-infra/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/test-infra/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/test-infra/tags","blobs_url":"https://api.github.com/repos/kubernetes/test-infra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/test-infra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/test-infra/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/test-infra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/test-infra/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/test-infra/languages","stargazers_url":"https://api.github.com/repos/kubernetes/test-infra/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/test-infra/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/test-infra/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/test-infra/subscription","commits_url":"https://api.github.com/repos/kubernetes/test-infra/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/test-infra/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/test-infra/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/test-infra/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/test-infra/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/test-infra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/test-infra/merges","archive_url":"https://api.github.com/repos/kubernetes/test-infra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/test-infra/downloads","issues_url":"https://api.github.com/repos/kubernetes/test-infra/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/test-infra/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/test-infra/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/test-infra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/test-infra/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/test-infra/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/test-infra/deployments","created_at":"2016-04-28T21:05:35Z","updated_at":"2018-08-16T23:34:18Z","pushed_at":"2018-08-17T00:42:03Z","git_url":"git://github.com/kubernetes/test-infra.git","ssh_url":"git@github.com:kubernetes/test-infra.git","clone_url":"https://github.com/kubernetes/test-infra.git","svn_url":"https://github.com/kubernetes/test-infra","homepage":null,"size":59552,"stargazers_count":514,"watchers_count":514,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":533,"mirror_url":null,"archived":false,"open_issues_count":322,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":533,"open_issues":322,"watchers":514,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922"},"html":{"href":"https://github.com/kubernetes/test-infra/pull/8922"},"issue":{"href":"https://api.github.com/repos/kubernetes/test-infra/issues/8922"},"comments":{"href":"https://api.github.com/repos/kubernetes/test-infra/issues/8922/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/test-infra/pulls/8922/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/test-infra/statuses/ee03d60ba2864a0ad4c21bb121dc47ac7a6e6802"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"cjwagner"}}