{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/114859571","pull_request_review_id":36355815,"id":114859571,"diff_hunk":"@@ -0,0 +1,173 @@\n+/*\n+Copyright 2017 The Kubernetes Authors.\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 audit\n+\n+import (\n+\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n+\t\"k8s.io/apimachinery/pkg/runtime\"\n+\t\"k8s.io/apimachinery/pkg/types\"\n+\t\"k8s.io/kubernetes/pkg/api\"\n+\t\"k8s.io/kubernetes/pkg/apis/authentication\"\n+)\n+\n+// Level defines the amount of information logged during auditing\n+type Level string\n+\n+// Valid audit levels\n+const (\n+\t// LevelNone disables auditing\n+\tLevelNone Level = \"None\"\n+\t// LevelMetadata provides the basic level of auditing.\n+\tLevelMetadata Level = \"Metadata\"\n+\t// LevelRequestObject provides Metadata level of auditing, and additionally\n+\t// logs the request object (does not apply for non-resource requests).\n+\tLevelRequestObject Level = \"RequestObject\"\n+\t// LevelResponseObject provides RequestObject level of auditing, and additionally\n+\t// logs the response object (does not apply for non-resource requests).\n+\tLevelResponseObject Level = \"ResponseObject\"\n+)\n+\n+// Event captures all the information that can be included in an API audit log.\n+type Event struct {\n+\tmetav1.TypeMeta\n+\t// +optional\n+\tmetav1.ListMeta\n+\n+\t// AuditLevel at which event was generated\n+\tLevel Level\n+\n+\t// Time the request reached the apiserver.\n+\tTimestamp metav1.Time\n+\t// Unique audit ID, generated for each request.\n+\t// +optional\n+\tAuditID types.UID\n+\t// RequestURI is the request URI as sent by the client to a server.\n+\tRequestURI string\n+\t// Verb is the kubernetes verb associated with the request.\n+\t// For non-resource requests, this is identical to HttpMethod.\n+\tVerb string\n+\t// Authenticated user information.\n+\tUser authentication.UserInfo\n+\t// Impersonated user information.\n+\t// +optional\n+\tImpersonate *authentication.UserInfo\n+\t// Source IP, from where the request originates.\n+\t// +optional\n+\tSourceIP string\n+\t// Object reference this request is targeted at.\n+\t// Does not apply for List-type requests, or non-resource requests.\n+\t// +optional\n+\tObjectRef *api.ObjectReference\n+\t// The response status, populated even when the ResponseObject is not a Status type.\n+\t// For successful responses, this will only include the Code and StatusSuccess.\n+\t// For non-status type error responses, this will be auto-populated with the error Message.\n+\t// +optional\n+\tResponseStatus *metav1.Status\n+\n+\t// API object from the request. The RequestObject is recorded as-is in the request, prior to\n+\t// version conversion, defaulting, admission or merging. It is an external versioned object type,\n+\t// and may not be a valid object on its own.  Omitted for non-resource requests.  Only logged at\n+\t// RequestObject Level and higher.\n+\t// +optional\n+\tRequestObject runtime.Object\n+\t// API object returned in the response. The ResponseObject is recorded after conversion to the\n+\t// external type.  Omitted for non-resource requests.  Only logged at ResponseObject Level and\n+\t// higher.\n+\t// +optional\n+\tResponseObject runtime.Object\n+}\n+\n+// EventList is a list of audit Events.\n+type EventList struct {\n+\tmetav1.TypeMeta\n+\t// +optional\n+\tmetav1.ListMeta\n+\n+\tEvents []Event\n+}\n+\n+// Policy defines the configuration of audit logging, and the rules for how different request\n+// categories are logged.\n+type Policy struct {\n+\tmetav1.TypeMeta\n+\t// +optional\n+\tmetav1.ListMeta\n+\n+\t// Rules specify the audit Level a request should be recorded at.\n+\t// A request may match multiple rules, in which case the FIRST matching rule is used.\n+\t// The default audit level is None, but can be overridden by a catch-all rule at the end of the list.\n+\tRules []PolicyRule\n+}\n+\n+// PolicyRule maps requests based off metadata to an audit Level.\n+// Requests must match the rules of every field (an intersection of rules).\n+type PolicyRule struct {\n+\t// The Level that requests matching this rule are recorded at.\n+\tLevel Level\n+\n+\t// The users (by authenticated user name) this rule applies to.\n+\t// An empty list implies every user.\n+\t// +optional\n+\tUsers []string\n+\t// The user groups this rule applies to. If a user is considered matching\n+\t// if the are a member of any of these groups\n+\t// An empty list implies every user group.\n+\t// +optional\n+\tUserGroups []string\n+\n+\t// The verbs that match this rule.\n+\t// An empty list implies every verb.\n+\t// +optional\n+\tVerbs []string\n+\n+\t// Rules can apply to API resources (such as \"pods\" or \"secrets\"),\n+\t// non-resource URL paths (such as \"/api\"), or neither, but not both.\n+\t// If neither is specified, the rule is treated as a default for all URLs.\n+\n+\t// Resource kinds that this rule matches. An empty list implies all kinds in all API groups.\n+\t// +optional\n+\tResourceKinds []GroupKinds\n+\t// Namespaces that this rule matches.\n+\t// The empty string \"\" matches non-namespaced resources.\n+\t// An empty list implies every namespace.\n+\t// +optional\n+\tNamespaces []string\n+\t// ResourceNames is an optional white list of names that the rule applies to.\n+\t// An empty list implies everything.\n+\t// +optional\n+\tResourceNames []string\n+\n+\t// NonResourceURLs is a set of URL paths that should be audited.\n+\t// *s are allowed, but only as the full, final step in the path.\n+\t// Examples:\n+\t//  \"/metrics\" - Log requests for apiserver metrics\n+\t//  \"/healthz*\" - Log all health checks","path":"staging/src/k8s.io/apiserver/pkg/apis/audit/types.go","position":158,"original_position":158,"commit_id":"4c5c10f630591dd726371b60679c3cadda28b81f","original_commit_id":"4c5c10f630591dd726371b60679c3cadda28b81f","user":{"login":"ericchiang","id":2342749,"avatar_url":"https://avatars2.githubusercontent.com/u/2342749?v=3","gravatar_id":"","url":"https://api.github.com/users/ericchiang","html_url":"https://github.com/ericchiang","followers_url":"https://api.github.com/users/ericchiang/followers","following_url":"https://api.github.com/users/ericchiang/following{/other_user}","gists_url":"https://api.github.com/users/ericchiang/gists{/gist_id}","starred_url":"https://api.github.com/users/ericchiang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericchiang/subscriptions","organizations_url":"https://api.github.com/users/ericchiang/orgs","repos_url":"https://api.github.com/users/ericchiang/repos","events_url":"https://api.github.com/users/ericchiang/events{/privacy}","received_events_url":"https://api.github.com/users/ericchiang/received_events","type":"User","site_admin":false},"body":"nit: I think RBAC requires you to include a slash before the wildcard for non-resource URLs, so for RBAC this would be:\r\n\r\n```\r\n/healthz\r\n/healthz/*\r\n```\r\n\r\nCan we update to be consistent?","created_at":"2017-05-04T18:51:06Z","updated_at":"2017-05-04T19:01:17Z","html_url":"https://github.com/kubernetes/kubernetes/pull/45315#discussion_r114859571","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/114859571"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/45315#discussion_r114859571"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315","id":118876874,"html_url":"https://github.com/kubernetes/kubernetes/pull/45315","diff_url":"https://github.com/kubernetes/kubernetes/pull/45315.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/45315.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/45315","number":45315,"state":"open","locked":false,"title":"[WIP] Advanced audit logging API","user":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars2.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"body":"This is an initial implementation of the API proposed in https://github.com/kubernetes/community/blob/master/contributors/design-proposals/auditing.md\r\n\r\nThis is a **work in progress**: obviously it's missing the versioned types (v1alpha1), a lot of the API machinery, and the auto generated code. **My goal** is to get some **early feedback** on the structures before adding the boilerplate.\r\n\r\nThis deviates from the exact API specified in the proposal in a number of ways. Here's a list of some of the changes I made, and why:\r\n\r\n- General API conformance (`metav1.{Type,List}Meta`, +optional, etc.)\r\n- Dropped fields that won't be part of the initial implementation (storage objects & filters), to be added later\r\n- {Request,Response}Body -> {Request,Response}Object - This is actually what the proposal originally had, and will be much better for adding Filters later, and provides a less protocol-dependent API. Note that there is currently no way to include Response body for non-resource requests.\r\n- Drop HttpMethod - redundant with verb\r\n- Response{StatusCode,ErrorMessage} collapsed into `ResponseStatus *metav1.Status` - This is the standard response type for resourec errors, but can hold genereric error responses too. Note that this is part of the `Metadata` Level.\r\n- Reverted `GroupResource` change in policy - See https://github.com/kubernetes/community/pull/145#discussion_r114673338: \r\n\r\n    > I missed this comment earlier. I actually prefer the way it was (separate `APIGroups []string` and `Resources []string`), which is how the RBAC policy is set up: [rbac/types.go](https://github.com/kubernetes/kubernetes/blob/e537cec9b0b39a4d5f503e8a35706d726deb9b7d/pkg/apis/rbac/types.go#L49). I think in the common cases this will mean much less typing, e.g.:\r\n    > - I want to audit a bunch of types from a single api group\r\n    > - I want to audit all types in a bunch of api groups\r\n    >\r\n    > In the case that the user really wants to capture a bunch of api types in a bunch of groups, but doesn't want all combinations, they can just create multiple policy rules (e.g. a separate PolicyRule for each apigroup).\r\n\r\n/cc @kubernetes/sig-auth-api-reviews @kubernetes/api-reviewers ","created_at":"2017-05-03T23:37:46Z","updated_at":"2017-05-04T19:01:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c51f4436725b50a9771a192b8c049d54a63839f","assignee":{"login":"soltysh","id":576341,"avatar_url":"https://avatars1.githubusercontent.com/u/576341?v=3","gravatar_id":"","url":"https://api.github.com/users/soltysh","html_url":"https://github.com/soltysh","followers_url":"https://api.github.com/users/soltysh/followers","following_url":"https://api.github.com/users/soltysh/following{/other_user}","gists_url":"https://api.github.com/users/soltysh/gists{/gist_id}","starred_url":"https://api.github.com/users/soltysh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/soltysh/subscriptions","organizations_url":"https://api.github.com/users/soltysh/orgs","repos_url":"https://api.github.com/users/soltysh/repos","events_url":"https://api.github.com/users/soltysh/events{/privacy}","received_events_url":"https://api.github.com/users/soltysh/received_events","type":"User","site_admin":false},"assignees":[{"login":"soltysh","id":576341,"avatar_url":"https://avatars1.githubusercontent.com/u/576341?v=3","gravatar_id":"","url":"https://api.github.com/users/soltysh","html_url":"https://github.com/soltysh","followers_url":"https://api.github.com/users/soltysh/followers","following_url":"https://api.github.com/users/soltysh/following{/other_user}","gists_url":"https://api.github.com/users/soltysh/gists{/gist_id}","starred_url":"https://api.github.com/users/soltysh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/soltysh/subscriptions","organizations_url":"https://api.github.com/users/soltysh/orgs","repos_url":"https://api.github.com/users/soltysh/repos","events_url":"https://api.github.com/users/soltysh/events{/privacy}","received_events_url":"https://api.github.com/users/soltysh/received_events","type":"User","site_admin":false},{"login":"deads2k","id":8225098,"avatar_url":"https://avatars3.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}],"milestone":{"url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/32","html_url":"https://github.com/kubernetes/kubernetes/milestone/32","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/32/labels","id":2264750,"number":32,"title":"v1.7","description":"","creator":{"login":"pwittrock","id":7882754,"avatar_url":"https://avatars3.githubusercontent.com/u/7882754?v=3","gravatar_id":"","url":"https://api.github.com/users/pwittrock","html_url":"https://github.com/pwittrock","followers_url":"https://api.github.com/users/pwittrock/followers","following_url":"https://api.github.com/users/pwittrock/following{/other_user}","gists_url":"https://api.github.com/users/pwittrock/gists{/gist_id}","starred_url":"https://api.github.com/users/pwittrock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pwittrock/subscriptions","organizations_url":"https://api.github.com/users/pwittrock/orgs","repos_url":"https://api.github.com/users/pwittrock/repos","events_url":"https://api.github.com/users/pwittrock/events{/privacy}","received_events_url":"https://api.github.com/users/pwittrock/received_events","type":"User","site_admin":false},"open_issues":321,"closed_issues":194,"state":"open","created_at":"2017-01-19T17:41:27Z","updated_at":"2017-05-04T15:32:41Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/45315/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/4c5c10f630591dd726371b60679c3cadda28b81f","head":{"label":"timstclair:audit-api","ref":"audit-api","sha":"4c5c10f630591dd726371b60679c3cadda28b81f","user":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars2.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"repo":{"id":36760336,"name":"kubernetes","full_name":"timstclair/kubernetes","owner":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars2.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/timstclair/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/timstclair/kubernetes","forks_url":"https://api.github.com/repos/timstclair/kubernetes/forks","keys_url":"https://api.github.com/repos/timstclair/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/timstclair/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/timstclair/kubernetes/teams","hooks_url":"https://api.github.com/repos/timstclair/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/timstclair/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/timstclair/kubernetes/events","assignees_url":"https://api.github.com/repos/timstclair/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/timstclair/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/timstclair/kubernetes/tags","blobs_url":"https://api.github.com/repos/timstclair/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/timstclair/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/timstclair/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/timstclair/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/timstclair/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/timstclair/kubernetes/languages","stargazers_url":"https://api.github.com/repos/timstclair/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/timstclair/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/timstclair/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/timstclair/kubernetes/subscription","commits_url":"https://api.github.com/repos/timstclair/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/timstclair/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/timstclair/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/timstclair/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/timstclair/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/timstclair/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/timstclair/kubernetes/merges","archive_url":"https://api.github.com/repos/timstclair/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/timstclair/kubernetes/downloads","issues_url":"https://api.github.com/repos/timstclair/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/timstclair/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/timstclair/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/timstclair/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/timstclair/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/timstclair/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/timstclair/kubernetes/deployments","created_at":"2015-06-02T20:36:50Z","updated_at":"2017-01-06T01:23:15Z","pushed_at":"2017-05-04T17:48:07Z","git_url":"git://github.com/timstclair/kubernetes.git","ssh_url":"git@github.com:timstclair/kubernetes.git","clone_url":"https://github.com/timstclair/kubernetes.git","svn_url":"https://github.com/timstclair/kubernetes","homepage":"http://kubernetes.io","size":418288,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_projects":true,"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":1,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"e537cec9b0b39a4d5f503e8a35706d726deb9b7d","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars1.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://avatars1.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":"Production-Grade Container Scheduling and Management","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}","deployments_url":"https://api.github.com/repos/kubernetes/kubernetes/deployments","created_at":"2014-06-06T22:56:04Z","updated_at":"2017-05-04T16:24:43Z","pushed_at":"2017-05-04T18:57:32Z","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":640778,"stargazers_count":22899,"watchers_count":22899,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8012,"mirror_url":null,"open_issues_count":5679,"forks":8012,"open_issues":5679,"watchers":22899,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/45315"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/45315"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/45315/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/45315/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/4c5c10f630591dd726371b60679c3cadda28b81f"}}}}
{"actor":{"display_login":"ericchiang"}}