{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/38404113","id":38404113,"diff_hunk":"@@ -0,0 +1,519 @@\n+/*\n+Copyright 2015 The Kubernetes Authors All rights reserved.\n+\n+Licensed under the Apache License, Version 2.0 (the \"License\");\n+you may not use this file except in compliance with the License.\n+You may obtain a copy of the License at\n+\n+    http://www.apache.org/licenses/LICENSE-2.0\n+\n+Unless required by applicable law or agreed to in writing, software\n+distributed under the License is distributed on an \"AS IS\" BASIS,\n+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+See the License for the specific language governing permissions and\n+limitations under the License.\n+*/\n+\n+package minion\n+\n+import (\n+\t\"fmt\"\n+\t\"io\"\n+\t\"os/exec\"\n+\t\"sync\"\n+\t\"syscall\"\n+\t\"time\"\n+\n+\tlog \"github.com/golang/glog\"\n+)\n+\n+const defaultTaskRestartDelay = 5 * time.Second\n+\n+type taskCompletion struct {\n+\tname string // name of the task\n+\tcode int    // exit code that the task process completed with\n+}\n+\n+// systemProcess is a useful abstraction for testing\n+type systemProcess interface {\n+\t// Wait works like exec.Cmd.Wait()\n+\tWait() error\n+\n+\t// Kill returns the pid of the process that was killed\n+\tKill() (int, error)\n+}\n+\n+type cmdProcess struct {\n+\tdelegate *exec.Cmd\n+}\n+\n+func (cp *cmdProcess) Wait() error {\n+\treturn cp.delegate.Wait()\n+}\n+\n+func (cp *cmdProcess) Kill() (int, error) {\n+\t// TODO(jdef) SIGKILL is pretty harsh, should we implement kill escalation: start with TERM\n+\t// and follow w/ KILL in x seconds?\n+\n+\t// kill the entire process group, not just the one process\n+\tpid := cp.delegate.Process.Pid\n+\tprocessGroup := 0 - pid\n+\trc := syscall.Kill(processGroup, syscall.SIGKILL)\n+\treturn pid, rc\n+}\n+\n+// task is a specification for running a system process; it provides hooks for customizing\n+// logging and restart handling as well as provides event channels for communicating process\n+// termination and errors related to process management.\n+type task struct {\n+\tname         string                // required: unique name for this task\n+\tbin          string                // required: path to executable\n+\targs         []string              // optional: process arguments\n+\tenv          []string              // optional: process environment override\n+\tcreateLogger func() io.WriteCloser // factory func that builds a log writer\n+\tcmd          systemProcess         // process that we started\n+\terrCh        chan error            // errCh reports errors encountered while trying to execute task processes\n+\tcompletedCh  chan *taskCompletion  // code reports exit codes encountered when task processes exit\n+\tshouldQuit   chan struct{}         // shouldQuit is closed to indicate that the task should stop its running process, if any\n+\tdone         chan struct{}         // done closes when all processes related to the task have terminated\n+\tfinished     func(ok bool) bool    // callback invoked when a task process has completed; if ok then it will be restarted if it returns true\n+\trestartDelay time.Duration         // interval between repeated task restarts\n+\tstartProcess taskStateFn           // prepare and start a new live process, defaults to notStartedTask; should be set by run()\n+}\n+\n+// makeTask builds a newly initialized task object but does not start any processes for it\n+func makeTask(name string, bin string, args []string, env []string, cl func() io.WriteCloser) *task {\n+\treturn &task{\n+\t\tname:         name,\n+\t\tbin:          bin,\n+\t\targs:         args,\n+\t\tenv:          env,\n+\t\tcreateLogger: cl,\n+\t\tcompletedCh:  make(chan *taskCompletion),\n+\t\terrCh:        make(chan error),\n+\t\tshouldQuit:   make(chan struct{}),\n+\t\tdone:         make(chan struct{}),\n+\t\trestartDelay: defaultTaskRestartDelay,\n+\t}\n+}\n+\n+// spawnTask creates a new task and immediately attempts to spawn a process for the task\n+func spawnTask(name string, bin string, args []string, env []string, cl func() io.WriteCloser) *task {\n+\tt := makeTask(name, bin, args, env, cl)\n+\tgo t.run(notStartedTask)\n+\treturn t\n+}\n+\n+// run executes the state machine responsible for starting, monitoring, and possibly restarting\n+// a system process for the task. The initialState func is the entry point of the state machine.\n+// Upon returning the done, completedCh, and errCh chans are all closed.\n+func (t *task) run(initialState taskStateFn) {\n+\tt.startProcess = initialState\n+\n+\tdefer close(t.done)\n+\tdefer close(t.completedCh)\n+\tdefer close(t.errCh)\n+\n+\tstate := initialState\n+\tfor state != nil {\n+\t\tnext := state(t)\n+\t\tstate = next\n+\t}\n+}\n+\n+func (t *task) tryError(err error) {\n+\tselect {\n+\tcase <-t.shouldQuit:\n+\t\t// best effort\n+\t\tselect {\n+\t\tcase t.errCh <- err:\n+\t\tdefault:\n+\t\t}\n+\tcase t.errCh <- err:\n+\t}\n+}\n+\n+func (t *task) tryComplete(tc *taskCompletion) {\n+\tselect {\n+\tcase <-t.shouldQuit:\n+\t\t// best effort\n+\t\tselect {\n+\t\tcase t.completedCh <- tc:\n+\t\tdefault:\n+\t\t}\n+\tcase t.completedCh <- tc:\n+\t}\n+}\n+\n+type taskStateFn func(*task) taskStateFn\n+\n+func taskShouldRestart(t *task) taskStateFn {\n+\tselect {\n+\tcase <-t.shouldQuit:\n+\tdefault:\n+\t\t// sleep for a bit; then return t.startProcess\n+\t\ttm := time.NewTimer(t.restartDelay)\n+\t\tdefer tm.Stop()\n+\t\tselect {\n+\t\tcase <-tm.C:\n+\t\t\tselect {\n+\t\t\tcase <-t.shouldQuit:\n+\t\t\tdefault:\n+\t\t\t\tif t.finished != nil {\n+\t\t\t\t\tif t.finished(true) {\n+\t\t\t\t\t\treturn t.startProcess\n+\t\t\t\t\t}\n+\t\t\t\t\t// finish call decided not to respawn\n+\t\t\t\t\treturn nil\n+\t\t\t\t}\n+\t\t\t\treturn t.startProcess\n+\t\t\t}\n+\t\tcase <-t.shouldQuit:\n+\t\t}\n+\t}\n+\tif t.finished != nil {\n+\t\tt.finished(false)\n+\t}\n+\treturn nil\n+}\n+\n+func (t *task) initLogging(r io.Reader) {\n+\twriter := t.createLogger()\n+\tgo func() {\n+\t\tdefer writer.Close()\n+\t\t_, err := io.Copy(writer, r)\n+\t\tif err != nil && err != io.EOF {\n+\t\t\t// using tryError is racy because the state machine closes errCh and\n+\t\t\t// so we don't want to attempt to write to a closed/closing chan. so\n+\t\t\t// log this for now.\n+\t\t\tlog.Errorf(\"logger for task %q crashed: %v\", t.bin, err)\n+\t\t}\n+\t}()\n+}\n+\n+// notStartedTask spawns the given task and transitions to a startedTask state\n+func notStartedTask(t *task) taskStateFn {\n+\tlog.Infof(\"starting task process %q with args '%+v'\", t.bin, t.args)\n+\n+\t// create command\n+\tcmd := exec.Command(t.bin, t.args...)\n+\tif _, err := cmd.StdoutPipe(); err != nil {\n+\t\t// fatal error => terminate minion\n+\t\tt.tryError(fmt.Errorf(\"error getting stdout of %v: %v\", t.name, err))\n+\t\treturn taskShouldRestart","path":"contrib/mesos/pkg/minion/task.go","position":203,"original_position":203,"commit_id":"b6330c32f0c36c82378d42dcd5bce96f14cdd223","original_commit_id":"b6330c32f0c36c82378d42dcd5bce96f14cdd223","user":{"login":"sttts","id":730123,"avatar_url":"https://avatars.githubusercontent.com/u/730123?v=3","gravatar_id":"","url":"https://api.github.com/users/sttts","html_url":"https://github.com/sttts","followers_url":"https://api.github.com/users/sttts/followers","following_url":"https://api.github.com/users/sttts/following{/other_user}","gists_url":"https://api.github.com/users/sttts/gists{/gist_id}","starred_url":"https://api.github.com/users/sttts/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sttts/subscriptions","organizations_url":"https://api.github.com/users/sttts/orgs","repos_url":"https://api.github.com/users/sttts/repos","events_url":"https://api.github.com/users/sttts/events{/privacy}","received_events_url":"https://api.github.com/users/sttts/received_events","type":"User","site_admin":false},"body":"this looks strange: the error is fatal, but we restart.","created_at":"2015-09-01T10:14:08Z","updated_at":"2015-09-01T10:14:08Z","html_url":"https://github.com/kubernetes/kubernetes/pull/13295#discussion_r38404113","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/38404113"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/13295#discussion_r38404113"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295","id":43600282,"html_url":"https://github.com/kubernetes/kubernetes/pull/13295","diff_url":"https://github.com/kubernetes/kubernetes/pull/13295.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/13295.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/13295","number":13295,"state":"open","locked":false,"title":"WIP/MESOS: refactor process management in the minion controller","user":{"login":"jdef","id":2348332,"avatar_url":"https://avatars.githubusercontent.com/u/2348332?v=3","gravatar_id":"","url":"https://api.github.com/users/jdef","html_url":"https://github.com/jdef","followers_url":"https://api.github.com/users/jdef/followers","following_url":"https://api.github.com/users/jdef/following{/other_user}","gists_url":"https://api.github.com/users/jdef/gists{/gist_id}","starred_url":"https://api.github.com/users/jdef/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdef/subscriptions","organizations_url":"https://api.github.com/users/jdef/orgs","repos_url":"https://api.github.com/users/jdef/repos","events_url":"https://api.github.com/users/jdef/events{/privacy}","received_events_url":"https://api.github.com/users/jdef/received_events","type":"User","site_admin":false},"body":"- initial rewrite of child process management; more unit testing and soak testing needed\r\n  - adhoc testing blocked by https://github.com/mesosphere/kubernetes-mesos/issues/463 (xref #13003)\r\n\r\nxref https://github.com/mesosphere/kubernetes-mesos/issues/458","created_at":"2015-08-28T07:24:38Z","updated_at":"2015-09-01T10:14:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"90c8c0c6297c6219b74b78ba4c249be5fded6f10","assignee":{"login":"sttts","id":730123,"avatar_url":"https://avatars.githubusercontent.com/u/730123?v=3","gravatar_id":"","url":"https://api.github.com/users/sttts","html_url":"https://github.com/sttts","followers_url":"https://api.github.com/users/sttts/followers","following_url":"https://api.github.com/users/sttts/following{/other_user}","gists_url":"https://api.github.com/users/sttts/gists{/gist_id}","starred_url":"https://api.github.com/users/sttts/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sttts/subscriptions","organizations_url":"https://api.github.com/users/sttts/orgs","repos_url":"https://api.github.com/users/sttts/repos","events_url":"https://api.github.com/users/sttts/events{/privacy}","received_events_url":"https://api.github.com/users/sttts/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/13295/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/b6330c32f0c36c82378d42dcd5bce96f14cdd223","head":{"label":"mesosphere:minion-signals","ref":"minion-signals","sha":"b6330c32f0c36c82378d42dcd5bce96f14cdd223","user":{"login":"mesosphere","id":3458585,"avatar_url":"https://avatars.githubusercontent.com/u/3458585?v=3","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"repo":{"id":22277046,"name":"kubernetes","full_name":"mesosphere/kubernetes","owner":{"login":"mesosphere","id":3458585,"avatar_url":"https://avatars.githubusercontent.com/u/3458585?v=3","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mesosphere/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/mesosphere/kubernetes","forks_url":"https://api.github.com/repos/mesosphere/kubernetes/forks","keys_url":"https://api.github.com/repos/mesosphere/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mesosphere/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mesosphere/kubernetes/teams","hooks_url":"https://api.github.com/repos/mesosphere/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/mesosphere/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/mesosphere/kubernetes/events","assignees_url":"https://api.github.com/repos/mesosphere/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/mesosphere/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/mesosphere/kubernetes/tags","blobs_url":"https://api.github.com/repos/mesosphere/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mesosphere/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mesosphere/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/mesosphere/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mesosphere/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/mesosphere/kubernetes/languages","stargazers_url":"https://api.github.com/repos/mesosphere/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/mesosphere/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/mesosphere/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/mesosphere/kubernetes/subscription","commits_url":"https://api.github.com/repos/mesosphere/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/mesosphere/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/mesosphere/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/mesosphere/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/mesosphere/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/mesosphere/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mesosphere/kubernetes/merges","archive_url":"https://api.github.com/repos/mesosphere/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mesosphere/kubernetes/downloads","issues_url":"https://api.github.com/repos/mesosphere/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/mesosphere/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/mesosphere/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/mesosphere/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mesosphere/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/mesosphere/kubernetes/releases{/id}","created_at":"2014-07-26T02:50:13Z","updated_at":"2015-08-21T01:29:58Z","pushed_at":"2015-09-01T01:53:16Z","git_url":"git://github.com/mesosphere/kubernetes.git","ssh_url":"git@github.com:mesosphere/kubernetes.git","clone_url":"https://github.com/mesosphere/kubernetes.git","svn_url":"https://github.com/mesosphere/kubernetes","homepage":null,"size":105118,"stargazers_count":7,"watchers_count":7,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":3,"forks":3,"open_issues":3,"watchers":7,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"98801225d6c42b65515d0c303f6cc414fbdda0b9","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","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":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","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/kubernetes","description":"Container Cluster Manager from Google","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","created_at":"2014-06-06T22:56:04Z","updated_at":"2015-09-01T09:34:10Z","pushed_at":"2015-09-01T09:37:47Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":370451,"stargazers_count":9989,"watchers_count":9989,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2435,"mirror_url":null,"open_issues_count":1700,"forks":2435,"open_issues":1700,"watchers":9989,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/13295"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/13295"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/13295/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/13295/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/b6330c32f0c36c82378d42dcd5bce96f14cdd223"}}}}