{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/85382284","pull_request_review_id":6100987,"id":85382284,"diff_hunk":"@@ -0,0 +1,509 @@\n+/*\n+Copyright 2016 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 e2e\n+\n+import (\n+\t\"k8s.io/kubernetes/pkg/api\"\n+\t\"k8s.io/kubernetes/pkg/api/unversioned\"\n+\t\"k8s.io/kubernetes/pkg/apis/extensions\"\n+\t\"k8s.io/kubernetes/pkg/util/intstr\"\n+\t\"k8s.io/kubernetes/test/e2e/framework\"\n+\n+\t\"fmt\"\n+\t. \"github.com/onsi/ginkgo\"\n+\t. \"github.com/onsi/gomega\"\n+)\n+\n+/*\n+The following Network Policy tests verify that policy object definitions\n+are correctly enforced by a networking plugin. It does this by launching\n+a simple netcat server,\n+\n+We test the following:\n+\t-  Namespace ingress isolation set to DefaultDeny\n+\t- Full TCP isolation\n+\t- Policy rules to allow mono-directional TCP connectivity\n+\t- Policy rules to allow bi-directional TCP connectivity\n+\n+\tTODO:\n+\t-  Test UDP traffic\n+\t-  Test progressively increased isolation (bidir->monodir->fully isolated)\n+*/\n+\n+const (\n+\tlisteningPort1 = 80\n+\tlisteningPort2 = 81\n+\tserverName     = \"server\"\n+\tclientAName    = \"client-a\"\n+\tclientBName    = \"client-b\"\n+)\n+\n+var _ = framework.KubeDescribe(\"NetworkPolicy\", func() {\n+\tf := framework.NewDefaultFramework(\"network-policy\")\n+\n+\tIt(\"should support setting DefaultDeny namespace policy [Feature:NetworkPolicy]\", func() {\n+\t\tns := f.Namespace\n+\n+\t\tBy(\"Create a simple server.\")\n+\t\tpodServer, service := createServerPod(f, ns, serverName, []int{listeningPort1})\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the server.\")\n+\t\t\tif err := f.Client.Pods(ns.Name).Delete(podServer.Name, nil); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete pod %v: %v\", podServer.Name, err)\n+\t\t\t}\n+\t\t}()\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the server's service.\")\n+\t\t\tif err := f.Client.Services(ns.Name).Delete(service.Name); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete svc %v: %v\", service.Name, err)\n+\t\t\t}\n+\t\t}()\n+\t\tframework.Logf(\"Waiting for Server to come up.\")\n+\t\terr := framework.WaitForPodRunningInNamespace(f.Client, podServer)\n+\t\tExpect(err).NotTo(HaveOccurred())\n+\n+\t\t// Create a pod with name 'client-a', which should be able to communicate with server.\n+\t\tBy(\"Creating client-a which will be able to contact the server since isolation is off.\")\n+\t\tpodClientA := createClientPod(f, ns, clientAName, service, listeningPort1)\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the pod client-a\")\n+\t\t\tif err := f.Client.Pods(ns.Name).Delete(podClientA.Name, nil); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete pod %v: %v\", podClientA.Name, err)\n+\t\t\t}\n+\t\t}()\n+\n+\t\tframework.Logf(\"Waiting for client-a to to come up.\")\n+\t\terr = framework.WaitForPodRunningInNamespace(f.Client, podClientA)\n+\t\tExpect(err).NotTo(HaveOccurred(), \"waiting for Client-A to run\")\n+\t\tframework.Logf(\"Waiting for client-a to complete.\")\n+\t\terr = framework.WaitForPodSuccessInNamespace(f.Client, podClientA.Name, ns.Name)\n+\t\tExpect(err).NotTo(HaveOccurred(), \"checking client-a could communicate with server.\")\n+\n+\t\tframework.Logf(\"Enabling network isolation.\")\n+\t\tsetNamespaceIsolation(f, ns, \"DefaultDeny\")\n+\n+\t\t// Create a pod with name 'client-b', which will attempt to comunicate with the server,\n+\t\t//  but should not be able to now that isolation is on.\n+\t\tBy(\"Creating client-b which should *not* be able to contact the server.\")\n+\t\tpodClientB := createClientPod(f, ns, clientBName, service, listeningPort1)\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the pod client-b.\")\n+\t\t\tif err := f.Client.Pods(ns.Name).Delete(podClientB.Name, nil); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete pod %v: %v\", podClientB.Name, err)\n+\t\t\t}\n+\t\t}()\n+\n+\t\tframework.Logf(\"Waiting for client-b to run.\")\n+\t\terr = framework.WaitForPodRunningInNamespace(f.Client, podClientB)\n+\t\tExpect(err).NotTo(HaveOccurred(), \"waiting for Client-B to run\")\n+\n+\t\tframework.Logf(\"Waiting for client-b to complete.\")\n+\t\terr = framework.WaitForPodSuccessInNamespace(f.Client, podClientB.Name, ns.Name)\n+\t\tExpect(err).To(HaveOccurred(), \"checking client-b could not communicate with server\")\n+\t})\n+\n+\tIt(\"should enforce policy based on PodSelector [Feature:NetworkPolicy]\", func() {\n+\t\tns := f.Namespace\n+\t\tsetNamespaceIsolation(f, ns, \"DefaultDeny\")\n+\n+\t\tBy(\"Creating a simple server.\")\n+\t\tpodServer, service := createServerPod(f, ns, serverName, []int{listeningPort1})\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the server.\")\n+\t\t\tif err := f.Client.Pods(ns.Name).Delete(podServer.Name, nil); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete pod %v: %v\", podServer.Name, err)\n+\t\t\t}\n+\t\t}()\n+\t\tdefer func() {\n+\t\t\tBy(\"Cleaning up the server's service.\")\n+\t\t\tif err := f.Client.Services(ns.Name).Delete(service.Name); err != nil {\n+\t\t\t\tframework.Failf(\"unable to delete svc %v: %v\", service.Name, err)\n+\t\t\t}\n+\t\t}()\n+\t\tframework.Logf(\"Waiting for Server to come up.\")\n+\t\terr := framework.WaitForPodRunningInNamespace(f.Client, podServer)\n+\t\tExpect(err).NotTo(HaveOccurred())\n+\n+\t\tBy(\"Creating a network policy for the server which allows traffic from the pod 'client-a'.\")\n+\t\tpolicy, err := f.Client.NetworkPolicies(ns.Name).Create(&extensions.NetworkPolicy{\n+\t\t\tObjectMeta: api.ObjectMeta{\n+\t\t\t\tName: \"test-policy\",","path":"test/e2e/network_policy.go","position":144,"original_position":144,"commit_id":"154b76d51c52842128f3229b2882c65ba4639424","original_commit_id":"154b76d51c52842128f3229b2882c65ba4639424","user":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"body":"A more descriptive name here would be nice - something like `Name: \"allow-client-a\"` maybe?","created_at":"2016-10-27T17:02:39Z","updated_at":"2016-10-27T17:50:46Z","html_url":"https://github.com/kubernetes/kubernetes/pull/35660#discussion_r85382284","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/85382284"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/35660#discussion_r85382284"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660","id":91113112,"html_url":"https://github.com/kubernetes/kubernetes/pull/35660","diff_url":"https://github.com/kubernetes/kubernetes/pull/35660.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/35660.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/35660","number":35660,"state":"open","locked":false,"title":"Add e2e network policy tests.","user":{"login":"djosborne","id":3444362,"avatar_url":"https://avatars.githubusercontent.com/u/3444362?v=3","gravatar_id":"","url":"https://api.github.com/users/djosborne","html_url":"https://github.com/djosborne","followers_url":"https://api.github.com/users/djosborne/followers","following_url":"https://api.github.com/users/djosborne/following{/other_user}","gists_url":"https://api.github.com/users/djosborne/gists{/gist_id}","starred_url":"https://api.github.com/users/djosborne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/djosborne/subscriptions","organizations_url":"https://api.github.com/users/djosborne/orgs","repos_url":"https://api.github.com/users/djosborne/repos","events_url":"https://api.github.com/users/djosborne/events{/privacy}","received_events_url":"https://api.github.com/users/djosborne/received_events","type":"User","site_admin":false},"body":"<!--  Thanks for sending a pull request!  Here are some tips for you:\r\n1. If this is your first time, read our contributor guidelines https://github.com/kubernetes/kubernetes/blob/master/CONTRIBUTING.md and developer guide https://github.com/kubernetes/kubernetes/blob/master/docs/devel/development.md\r\n2. If you want *faster* PR reviews, read how: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/faster_reviews.md\r\n3. Follow the instructions for writing a release note: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/pull-requests.md#release-notes\r\n-->\r\n\r\n**What this PR does / why we need it**:\r\nAdd set of e2e tests for Network Policy. This has succesfully run againast a deployment using Calico as the network policy provider.\r\n\r\nSpecifically, adds a new e2e test file (/test/e2e/network_policy.go) which tests TCP connectivity between pods with isolation.\r\n\r\nSee #25638 for PR that added NetworkPolicy resource.\r\n\r\nThis PR is a replacement for #27447 .\n\n<!-- Reviewable:start -->\n---\nThis change is [<img src=\"https://reviewable.kubernetes.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.kubernetes.io/reviews/kubernetes/kubernetes/35660)\n<!-- Reviewable:end -->\n","created_at":"2016-10-27T00:20:10Z","updated_at":"2016-10-27T17:50:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"277e32ab904eb35d4ca0198d2920304e4ff7b5f1","assignee":{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false},"assignees":[{"login":"caseydavenport","id":1944093,"avatar_url":"https://avatars.githubusercontent.com/u/1944093?v=3","gravatar_id":"","url":"https://api.github.com/users/caseydavenport","html_url":"https://github.com/caseydavenport","followers_url":"https://api.github.com/users/caseydavenport/followers","following_url":"https://api.github.com/users/caseydavenport/following{/other_user}","gists_url":"https://api.github.com/users/caseydavenport/gists{/gist_id}","starred_url":"https://api.github.com/users/caseydavenport/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caseydavenport/subscriptions","organizations_url":"https://api.github.com/users/caseydavenport/orgs","repos_url":"https://api.github.com/users/caseydavenport/repos","events_url":"https://api.github.com/users/caseydavenport/events{/privacy}","received_events_url":"https://api.github.com/users/caseydavenport/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/35660/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/154b76d51c52842128f3229b2882c65ba4639424","head":{"label":"djosborne:e2e-network-policy","ref":"e2e-network-policy","sha":"154b76d51c52842128f3229b2882c65ba4639424","user":{"login":"djosborne","id":3444362,"avatar_url":"https://avatars.githubusercontent.com/u/3444362?v=3","gravatar_id":"","url":"https://api.github.com/users/djosborne","html_url":"https://github.com/djosborne","followers_url":"https://api.github.com/users/djosborne/followers","following_url":"https://api.github.com/users/djosborne/following{/other_user}","gists_url":"https://api.github.com/users/djosborne/gists{/gist_id}","starred_url":"https://api.github.com/users/djosborne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/djosborne/subscriptions","organizations_url":"https://api.github.com/users/djosborne/orgs","repos_url":"https://api.github.com/users/djosborne/repos","events_url":"https://api.github.com/users/djosborne/events{/privacy}","received_events_url":"https://api.github.com/users/djosborne/received_events","type":"User","site_admin":false},"repo":{"id":71952043,"name":"kubernetes","full_name":"djosborne/kubernetes","owner":{"login":"djosborne","id":3444362,"avatar_url":"https://avatars.githubusercontent.com/u/3444362?v=3","gravatar_id":"","url":"https://api.github.com/users/djosborne","html_url":"https://github.com/djosborne","followers_url":"https://api.github.com/users/djosborne/followers","following_url":"https://api.github.com/users/djosborne/following{/other_user}","gists_url":"https://api.github.com/users/djosborne/gists{/gist_id}","starred_url":"https://api.github.com/users/djosborne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/djosborne/subscriptions","organizations_url":"https://api.github.com/users/djosborne/orgs","repos_url":"https://api.github.com/users/djosborne/repos","events_url":"https://api.github.com/users/djosborne/events{/privacy}","received_events_url":"https://api.github.com/users/djosborne/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/djosborne/kubernetes","description":"Production-Grade Container Scheduling and Management","fork":true,"url":"https://api.github.com/repos/djosborne/kubernetes","forks_url":"https://api.github.com/repos/djosborne/kubernetes/forks","keys_url":"https://api.github.com/repos/djosborne/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/djosborne/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/djosborne/kubernetes/teams","hooks_url":"https://api.github.com/repos/djosborne/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/djosborne/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/djosborne/kubernetes/events","assignees_url":"https://api.github.com/repos/djosborne/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/djosborne/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/djosborne/kubernetes/tags","blobs_url":"https://api.github.com/repos/djosborne/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/djosborne/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/djosborne/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/djosborne/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/djosborne/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/djosborne/kubernetes/languages","stargazers_url":"https://api.github.com/repos/djosborne/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/djosborne/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/djosborne/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/djosborne/kubernetes/subscription","commits_url":"https://api.github.com/repos/djosborne/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/djosborne/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/djosborne/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/djosborne/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/djosborne/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/djosborne/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/djosborne/kubernetes/merges","archive_url":"https://api.github.com/repos/djosborne/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/djosborne/kubernetes/downloads","issues_url":"https://api.github.com/repos/djosborne/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/djosborne/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/djosborne/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/djosborne/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/djosborne/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/djosborne/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/djosborne/kubernetes/deployments","created_at":"2016-10-26T00:58:19Z","updated_at":"2016-10-26T00:59:00Z","pushed_at":"2016-10-26T23:59:45Z","git_url":"git://github.com/djosborne/kubernetes.git","ssh_url":"git@github.com:djosborne/kubernetes.git","clone_url":"https://github.com/djosborne/kubernetes.git","svn_url":"https://github.com/djosborne/kubernetes","homepage":"http://kubernetes.io","size":342847,"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":"f300d7ed694f244baea39ea658f701635f7d5aee","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":"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":"2016-10-27T16:03:24Z","pushed_at":"2016-10-27T17:48:35Z","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":606632,"stargazers_count":17970,"watchers_count":17970,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":5850,"mirror_url":null,"open_issues_count":5145,"forks":5850,"open_issues":5145,"watchers":17970,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/35660"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/35660"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/35660/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35660/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/154b76d51c52842128f3229b2882c65ba4639424"}}}}
{"actor":{"display_login":"caseydavenport"}}