{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/40979677","id":40979677,"diff_hunk":"@@ -0,0 +1,299 @@\n+/*\n+Copyright 2014 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 apiserver\n+\n+import (\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"reflect\"\n+\t\"testing\"\n+\t\"time\"\n+\n+\t\"github.com/emicklei/go-restful\"\n+\t\"github.com/evanphx/json-patch\"\n+\n+\t\"k8s.io/kubernetes/pkg/api\"\n+\tapierrors \"k8s.io/kubernetes/pkg/api/errors\"\n+\t\"k8s.io/kubernetes/pkg/api/latest\"\n+\t\"k8s.io/kubernetes/pkg/runtime\"\n+\t\"k8s.io/kubernetes/pkg/util\"\n+\t\"k8s.io/kubernetes/pkg/util/strategicpatch\"\n+)\n+\n+type testPatcher struct {\n+\t// startingPod is used for the first Get\n+\tstartingPod *api.Pod\n+\n+\t// updatePod is the pod that is used for conflict comparison and returned for the SECOND Get\n+\tupdatePod *api.Pod\n+\n+\tnumGets int\n+}\n+\n+func (p *testPatcher) New() runtime.Object {\n+\treturn &api.Pod{}\n+}\n+\n+func (p *testPatcher) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) {\n+\tinPod := obj.(*api.Pod)\n+\tif inPod.ResourceVersion != p.updatePod.ResourceVersion {\n+\t\treturn nil, false, apierrors.NewConflict(\"Pod\", inPod.Name, fmt.Errorf(\"existing %v, new %v\", p.updatePod.ResourceVersion, inPod.ResourceVersion))\n+\t}\n+\n+\treturn inPod, false, nil\n+}\n+\n+func (p *testPatcher) Get(ctx api.Context, name string) (runtime.Object, error) {\n+\tif p.numGets > 0 {\n+\t\treturn p.updatePod, nil\n+\t}\n+\tp.numGets++\n+\n+\treturn p.startingPod, nil\n+}\n+\n+type testNamer struct {\n+\tnamespace string\n+\tname      string\n+}\n+\n+func (p *testNamer) Namespace(req *restful.Request) (namespace string, err error) {\n+\treturn p.namespace, nil\n+}\n+\n+// Name returns the name from the request, and an optional namespace value if this is a namespace\n+// scoped call. An error is returned if the name is not available.\n+func (p *testNamer) Name(req *restful.Request) (namespace, name string, err error) {\n+\treturn p.namespace, p.name, nil\n+}\n+\n+// ObjectName returns the namespace and name from an object if they exist, or an error if the object\n+// does not support names.\n+func (p *testNamer) ObjectName(obj runtime.Object) (namespace, name string, err error) {\n+\treturn p.namespace, p.name, nil\n+}\n+\n+// SetSelfLink sets the provided URL onto the object. The method should return nil if the object\n+// does not support selfLinks.\n+func (p *testNamer) SetSelfLink(obj runtime.Object, url string) error {\n+\treturn errors.New(\"not implemented\")\n+}\n+\n+// GenerateLink creates a path and query for a given runtime object that represents the canonical path.\n+func (p *testNamer) GenerateLink(req *restful.Request, obj runtime.Object) (path, query string, err error) {\n+\treturn \"\", \"\", errors.New(\"not implemented\")\n+}\n+\n+// GenerateLink creates a path and query for a list that represents the canonical path.\n+func (p *testNamer) GenerateListLink(req *restful.Request) (path, query string, err error) {\n+\treturn \"\", \"\", errors.New(\"not implemented\")\n+}\n+\n+type patchTestCase struct {\n+\tname string\n+\n+\tstartingPod *api.Pod\n+\tchangedPod  *api.Pod\n+\tupdatePod   *api.Pod\n+\n+\texpectedPod   *api.Pod\n+\texpectedError string\n+}\n+\n+func (tc *patchTestCase) Run(t *testing.T) {\n+\tt.Logf(\"Starting test %s\", tc.name)\n+\n+\tnamespace := tc.startingPod.Namespace\n+\tname := tc.startingPod.Name\n+\n+\tcodec := latest.GroupOrDie(\"\").Codec\n+\n+\ttestPatcher := &testPatcher{}\n+\ttestPatcher.startingPod = tc.startingPod\n+\ttestPatcher.updatePod = tc.updatePod\n+\n+\tctx := api.NewDefaultContext()\n+\tctx = api.WithNamespace(ctx, namespace)\n+\n+\tnamer := &testNamer{namespace, name}\n+\n+\tversionedObj, err := api.Scheme.ConvertToVersion(&api.Pod{}, \"v1\")\n+\tif err != nil {\n+\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\treturn\n+\t}\n+\n+\tfor _, patchType := range []api.PatchType{api.JSONPatchType, api.MergePatchType, api.StrategicMergePatchType} {\n+\t\t// TODO SUPPORT THIS!\n+\t\tif patchType == api.JSONPatchType {\n+\t\t\tcontinue\n+\t\t}\n+\t\tt.Logf(\"Working with patchType %v\", patchType)\n+\n+\t\toriginalObjJS, err := codec.Encode(tc.startingPod)\n+\t\tif err != nil {\n+\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\treturn\n+\t\t}\n+\t\tchangedJS, err := codec.Encode(tc.changedPod)\n+\t\tif err != nil {\n+\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tpatch := []byte{}\n+\t\tswitch patchType {\n+\t\tcase api.JSONPatchType:\n+\t\t\tcontinue\n+\n+\t\tcase api.StrategicMergePatchType:\n+\t\t\tpatch, err = strategicpatch.CreateStrategicMergePatch(originalObjJS, changedJS, &api.Pod{})\n+\t\t\tif err != nil {\n+\t\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\t\treturn\n+\t\t\t}\n+\n+\t\tcase api.MergePatchType:\n+\t\t\tpatch, err = jsonpatch.CreateMergePatch(originalObjJS, changedJS)\n+\t\t\tif err != nil {\n+\t\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\t\treturn\n+\t\t\t}\n+\n+\t\t}\n+\n+\t\tresultObj, err := patchResource(ctx, 1*time.Second, versionedObj, testPatcher, name, patchType, patch, namer, codec)\n+\t\tif len(tc.expectedError) != 0 {\n+\t\t\tif err == nil || err.Error() != tc.expectedError {\n+\t\t\t\tt.Errorf(\"%s: expected error %v, but got %v\", tc.name, tc.expectedError, err)\n+\t\t\t\treturn\n+\t\t\t}\n+\t\t} else {\n+\t\t\tif err != nil {\n+\t\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\t\treturn\n+\t\t\t}\n+\t\t}\n+\n+\t\tif tc.expectedPod == nil {\n+\t\t\tif resultObj != nil {\n+\t\t\t\tt.Errorf(\"%s: unexpected result: %v\", tc.name, resultObj)\n+\t\t\t}\n+\t\t\treturn\n+\t\t}\n+\n+\t\tresultPod := resultObj.(*api.Pod)\n+\n+\t\t// roundtrip to get defaulting\n+\t\texpectedJS, err := codec.Encode(tc.expectedPod)\n+\t\tif err != nil {\n+\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\treturn\n+\t\t}\n+\t\texpectedObj, err := codec.Decode(expectedJS)\n+\t\tif err != nil {\n+\t\t\tt.Errorf(\"%s: unexpected error: %v\", tc.name, err)\n+\t\t\treturn\n+\t\t}\n+\t\treallyExpectedPod := expectedObj.(*api.Pod)\n+\n+\t\tif !reflect.DeepEqual(*reallyExpectedPod, *resultPod) {\n+\t\t\tt.Errorf(\"%s mismatch: %v\\n\", tc.name, util.ObjectGoPrintDiff(reallyExpectedPod, resultPod))\n+\t\t\treturn\n+\t\t}\n+\t}\n+\n+}\n+\n+func TestPatchResourceWithVersionConflict(t *testing.T) {\n+\tnamespace := \"bar\"\n+\tname := \"foo\"\n+\tfifteen := int64(15)\n+\tthirty := int64(30)\n+\n+\ttc := &patchTestCase{\n+\t\tname: \"TestPatchResourceWithVersionConflict\",\n+\n+\t\tstartingPod: &api.Pod{},\n+\t\tchangedPod:  &api.Pod{},\n+\t\tupdatePod:   &api.Pod{},\n+\n+\t\texpectedPod: &api.Pod{},\n+\t}\n+\n+\ttc.startingPod.Name = name\n+\ttc.startingPod.Namespace = namespace\n+\ttc.startingPod.ResourceVersion = \"1\"\n+\ttc.startingPod.APIVersion = \"v1\"\n+\ttc.startingPod.Spec.ActiveDeadlineSeconds = &fifteen\n+\n+\ttc.changedPod.Name = name\n+\ttc.changedPod.Namespace = namespace\n+\ttc.changedPod.ResourceVersion = \"1\"\n+\ttc.changedPod.APIVersion = \"v1\"\n+\ttc.changedPod.Spec.ActiveDeadlineSeconds = &thirty\n+\n+\ttc.updatePod.Name = name\n+\ttc.updatePod.Namespace = namespace\n+\ttc.updatePod.ResourceVersion = \"2\"\n+\ttc.updatePod.APIVersion = \"v1\"\n+\ttc.updatePod.Spec.ActiveDeadlineSeconds = &fifteen\n+\ttc.updatePod.Spec.NodeName = \"anywhere\"\n+\n+\ttc.expectedPod.Name = name\n+\ttc.expectedPod.Namespace = namespace\n+\ttc.expectedPod.ResourceVersion = \"2\"","path":"pkg/apiserver/resthandler_test.go","position":259,"original_position":259,"commit_id":"fcdc71cca1c484ecad4866df18d7f968f2bbf8a9","original_commit_id":"fcdc71cca1c484ecad4866df18d7f968f2bbf8a9","user":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"body":"The resource version should increment? I guess it's OK if the test thingy doesn't do that.","created_at":"2015-10-01T23:37:02Z","updated_at":"2015-10-01T23:37:02Z","html_url":"https://github.com/kubernetes/kubernetes/pull/14758#discussion_r40979677","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/40979677"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/14758#discussion_r40979677"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758","id":46315045,"html_url":"https://github.com/kubernetes/kubernetes/pull/14758","diff_url":"https://github.com/kubernetes/kubernetes/pull/14758.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/14758.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/14758","number":14758,"state":"open","locked":false,"title":"make patch handle conflicts gracefully","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 changes PATCH to operate as expected.  Supercedes https://github.com/kubernetes/kubernetes/pull/14679 (I hope)\r\n\r\nIt handles resource conflicts on update by:\r\n1. build a strategic merge patch from originalJS and the patchedJS\r\n2. build a strategic merge patch from originalJS and the currentJS\r\n3. ensure no conflicts between the two patches\r\n4. apply the patch from item 1 to the currentJS object\r\n5. retry the update\r\n\t\r\n@brendandburns @jlowdermilk @bgrant0607 ","created_at":"2015-09-29T18:39:18Z","updated_at":"2015-10-01T23:37:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7d4fb38baba06e91f98da5ae6d97fa6b1545092c","assignee":{"login":"lavalamp","id":647318,"avatar_url":"https://avatars.githubusercontent.com/u/647318?v=3","gravatar_id":"","url":"https://api.github.com/users/lavalamp","html_url":"https://github.com/lavalamp","followers_url":"https://api.github.com/users/lavalamp/followers","following_url":"https://api.github.com/users/lavalamp/following{/other_user}","gists_url":"https://api.github.com/users/lavalamp/gists{/gist_id}","starred_url":"https://api.github.com/users/lavalamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lavalamp/subscriptions","organizations_url":"https://api.github.com/users/lavalamp/orgs","repos_url":"https://api.github.com/users/lavalamp/repos","events_url":"https://api.github.com/users/lavalamp/events{/privacy}","received_events_url":"https://api.github.com/users/lavalamp/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/14758/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/fcdc71cca1c484ecad4866df18d7f968f2bbf8a9","head":{"label":"deads2k:fix-patch","ref":"fix-patch","sha":"fcdc71cca1c484ecad4866df18d7f968f2bbf8a9","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-01T11:49:07Z","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":110710,"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":"23759c8b2997a54f3d73f702b772ad641b2ea273","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-01T22:50:48Z","pushed_at":"2015-10-01T23:33:02Z","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":445105,"stargazers_count":10522,"watchers_count":10522,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2641,"mirror_url":null,"open_issues_count":2003,"forks":2641,"open_issues":2003,"watchers":10522,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/14758"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/14758"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/14758/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/14758/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/fcdc71cca1c484ecad4866df18d7f968f2bbf8a9"}}}}