{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/35924399","id":35924399,"diff_hunk":"@@ -0,0 +1,268 @@\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\"io/ioutil\"\n+\t\"os\"\n+\t\"os/exec\"\n+\t\"time\"\n+\n+\texservice \"github.com/GoogleCloudPlatform/kubernetes/contrib/mesos/pkg/executor/service\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/contrib/mesos/pkg/hyperkube\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/contrib/mesos/pkg/minion/config\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/contrib/mesos/pkg/runtime\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource\"\n+\t\"github.com/GoogleCloudPlatform/kubernetes/pkg/client\"\n+\n+\tlog \"github.com/golang/glog\"\n+\t\"github.com/kardianos/osext\"\n+\t\"github.com/spf13/pflag\"\n+\t\"gopkg.in/natefinch/lumberjack.v2\"\n+)\n+\n+type MinionServer struct {\n+\tKubeletExecutorServer *exservice.KubeletExecutorServer\n+\tprivateMountNS        bool\n+\thks                   hyperkube.Interface\n+\tclientConfig          *client.Config\n+\tkmBinary              string\n+\tdone                  chan struct{} // closed when shutting down\n+\texit                  chan error    // to signal fatal errors\n+\n+\tlogMaxSize      resource.Quantity\n+\tlogMaxBackups   int\n+\tlogMaxAgeInDays int\n+\n+\trunProxy     bool\n+\tproxyLogV    int\n+\tproxyBindall bool\n+}\n+\n+func NewMinionServer() *MinionServer {\n+\ts := &MinionServer{\n+\t\tKubeletExecutorServer: exservice.NewKubeletExecutorServer(),\n+\n+\t\tprivateMountNS: false, // disabled until Docker supports customization of the parent mount namespace\n+\t\tdone:           make(chan struct{}),\n+\t\texit:           make(chan error),\n+\n+\t\tlogMaxSize:      config.DefaultLogMaxSize(),\n+\t\tlogMaxBackups:   config.DefaultLogMaxBackups,\n+\t\tlogMaxAgeInDays: config.DefaultLogMaxAgeInDays,\n+\n+\t\trunProxy: true,\n+\t}\n+\n+\t// cache this for later use\n+\tbinary, err := osext.Executable()\n+\tif err != nil {\n+\t\tlog.Fatalf(\"failed to determine currently running executable: %v\", err)\n+\t}\n+\ts.kmBinary = binary\n+\n+\treturn s\n+}\n+\n+// filterArgsByFlagSet returns a list of args which are parsed by the given flag set\n+// and another list with those which do not match\n+func filterArgsByFlagSet(args []string, flags *pflag.FlagSet) ([]string, []string) {\n+\tmatched := []string{}\n+\tnotMatched := []string{}\n+\tfor _, arg := range args {\n+\t\terr := flags.Parse([]string{arg})\n+\t\tif err != nil {\n+\t\t\tnotMatched = append(notMatched, arg)\n+\t\t} else {\n+\t\t\tmatched = append(matched, arg)\n+\t\t}\n+\t}\n+\treturn matched, notMatched\n+}\n+\n+func (ms *MinionServer) launchProxyServer() {\n+\tbindAddress := \"0.0.0.0\"\n+\tif !ms.proxyBindall {\n+\t\tbindAddress = ms.KubeletExecutorServer.Address.String()\n+\t}\n+\targs := []string{\n+\t\tfmt.Sprintf(\"--bind-address=%s\", bindAddress),\n+\t\tfmt.Sprintf(\"--v=%d\", ms.proxyLogV),\n+\t\t\"--logtostderr=true\",\n+\t}\n+\n+\tif ms.clientConfig.Host != \"\" {\n+\t\targs = append(args, fmt.Sprintf(\"--master=%s\", ms.clientConfig.Host))\n+\t}\n+\n+\tms.launchHyperkubeServer(hyperkube.KM_PROXY, &args, \"proxy.log\")\n+}\n+\n+func (ms *MinionServer) launchExecutorServer() {\n+\tallArgs := os.Args[1:]\n+\n+\t// filter out minion flags, leaving those for the executor\n+\texecutorFlags := pflag.NewFlagSet(\"executor flags\", pflag.ContinueOnError)\n+\texecutorFlags.SetOutput(ioutil.Discard)\n+\tms.AddExecutorFlags(executorFlags)\n+\texecutorArgs, _ := filterArgsByFlagSet(allArgs, executorFlags)\n+\n+\t// run executor and quit minion server when this exits cleanly\n+\terr := ms.launchHyperkubeServer(hyperkube.KM_EXECUTOR, &executorArgs, \"executor.log\")\n+\tif err != nil {\n+\t\t// just return, executor will be restarted on error\n+\t\tlog.Error(err)\n+\t\treturn\n+\t}\n+\n+\tlog.Info(\"Executor exited cleanly, stopping the minion\")\n+\tms.exit <- nil\n+}\n+\n+func (ms *MinionServer) launchHyperkubeServer(server string, args *[]string, logFileName string) error {\n+\tlog.V(2).Infof(\"Spawning hyperkube %v with args '%+v'\", server, args)\n+\n+\t// prepare parameters\n+\tkmArgs := []string{server}\n+\tfor _, arg := range *args {\n+\t\tkmArgs = append(kmArgs, arg)\n+\t}\n+\n+\t// create command\n+\tcmd := exec.Command(ms.kmBinary, kmArgs...)\n+\tif _, err := cmd.StdoutPipe(); err != nil {\n+\t\t// fatal error => terminate minion\n+\t\terr = fmt.Errorf(\"error getting stdout of %v: %v\", server, err)\n+\t\tms.exit <- err\n+\t\treturn err\n+\t}\n+\tstderrLogs, err := cmd.StderrPipe()\n+\tif err != nil {\n+\t\t// fatal error => terminate minion\n+\t\terr = fmt.Errorf(\"error getting stderr of %v: %v\", server, err)\n+\t\tms.exit <- err\n+\t\treturn err\n+\t}\n+\n+\tch := make(chan struct{})\n+\tgo func() {\n+\t\tdefer func() {\n+\t\t\tselect {\n+\t\t\tcase <-ch:\n+\t\t\t\tlog.Infof(\"killing %v process...\", server)\n+\t\t\t\tif err = cmd.Process.Kill(); err != nil {\n+\t\t\t\t\tlog.Errorf(\"failed to kill %v process: %v\", server, err)\n+\t\t\t\t}\n+\t\t\tdefault:\n+\t\t\t}\n+\t\t}()\n+\n+\t\tmaxSize := ms.logMaxSize.Value()\n+\t\tif maxSize > 0 {\n+\t\t\t// convert to MB\n+\t\t\tmaxSize = maxSize / 1024 / 1024\n+\t\t\tif maxSize == 0 {\n+\t\t\t\tlog.Warning(\"maximal log file size is rounded to 1 MB\")\n+\t\t\t\tmaxSize = 1\n+\t\t\t}\n+\t\t}\n+\t\twriter := &lumberjack.Logger{\n+\t\t\tFilename:   logFileName,\n+\t\t\tMaxSize:    int(maxSize),\n+\t\t\tMaxBackups: ms.logMaxBackups,\n+\t\t\tMaxAge:     ms.logMaxAgeInDays,\n+\t\t}\n+\t\tdefer writer.Close()\n+\n+\t\tlog.V(2).Infof(\"Starting logging for %v: max log file size %d MB, keeping %d backups, for %d days\", server, maxSize, ms.logMaxBackups, ms.logMaxAgeInDays)\n+\n+\t\t<-ch\n+\t\twritten, err := io.Copy(writer, stderrLogs)\n+\t\tif err != nil {\n+\t\t\tlog.Errorf(\"error writing data to %v: %v\", logFileName, err)\n+\t\t}\n+\n+\t\tlog.Infof(\"wrote %d bytes to %v\", written, logFileName)\n+\t}()\n+\n+\t// if the server fails to start then we exit the executor, otherwise\n+\t// wait for the proxy process to end (and release resources after).\n+\tif err := cmd.Start(); err != nil {\n+\t\t// fatal error => terminate minion\n+\t\terr = fmt.Errorf(\"error starting %v: %v\", server, err)\n+\t\tms.exit <- err\n+\t\treturn err\n+\t}\n+\tclose(ch)\n+\tif err := cmd.Wait(); err != nil {\n+\t\tlog.Error(\"%v exited with error: %v\", server, err)\n+\t\terr = fmt.Errorf(\"%v exited with error: %v\", server, err)\n+\t\treturn err\n+\t}\n+\n+\treturn nil\n+}\n+\n+// runs the main kubelet loop, closing the kubeletFinished chan when the loop exits.\n+// never returns.\n+func (ms *MinionServer) Run(hks hyperkube.Interface, _ []string) error {\n+\tif ms.privateMountNS {\n+\t\t// only the Linux version will do anything\n+\t\tenterPrivateMountNamespace()\n+\t}\n+\n+\t// create apiserver client\n+\tclientConfig, err := ms.KubeletExecutorServer.CreateAPIServerClientConfig()\n+\tif err != nil {\n+\t\t// required for k8sm since we need to send api.Binding information\n+\t\t// back to the apiserver\n+\t\tlog.Fatalf(\"No API client: %v\", err)\n+\t}\n+\tms.clientConfig = clientConfig\n+\n+\t// run subprocess until\n+\tif ms.runProxy {\n+\t\tgo runtime.Until(ms.launchProxyServer, 5*time.Second, ms.done)\n+\t}\n+\tgo runtime.Until(ms.launchExecutorServer, 5*time.Second, ms.done)\n+\n+\t// wait until minion exit is requested\n+\terr = <-ms.exit\n+\tclose(ms.done)\n+\treturn err","path":"contrib/mesos/pkg/minion/server.go","position":248,"original_position":248,"commit_id":"d0f05882d1910e9f8bd5b006dffb88934b94689a","original_commit_id":"d0f05882d1910e9f8bd5b006dffb88934b94689a","user":{"login":"tsenart","id":67471,"avatar_url":"https://avatars.githubusercontent.com/u/67471?v=3","gravatar_id":"","url":"https://api.github.com/users/tsenart","html_url":"https://github.com/tsenart","followers_url":"https://api.github.com/users/tsenart/followers","following_url":"https://api.github.com/users/tsenart/following{/other_user}","gists_url":"https://api.github.com/users/tsenart/gists{/gist_id}","starred_url":"https://api.github.com/users/tsenart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsenart/subscriptions","organizations_url":"https://api.github.com/users/tsenart/orgs","repos_url":"https://api.github.com/users/tsenart/repos","events_url":"https://api.github.com/users/tsenart/events{/privacy}","received_events_url":"https://api.github.com/users/tsenart/received_events","type":"User","site_admin":false},"body":"`return <-ms.exit`","created_at":"2015-07-30T21:40:21Z","updated_at":"2015-07-30T21:40:21Z","html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928#discussion_r35924399","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/35924399"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928#discussion_r35924399"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928","id":41023685,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928","diff_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928.diff","patch_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/11928","number":11928,"state":"open","locked":false,"title":"Add Mesos hyperkube minion server ","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":"The minion hyperkube server will launch the executor and the proxy and rotate their logs, as a replacement of a S6 setup.","created_at":"2015-07-28T15:19:31Z","updated_at":"2015-07-30T21:40:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"adc42c418f5597d364cce3c8bed9fead72e270f1","assignee":{"login":"davidopp","id":8264113,"avatar_url":"https://avatars.githubusercontent.com/u/8264113?v=3","gravatar_id":"","url":"https://api.github.com/users/davidopp","html_url":"https://github.com/davidopp","followers_url":"https://api.github.com/users/davidopp/followers","following_url":"https://api.github.com/users/davidopp/following{/other_user}","gists_url":"https://api.github.com/users/davidopp/gists{/gist_id}","starred_url":"https://api.github.com/users/davidopp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidopp/subscriptions","organizations_url":"https://api.github.com/users/davidopp/orgs","repos_url":"https://api.github.com/users/davidopp/repos","events_url":"https://api.github.com/users/davidopp/events{/privacy}","received_events_url":"https://api.github.com/users/davidopp/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/11928/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/d0f05882d1910e9f8bd5b006dffb88934b94689a","head":{"label":"mesosphere:km-minion","ref":"km-minion","sha":"d0f05882d1910e9f8bd5b006dffb88934b94689a","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-07-07T06:08:00Z","pushed_at":"2015-07-30T19:34:14Z","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":95794,"stargazers_count":6,"watchers_count":6,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":2,"forks":3,"open_issues":2,"watchers":6,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"33278e79108a24825cc9c42ac39a4677c6454314","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"GoogleCloudPlatform/kubernetes","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes","description":"Container Cluster Manager from Google","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/releases{/id}","created_at":"2014-06-06T22:56:04Z","updated_at":"2015-07-30T21:10:54Z","pushed_at":"2015-07-30T21:39:21Z","git_url":"git://github.com/GoogleCloudPlatform/kubernetes.git","ssh_url":"git@github.com:GoogleCloudPlatform/kubernetes.git","clone_url":"https://github.com/GoogleCloudPlatform/kubernetes.git","svn_url":"https://github.com/GoogleCloudPlatform/kubernetes","homepage":"http://kubernetes.io","size":338007,"stargazers_count":9465,"watchers_count":9465,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2194,"mirror_url":null,"open_issues_count":1669,"forks":2194,"open_issues":1669,"watchers":9465,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/11928"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/11928"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/11928/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/11928/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/d0f05882d1910e9f8bd5b006dffb88934b94689a"}}}}