{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/31239464","id":31239464,"diff_hunk":"@@ -81,9 +81,28 @@ func (podStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) fiel\n \treturn append(errorList, validation.ValidatePodUpdate(obj.(*api.Pod), old.(*api.Pod))...)\n }\n \n-// CheckGracefulDelete allows a pod to be gracefully deleted.\n+// CheckGracefulDelete allows a pod to be gracefully deleted. It updates the DeleteOptions to\n+// reflect the desired grace value.\n func (podStrategy) CheckGracefulDelete(obj runtime.Object, options *api.DeleteOptions) bool {\n-\treturn false\n+\tif options == nil {\n+\t\treturn false\n+\t}\n+\tpod := obj.(*api.Pod)\n+\t// use the user provided value\n+\tif options.GracePeriodSeconds != nil {\n+\t\tperiod := int64(*options.GracePeriodSeconds)\n+\t\t// if the pod is not currently being deleted, or the value isn't set, or the user value is less than the stored value\n+\t\tif pod.Spec.TerminationGracePeriodSeconds == nil || pod.DeletionTimestamp == nil || period < *pod.Spec.TerminationGracePeriodSeconds {\n+\t\t\tpod.Spec.TerminationGracePeriodSeconds = &period","path":"pkg/registry/pod/rest.go","position":18,"original_position":18,"commit_id":"777285438afbe688e224ec8cde27e23002d5339b","original_commit_id":"777285438afbe688e224ec8cde27e23002d5339b","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"body":"\r\n\r\n> On May 28, 2015, at 1:38 AM, Brian Grant <notifications@github.com> wrote:\r\n> \r\n> In pkg/registry/pod/rest.go:\r\n> \r\n> >  func (podStrategy) CheckGracefulDelete(obj runtime.Object, options *api.DeleteOptions) bool {\r\n> > -\treturn false\r\n> > +\tif options == nil {\r\n> > +\t\treturn false\r\n> > +\t}\r\n> > +\tpod := obj.(*api.Pod)\r\n> > +\t// use the user provided value\r\n> > +\tif options.GracePeriodSeconds != nil {\r\n> > +\t\tperiod := int64(*options.GracePeriodSeconds)\r\n> > +\t\t// if the pod is not currently being deleted, or the value isn't set, or the user value is less than the stored value\r\n> > +\t\tif pod.Spec.TerminationGracePeriodSeconds == nil || pod.DeletionTimestamp == nil || period < *pod.Spec.TerminationGracePeriodSeconds {\r\n> > +\t\t\tpod.Spec.TerminationGracePeriodSeconds = &period\r\n> Ok, I can see the point that the DeleteOptions are modifying the desired state, but it definitely adds a wrinkle to configuration reconciliation #1702.\r\n> \r\n> This may not be an issue for controller-generated pods, since they'll manage terminationGracePeriodSeconds in the pod template rather than in the pods themselves, but I want to get the principle sorted out.\r\n> \r\n> This isn't the only known instance where modifying an initialized field will happen -- e.g., auto-scaling will modify an initial replicas count and auto-sizing will modify initial cpu and memory values -- but either those values would be defaults from the beginning, or initial value \"hints\" could be provided via an annotation or in the auto-scaling/sizing configs. In either case, the config mechanism would know that the user didn't intend to configure those fields, since the user's config would not contain the initial values.\r\n> \r\n> If a user did have a pod managed by a declarative config file, they might legitimately want to declaratively update terminationGracePeriodSeconds, until it is set imperatively via DeleteOptions. I can tell you from experience that there will be scenarios where someone wants to update a pod during a (sufficiently long) grace period.\r\n> \r\n> The (declarative) semantics that I'm accustomed to, and that proposed in #1702, #1007, and elsewhere, is that removal of a field from a config implies that it should be restored to its default value before dropping it from the set of declaratively managed fields. If it were acceptable to require users to explicitly specify the updated value they expected or to explicitly nullify the field, as in a patch, in at least one declarative update, then that would make patch generation significantly simpler.\r\n> \r\nSo here's another thought.  This field is special in that it should only be shortened once delete timestamp is set.  That behavior needs to be documented in the schema - may not be increased post deletion - and config reconciliation probably has to take that into account.  If a resource has already been marked deleted, should we be limiting certain fields from being updated?  Right now we allow all changes that update allows, but does that potentially impact the expectation users set?  \r\n\r\nAlternatively, if instead we ignore updates to the fields on the apiserver post deletion, it does not matter what config reconciliation sends.  Ultimately that logic has to exist on a certain field (whether it's spec.TerminationPeriodInSeconds or metadata.DeleteInSeconds) if we want to enforce the \"only shrink grace period post deletion\" condition.  Is it more or less confusing to API clients to ignore a change to that field in certain cases?  It seems like a net reduction in overall complexity to ignore certain changes for clients, although it does reduce predictability.\r\n> We could potentially treat omission of a field simply as dropping it from the set of declaratively mana ged fiel ds, though I have no idea whether users would find that unintuitive. We'd still need to detect declarative removal of map and list elements, IMO, such as removal of a label or of a container or volume, so we couldn't just use the annotation containing the config to determine that the configuration changed, as I suggested for Kubelet's mirror pods (#8683).\r\n> \r\n> One challenge with using a magic map key as a json/yaml annotation in user configs to indicate that certain fields shouldn't be diff'ed during patch generation (e.g., $noupdate) is that we can only use the same key once per map. I suppose it could specify a list of field names.\r\n> \r\n> cc @ghodss for his thoughts\r\n> \r\n> —\r\n> Reply to this email directly or view it on GitHub.\r\n> \r\n","created_at":"2015-05-28T14:37:27Z","updated_at":"2015-05-28T14:37:27Z","html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641#discussion_r31239464","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/31239464"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641#discussion_r31239464"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641","id":35985767,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641","diff_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641.diff","patch_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/8641","number":8641,"state":"open","locked":false,"title":"Gracefully delete pods from the Kubelet","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"body":"This commit wires together the graceful delete option for pods on the Kubelet.  When a pod is deleted on the API server, a grace period is calculated that is based on the `Pod.Spec.TerminationGracePeriodInSeconds`, the user's provided grace period, or a default (30 seconds).  The grace period can only shrink once set. The value provided by the user (or the default) is set onto pod.Spec directly.\r\n\r\nWhen the Kubelet sees a pod with DeletionTimestamp set, it uses the value of Spec.TerminationGracePeriodInSeconds as the grace period sent to Docker.  When updating status, if the pod has DeletionTimestamp set and all containers are terminated, the Kubelet will update the\r\nstatus one last time and then invoke Delete(pod, grace: 0) to clean up the pod immediately.\r\n\r\nThis still needs tests and some e2e testing but is functionally complete.\r\n\r\nWhy this matters:\r\n\r\n* No one wants their database SIGKILL'ed\r\n\r\nKnown gaps:\r\n\r\n* [x] test when kubelet is restarted\r\n* [x] test graceful max is in place\r\n* [x] show indication in pod describe the resource is deleting\r\n* [x] verify replication controller handles this gracefully\r\n\r\nOpen questions\r\n\r\n* Should we remove deleting pods (DeletionTimestamp) from replication controller and endpoints controller counts immediately?\r\n* Is 30s a good default?\r\n\r\nImplements #1535 for pods","created_at":"2015-05-21T22:49:25Z","updated_at":"2015-05-28T14:37:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"96af868b4b7c89ca5df2f01b351567fea3cd977a","assignee":{"login":"bgrant0607","id":7725777,"avatar_url":"https://avatars.githubusercontent.com/u/7725777?v=3","gravatar_id":"","url":"https://api.github.com/users/bgrant0607","html_url":"https://github.com/bgrant0607","followers_url":"https://api.github.com/users/bgrant0607/followers","following_url":"https://api.github.com/users/bgrant0607/following{/other_user}","gists_url":"https://api.github.com/users/bgrant0607/gists{/gist_id}","starred_url":"https://api.github.com/users/bgrant0607/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgrant0607/subscriptions","organizations_url":"https://api.github.com/users/bgrant0607/orgs","repos_url":"https://api.github.com/users/bgrant0607/repos","events_url":"https://api.github.com/users/bgrant0607/events{/privacy}","received_events_url":"https://api.github.com/users/bgrant0607/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/8641/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/777285438afbe688e224ec8cde27e23002d5339b","head":{"label":"smarterclayton:gracefully_delete_pods","ref":"gracefully_delete_pods","sha":"777285438afbe688e224ec8cde27e23002d5339b","user":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"repo":{"id":21225407,"name":"kubernetes","full_name":"smarterclayton/kubernetes","owner":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/smarterclayton/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/smarterclayton/kubernetes","forks_url":"https://api.github.com/repos/smarterclayton/kubernetes/forks","keys_url":"https://api.github.com/repos/smarterclayton/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/smarterclayton/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/smarterclayton/kubernetes/teams","hooks_url":"https://api.github.com/repos/smarterclayton/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/smarterclayton/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/smarterclayton/kubernetes/events","assignees_url":"https://api.github.com/repos/smarterclayton/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/smarterclayton/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/smarterclayton/kubernetes/tags","blobs_url":"https://api.github.com/repos/smarterclayton/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/smarterclayton/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/smarterclayton/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/smarterclayton/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/smarterclayton/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/smarterclayton/kubernetes/languages","stargazers_url":"https://api.github.com/repos/smarterclayton/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/smarterclayton/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/smarterclayton/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/smarterclayton/kubernetes/subscription","commits_url":"https://api.github.com/repos/smarterclayton/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/smarterclayton/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/smarterclayton/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/smarterclayton/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/smarterclayton/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/smarterclayton/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/smarterclayton/kubernetes/merges","archive_url":"https://api.github.com/repos/smarterclayton/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/smarterclayton/kubernetes/downloads","issues_url":"https://api.github.com/repos/smarterclayton/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/smarterclayton/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/smarterclayton/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/smarterclayton/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/smarterclayton/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/smarterclayton/kubernetes/releases{/id}","created_at":"2014-06-26T02:28:13Z","updated_at":"2015-03-26T16:39:31Z","pushed_at":"2015-05-27T21:34:29Z","git_url":"git://github.com/smarterclayton/kubernetes.git","ssh_url":"git@github.com:smarterclayton/kubernetes.git","clone_url":"https://github.com/smarterclayton/kubernetes.git","svn_url":"https://github.com/smarterclayton/kubernetes","homepage":null,"size":60746,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"0bbba1c3d1b5d66f52fffaa6db706aae715c7e3e","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-05-28T13:22:33Z","pushed_at":"2015-05-28T14:35:19Z","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":292867,"stargazers_count":7962,"watchers_count":7962,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1665,"mirror_url":null,"open_issues_count":1244,"forks":1665,"open_issues":1244,"watchers":7962,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/8641"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/8641"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/8641/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/8641/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/777285438afbe688e224ec8cde27e23002d5339b"}}}}