{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/41462679","id":41462679,"diff_hunk":"@@ -50,137 +49,157 @@ $ kubectl logs --tail=20 nginx\n $ kubectl logs --since=1h nginx`\n )\n \n-func selectContainer(pod *api.Pod, in io.Reader, out io.Writer) string {\n-\tfmt.Fprintf(out, \"Please select a container:\\n\")\n-\toptions := sets.String{}\n-\tfor ix := range pod.Spec.Containers {\n-\t\tfmt.Fprintf(out, \"[%d] %s\\n\", ix+1, pod.Spec.Containers[ix].Name)\n-\t\toptions.Insert(pod.Spec.Containers[ix].Name)\n-\t}\n-\tfor {\n-\t\tvar input string\n-\t\tfmt.Fprintf(out, \"> \")\n-\t\tfmt.Fscanln(in, &input)\n-\t\tif options.Has(input) {\n-\t\t\treturn input\n-\t\t}\n-\t\tix, err := strconv.Atoi(input)\n-\t\tif err == nil && ix > 0 && ix <= len(pod.Spec.Containers) {\n-\t\t\treturn pod.Spec.Containers[ix-1].Name\n-\t\t}\n-\t\tfmt.Fprintf(out, \"Invalid input: %s\", input)\n-\t}\n-}\n-\n-type logParams struct {\n-\tcontainerName string\n+type LogsOptions struct {\n+\tClient *client.Client\n+\n+\tPodNamespace  string\n+\tPodName       string\n+\tContainerName string\n+\tFollow        bool\n+\tTimestamps    bool\n+\tPrevious      bool\n+\tLimitBytes    int\n+\tTail          int\n+\tSinceTime     *unversioned.Time\n+\tSinceSeconds  time.Duration\n+\n+\tOut io.Writer\n }\n \n // NewCmdLog creates a new pod log command\n func NewCmdLog(f *cmdutil.Factory, out io.Writer) *cobra.Command {\n-\tparams := &logParams{}\n+\to := &LogsOptions{\n+\t\tOut:  out,\n+\t\tTail: -1,\n+\t}\n+\n \tcmd := &cobra.Command{\n \t\tUse:     \"logs [-f] [-p] POD [-c CONTAINER]\",\n \t\tShort:   \"Print the logs for a container in a pod.\",\n \t\tLong:    \"Print the logs for a container in a pod. If the pod has only one container, the container name is optional.\",\n \t\tExample: log_example,\n \t\tRun: func(cmd *cobra.Command, args []string) {\n-\t\t\terr := RunLog(f, out, cmd, args, params)\n-\t\t\tcmdutil.CheckErr(err)\n+\t\t\tif len(os.Args) > 1 && os.Args[1] == \"log\" {\n+\t\t\t\tprintDeprecationWarning(\"logs\", \"log\")\n+\t\t\t}\n+\n+\t\t\tcmdutil.CheckErr(o.Complete(f, out, cmd, args))\n+\t\t\tcmdutil.CheckErr(o.Validate(cmd))\n+\t\t\tcmdutil.CheckErr(o.RunLog())\n \t\t},\n \t\tAliases: []string{\"log\"},\n \t}\n-\tcmd.Flags().BoolP(\"follow\", \"f\", false, \"Specify if the logs should be streamed.\")\n-\tcmd.Flags().Bool(\"timestamps\", false, \"Include timestamps on each line in the log output\")\n+\tcmd.Flags().BoolVarP(&o.Follow, \"follow\", \"f\", o.Follow, \"Specify if the logs should be streamed.\")\n+\tcmd.Flags().BoolVar(&o.Timestamps, \"timestamps\", o.Timestamps, \"Include timestamps on each line in the log output\")\n \tcmd.Flags().Bool(\"interactive\", true, \"If true, prompt the user for input when required. Default true.\")\n-\tcmd.Flags().BoolP(\"previous\", \"p\", false, \"If true, print the logs for the previous instance of the container in a pod if it exists.\")\n-\tcmd.Flags().Int(\"limit-bytes\", 0, \"Maximum bytes of logs to return. Defaults to no limit.\")\n-\tcmd.Flags().Int(\"tail\", -1, \"Lines of recent log file to display. Defaults to -1, showing all log lines.\")\n+\tcmd.Flags().MarkDeprecated(\"interactive\", \"This flag is no longer respected and there is no replacement.\")\n+\tcmd.Flags().IntVar(&o.LimitBytes, \"limit-bytes\", o.LimitBytes, \"Maximum bytes of logs to return. Defaults to no limit.\")\n+\tcmd.Flags().BoolVarP(&o.Previous, \"previous\", \"p\", o.Previous, \"If true, print the logs for the previous instance of the container in a pod if it exists.\")\n+\tcmd.Flags().IntVar(&o.Tail, \"tail\", o.Tail, \"Lines of recent log file to display. Defaults to -1, showing all log lines.\")\n \tcmd.Flags().String(\"since-time\", \"\", \"Only return logs after a specific date (RFC3339). Defaults to all logs. Only one of since-time / since may be used.\")\n-\tcmd.Flags().Duration(\"since\", 0, \"Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs. Only one of since-time / since may be used.\")\n-\tcmd.Flags().StringVarP(&params.containerName, \"container\", \"c\", \"\", \"Container name\")\n+\tcmd.Flags().DurationVar(&o.SinceSeconds, \"since\", o.SinceSeconds, \"Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs. Only one of since-time / since may be used.\")\n+\tcmd.Flags().StringVarP(&o.ContainerName, \"container\", \"c\", o.ContainerName, \"Container name\")\n \treturn cmd\n }\n \n-// RunLog retrieves a pod log\n-func RunLog(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, p *logParams) error {\n-\tif len(os.Args) > 1 && os.Args[1] == \"log\" {\n-\t\tprintDeprecationWarning(\"logs\", \"log\")\n-\t}\n-\n-\tif len(args) == 0 {\n+func (o *LogsOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error {\n+\tswitch len(args) {\n+\tcase 0:\n \t\treturn cmdutil.UsageError(cmd, \"POD is required for log\")\n-\t}\n \n-\tif len(args) > 2 {\n-\t\treturn cmdutil.UsageError(cmd, \"log POD [CONTAINER]\")\n-\t}\n+\tcase 1:\n+\t\to.PodName = args[0]\n+\tcase 2:\n+\t\to.PodName = args[0]\n+\t\to.ContainerName = args[1]\n \n-\tsinceSeconds := cmdutil.GetFlagDuration(cmd, \"since\")\n-\tsinceTime := cmdutil.GetFlagString(cmd, \"since-time\")\n-\tif len(sinceTime) > 0 && sinceSeconds > 0 {\n-\t\treturn cmdutil.UsageError(cmd, \"only one of --since, --since-time may be specified\")\n+\tdefault:\n+\t\treturn cmdutil.UsageError(cmd, \"log POD [CONTAINER]\")\n \t}\n \n-\tnamespace, _, err := f.DefaultNamespace()\n+\tvar err error\n+\to.PodNamespace, _, err = f.DefaultNamespace()\n \tif err != nil {\n \t\treturn err\n \t}\n-\tclient, err := f.Client()\n+\to.Client, err = f.Client()\n \tif err != nil {\n \t\treturn err\n \t}\n \n-\tpodID := args[0]\n+\tsinceTime := cmdutil.GetFlagString(cmd, \"since-time\")\n+\tif len(sinceTime) > 0 {\n+\t\tt, err := api.ParseRFC3339(sinceTime, unversioned.Now)\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\t\to.SinceTime = &t\n+\t}\n \n-\tpod, err := client.Pods(namespace).Get(podID)\n+\treturn nil\n+}\n+\n+func (o *LogsOptions) Validate(cmd *cobra.Command) error {\n+\tif len(o.PodName) == 0 {\n+\t\treturn cmdutil.UsageError(cmd, \"POD must be specified\")\n+\t}\n+\tif o.LimitBytes < 0 {\n+\t\treturn cmdutil.UsageError(cmd, \"--limit-bytes must be greater than or equal to zero\")\n+\t}\n+\tif o.Tail < -1 {\n+\t\treturn cmdutil.UsageError(cmd, \"--tail must be greater than or equal to -1\")\n+\t}\n+\tif o.SinceTime != nil && o.SinceSeconds > 0 {\n+\t\treturn cmdutil.UsageError(cmd, \"only one of --since, --since-time may be specified\")\n+\t}\n+\n+\treturn nil\n+}\n+\n+// RunLog retrieves a pod log\n+func (o *LogsOptions) RunLog() error {\n+\tpod, err := o.Client.Pods(o.PodNamespace).Get(o.PodName)","path":"pkg/kubectl/cmd/log.go","position":174,"original_position":174,"commit_id":"1025f7a726c5d2dc5283bbe8959c2821adb63b5b","original_commit_id":"1025f7a726c5d2dc5283bbe8959c2821adb63b5b","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"body":"> Can we use the resource builder with pod resources defaulted?\r\n\r\nI don't think I want to do it here.  In fact, I'm not certain its the right abstraction for what we want here.  In writing https://github.com/openshift/origin/pull/4997, I realized that we don't actually want to retrieve the referenced resource in all cases.  In some cases, we simply use it for referential lookups of the resources we're interested in.  ","created_at":"2015-10-07T23:51:47Z","updated_at":"2015-10-07T23:51:47Z","html_url":"https://github.com/kubernetes/kubernetes/pull/15232#discussion_r41462679","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/41462679"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/15232#discussion_r41462679"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232","id":47042513,"html_url":"https://github.com/kubernetes/kubernetes/pull/15232","diff_url":"https://github.com/kubernetes/kubernetes/pull/15232.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/15232.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/15232","number":15232,"state":"open","locked":false,"title":"refactor kubectl logs to be composeable","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"body":"This refactors the `kubectl logs` to allow reuse downstream.  Having the `LogsOptions` object makes it easy to delegate to this command.\r\n\r\n@kargakis @kubernetes/kubectl ","created_at":"2015-10-07T15:28:06Z","updated_at":"2015-10-07T23:51:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1b8dc94af826f457ec8a6bded7aa93c11fba3898","assignee":{"login":"brendandburns","id":5751682,"avatar_url":"https://avatars.githubusercontent.com/u/5751682?v=3","gravatar_id":"","url":"https://api.github.com/users/brendandburns","html_url":"https://github.com/brendandburns","followers_url":"https://api.github.com/users/brendandburns/followers","following_url":"https://api.github.com/users/brendandburns/following{/other_user}","gists_url":"https://api.github.com/users/brendandburns/gists{/gist_id}","starred_url":"https://api.github.com/users/brendandburns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendandburns/subscriptions","organizations_url":"https://api.github.com/users/brendandburns/orgs","repos_url":"https://api.github.com/users/brendandburns/repos","events_url":"https://api.github.com/users/brendandburns/events{/privacy}","received_events_url":"https://api.github.com/users/brendandburns/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/15232/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1025f7a726c5d2dc5283bbe8959c2821adb63b5b","head":{"label":"deads2k:refactor-logs","ref":"refactor-logs","sha":"1025f7a726c5d2dc5283bbe8959c2821adb63b5b","user":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"repo":{"id":24939417,"name":"kubernetes","full_name":"deads2k/kubernetes","owner":{"login":"deads2k","id":8225098,"avatar_url":"https://avatars.githubusercontent.com/u/8225098?v=3","gravatar_id":"","url":"https://api.github.com/users/deads2k","html_url":"https://github.com/deads2k","followers_url":"https://api.github.com/users/deads2k/followers","following_url":"https://api.github.com/users/deads2k/following{/other_user}","gists_url":"https://api.github.com/users/deads2k/gists{/gist_id}","starred_url":"https://api.github.com/users/deads2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deads2k/subscriptions","organizations_url":"https://api.github.com/users/deads2k/orgs","repos_url":"https://api.github.com/users/deads2k/repos","events_url":"https://api.github.com/users/deads2k/events{/privacy}","received_events_url":"https://api.github.com/users/deads2k/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/deads2k/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/deads2k/kubernetes","forks_url":"https://api.github.com/repos/deads2k/kubernetes/forks","keys_url":"https://api.github.com/repos/deads2k/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/deads2k/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/deads2k/kubernetes/teams","hooks_url":"https://api.github.com/repos/deads2k/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/deads2k/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/deads2k/kubernetes/events","assignees_url":"https://api.github.com/repos/deads2k/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/deads2k/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/deads2k/kubernetes/tags","blobs_url":"https://api.github.com/repos/deads2k/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/deads2k/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/deads2k/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/deads2k/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/deads2k/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/deads2k/kubernetes/languages","stargazers_url":"https://api.github.com/repos/deads2k/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/deads2k/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/deads2k/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/deads2k/kubernetes/subscription","commits_url":"https://api.github.com/repos/deads2k/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/deads2k/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/deads2k/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/deads2k/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/deads2k/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/deads2k/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/deads2k/kubernetes/merges","archive_url":"https://api.github.com/repos/deads2k/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/deads2k/kubernetes/downloads","issues_url":"https://api.github.com/repos/deads2k/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/deads2k/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/deads2k/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/deads2k/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/deads2k/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/deads2k/kubernetes/releases{/id}","created_at":"2014-10-08T12:24:01Z","updated_at":"2015-05-08T19:55:15Z","pushed_at":"2015-10-07T19:13:30Z","git_url":"git://github.com/deads2k/kubernetes.git","ssh_url":"git@github.com:deads2k/kubernetes.git","clone_url":"https://github.com/deads2k/kubernetes.git","svn_url":"https://github.com/deads2k/kubernetes","homepage":null,"size":112394,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"43f9280a5df32879b10085bc17a541fbb4d7ffa1","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-10-07T23:12:18Z","pushed_at":"2015-10-07T23:49:43Z","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":448561,"stargazers_count":10595,"watchers_count":10595,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2661,"mirror_url":null,"open_issues_count":2025,"forks":2661,"open_issues":2025,"watchers":10595,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/15232"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/15232"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/15232/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/15232/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/1025f7a726c5d2dc5283bbe8959c2821adb63b5b"}}}}