{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/120125962","pull_request_review_id":42062349,"id":120125962,"diff_hunk":"@@ -0,0 +1,459 @@\n+// +build linux\n+\n+/*\n+Copyright 2014 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 ipvs\n+\n+import (\n+\t\"encoding/binary\"\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"net\"\n+\t\"strconv\"\n+\t\"strings\"\n+\n+\t\"github.com/docker/libnetwork/ipvs\"\n+\tgodbus \"github.com/godbus/dbus\"\n+\t\"github.com/golang/glog\"\n+\tutildbus \"k8s.io/kubernetes/pkg/util/dbus\"\n+\n+\t\"syscall\"\n+)\n+\n+// Destroy is part of Interface.\n+func (runner *runner) Destroy() {\n+\tif runner.signal != nil {\n+\t\trunner.signal <- nil\n+\t}\n+}\n+\n+// Connects to D-Bus and listens for FirewallD start/restart. (On non-FirewallD-using\n+// systems, this is effectively a no-op; we listen for the signals, but they will never be\n+// emitted, so reload() will never be called.)\n+func (runner *runner) connectToFirewallD() {\n+\tbus, err := runner.dbus.SystemBus()\n+\tif err != nil {\n+\t\tglog.V(1).Infof(\"Could not connect to D-Bus system bus: %s\", err)\n+\t\treturn\n+\t}\n+\n+\trule := fmt.Sprintf(\"type='signal',sender='%s',path='%s',interface='%s',member='Reloaded'\", firewalldName, firewalldPath, firewalldInterface)\n+\tbus.BusObject().Call(\"org.freedesktop.DBus.AddMatch\", 0, rule)\n+\n+\trule = fmt.Sprintf(\"type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',sender='org.freedesktop.DBus',arg0='%s'\", firewalldName)\n+\tbus.BusObject().Call(\"org.freedesktop.DBus.AddMatch\", 0, rule)\n+\n+\trunner.signal = make(chan *godbus.Signal, 10)\n+\tbus.Signal(runner.signal)\n+\n+\tgo runner.dbusSignalHandler(bus)\n+}\n+\n+var ipvs_handle *ipvs.Handle\n+\n+type IPProto uint16\n+\n+//// goroutine to listen for D-Bus signals\n+func (runner *runner) dbusSignalHandler(bus utildbus.Connection) {\n+\tfirewalld := bus.Object(firewalldName, firewalldPath)\n+\n+\tfor s := range runner.signal {\n+\t\tif s == nil {\n+\t\t\t// Unregister\n+\t\t\tbus.Signal(runner.signal)\n+\t\t\treturn\n+\t\t}\n+\n+\t\tswitch s.Name {\n+\t\tcase \"org.freedesktop.DBus.NameOwnerChanged\":\n+\t\t\tname := s.Body[0].(string)\n+\t\t\tnew_owner := s.Body[2].(string)\n+\n+\t\t\tif name != firewalldName || len(new_owner) == 0 {\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\t// FirewallD startup (specifically the part where it deletes\n+\t\t\t// all existing iptables rules) may not yet be complete when\n+\t\t\t// we get this signal, so make a dummy request to it to\n+\t\t\t// synchronize.\n+\t\t\tfirewalld.Call(firewalldInterface+\".getDefaultZone\", 0)\n+\n+\t\t\trunner.reload()\n+\t\tcase firewalldInterface + \".Reloaded\":\n+\t\t\trunner.reload()\n+\t\t}\n+\t}\n+}\n+\n+// AddReloadFunc is part of Interface\n+func (runner *runner) AddReloadFunc(reloadFunc func()) {\n+\trunner.reloadFuncs = append(runner.reloadFuncs, reloadFunc)\n+}\n+\n+//// runs all reload funcs to re-sync iptables rules\n+func (runner *runner) reload() {\n+\tglog.V(1).Infof(\"reloading iptables rules\")\n+\n+\tfor _, f := range runner.reloadFuncs {\n+\t\tf()\n+\t}\n+}\n+\n+func (runner *runner) InitIpvsInterface() error {\n+\tglog.V(6).Infof(\"Preparation for ipvs\")\n+\n+\t//Connect to DBUS first\n+\trunner.connectToFirewallD()\n+\n+\tvar err error\n+\tif ipvs_handle, err = ipvs.New(\"\"); err != nil {\n+\t\tglog.Errorf(\"InitIpvsInterface: Ipvs cannot be Inited. Error: %v\", err)\n+\t\treturn err\n+\t}\n+\n+\treturn nil\n+}\n+\n+func (runner *runner) setSystemFlagInt(sysControl string, value int) error {\n+\tif val, err := runner.sysctl.GetSysctl(sysControl); err == nil && val != value {\n+\t\trunner.sysctl.SetSysctl(sysControl, value)\n+\t} else if err != nil {\n+\t\tglog.Errorf(\"Error: System control flag [%s] cannot be set\", sysControl)\n+\t\treturn err\n+\t}\n+\treturn nil\n+}\n+\n+func (runner *runner) CheckAliasDevice(aliasDev string) error {\n+\t_, err := net.InterfaceByName(aliasDev)\n+\tif err == nil {\n+\t\treturn nil\n+\t}\n+\terr = runner.CreateAliasDevice(aliasDev)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\treturn nil\n+}\n+\n+func getAllAlias(aliasDev string) ([]net.IP, error) {\n+\ti, err := net.InterfaceByName(aliasDev)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\taddrs, err := i.Addrs()\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\tips := make([]net.IP, 0)\n+\tfor _, addr := range addrs {\n+\t\tip, _, err := net.ParseCIDR(addr.String())\n+\t\tif err != nil {\n+\t\t\treturn nil, err\n+\t\t}\n+\t\tips = append(ips, ip)\n+\t}\n+\treturn ips, nil\n+\n+}\n+\n+func (runner *runner) CreateAliasDevice(aliasDev string) error {\n+\n+\tif aliasDev == AliasDevice {\n+\t\t// Generate device alias\n+\t\targs := []string{\"link\", \"add\", aliasDev, \"type\", \"dummy\"}\n+\t\tif _, err := runner.exec.Command(cmd, args...).CombinedOutput(); err != nil {\n+\t\t\t// \"exit status 2\" is returned from the above run command if the device already exists\n+\t\t\tif !strings.Contains(fmt.Sprintf(\"%v\", err), \"exit status 2\") {","path":"pkg/util/ipvs/ipvs_linux.go","position":172,"original_position":182,"commit_id":"680f4d4c65f87bca9bcb17cf8b83888d9a51af84","original_commit_id":"d12dedf29296c73464f8c863d9339cd84414affe","user":{"login":"m1093782566","id":4953962,"avatar_url":"https://avatars2.githubusercontent.com/u/4953962?v=3","gravatar_id":"","url":"https://api.github.com/users/m1093782566","html_url":"https://github.com/m1093782566","followers_url":"https://api.github.com/users/m1093782566/followers","following_url":"https://api.github.com/users/m1093782566/following{/other_user}","gists_url":"https://api.github.com/users/m1093782566/gists{/gist_id}","starred_url":"https://api.github.com/users/m1093782566/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/m1093782566/subscriptions","organizations_url":"https://api.github.com/users/m1093782566/orgs","repos_url":"https://api.github.com/users/m1093782566/repos","events_url":"https://api.github.com/users/m1093782566/events{/privacy}","received_events_url":"https://api.github.com/users/m1093782566/received_events","type":"User","site_admin":false},"body":"We will try to find a way to capture the return code of shell command.","created_at":"2017-06-05T14:52:26Z","updated_at":"2017-06-05T14:55:35Z","html_url":"https://github.com/kubernetes/kubernetes/pull/46580#discussion_r120125962","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/120125962"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/46580#discussion_r120125962"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580","id":122792517,"html_url":"https://github.com/kubernetes/kubernetes/pull/46580","diff_url":"https://github.com/kubernetes/kubernetes/pull/46580.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/46580.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/46580","number":46580,"state":"open","locked":false,"title":"Implement IPVS-based in-cluster service load balancing","user":{"login":"dujun1990","id":28770520,"avatar_url":"https://avatars1.githubusercontent.com/u/28770520?v=3","gravatar_id":"","url":"https://api.github.com/users/dujun1990","html_url":"https://github.com/dujun1990","followers_url":"https://api.github.com/users/dujun1990/followers","following_url":"https://api.github.com/users/dujun1990/following{/other_user}","gists_url":"https://api.github.com/users/dujun1990/gists{/gist_id}","starred_url":"https://api.github.com/users/dujun1990/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dujun1990/subscriptions","organizations_url":"https://api.github.com/users/dujun1990/orgs","repos_url":"https://api.github.com/users/dujun1990/repos","events_url":"https://api.github.com/users/dujun1990/events{/privacy}","received_events_url":"https://api.github.com/users/dujun1990/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/community/blob/master/contributors/devel/pull-requests.md#the-pr-submit-process and developer guide https://github.com/kubernetes/community/blob/master/contributors/devel/development.md#development-guide\r\n2. If you want *faster* PR reviews, read how: https://github.com/kubernetes/community/blob/master/contributors/devel/pull-requests.md#best-practices-for-faster-reviews\r\n3. Follow the instructions for writing a release note: https://github.com/kubernetes/community/blob/master/contributors/devel/pull-requests.md#write-release-notes-if-needed\r\n-->\r\n\r\n**What this PR does / why we need it**:\r\n\r\nImplement IPVS-based in-cluster service load balancing. It can provide some performance enhancement and some other benefitsto kube proxy while comparing iptables and userspace mode. Besides, it also support more sophisticated load balancing algorithms than iptables (least conns, weighted, hash and so on).\r\n\r\n**Which issue this PR fixes**\r\n\r\n#17470 #44063\r\n\r\n**Special notes for your reviewer**:\r\n\r\n* Because of lvs-nat will do masquerading for all traffic, this implementation needs enable `--masquerade` flag of kube-proxy for cross-host communication and will break network policy.\r\n\r\n* Since ipvs proxy share some util functions with iptables proxy, I moved some util functions to `/pkg/proxy/util` and have not let iptables proxy use them yet.\r\n\r\n@thockin @quinton-hoole @kevin-wangzefeng @deepak-vij @haibinxie @dhilipkumars @fisherxu \r\n","created_at":"2017-05-28T11:35:46Z","updated_at":"2017-06-05T14:55:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"249aeb30b7da77a3aa83d4d51fdb90d5a675e360","assignee":{"login":"jbeda","id":37310,"avatar_url":"https://avatars1.githubusercontent.com/u/37310?v=3","gravatar_id":"","url":"https://api.github.com/users/jbeda","html_url":"https://github.com/jbeda","followers_url":"https://api.github.com/users/jbeda/followers","following_url":"https://api.github.com/users/jbeda/following{/other_user}","gists_url":"https://api.github.com/users/jbeda/gists{/gist_id}","starred_url":"https://api.github.com/users/jbeda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jbeda/subscriptions","organizations_url":"https://api.github.com/users/jbeda/orgs","repos_url":"https://api.github.com/users/jbeda/repos","events_url":"https://api.github.com/users/jbeda/events{/privacy}","received_events_url":"https://api.github.com/users/jbeda/received_events","type":"User","site_admin":false},"assignees":[{"login":"jbeda","id":37310,"avatar_url":"https://avatars1.githubusercontent.com/u/37310?v=3","gravatar_id":"","url":"https://api.github.com/users/jbeda","html_url":"https://github.com/jbeda","followers_url":"https://api.github.com/users/jbeda/followers","following_url":"https://api.github.com/users/jbeda/following{/other_user}","gists_url":"https://api.github.com/users/jbeda/gists{/gist_id}","starred_url":"https://api.github.com/users/jbeda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jbeda/subscriptions","organizations_url":"https://api.github.com/users/jbeda/orgs","repos_url":"https://api.github.com/users/jbeda/repos","events_url":"https://api.github.com/users/jbeda/events{/privacy}","received_events_url":"https://api.github.com/users/jbeda/received_events","type":"User","site_admin":false},{"login":"wojtek-t","id":10743879,"avatar_url":"https://avatars0.githubusercontent.com/u/10743879?v=3","gravatar_id":"","url":"https://api.github.com/users/wojtek-t","html_url":"https://github.com/wojtek-t","followers_url":"https://api.github.com/users/wojtek-t/followers","following_url":"https://api.github.com/users/wojtek-t/following{/other_user}","gists_url":"https://api.github.com/users/wojtek-t/gists{/gist_id}","starred_url":"https://api.github.com/users/wojtek-t/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wojtek-t/subscriptions","organizations_url":"https://api.github.com/users/wojtek-t/orgs","repos_url":"https://api.github.com/users/wojtek-t/repos","events_url":"https://api.github.com/users/wojtek-t/events{/privacy}","received_events_url":"https://api.github.com/users/wojtek-t/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/46580/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/680f4d4c65f87bca9bcb17cf8b83888d9a51af84","head":{"label":"Huawei-PaaS:kube-proxy-ipvs-pr","ref":"kube-proxy-ipvs-pr","sha":"680f4d4c65f87bca9bcb17cf8b83888d9a51af84","user":{"login":"Huawei-PaaS","id":6876878,"avatar_url":"https://avatars3.githubusercontent.com/u/6876878?v=3","gravatar_id":"","url":"https://api.github.com/users/Huawei-PaaS","html_url":"https://github.com/Huawei-PaaS","followers_url":"https://api.github.com/users/Huawei-PaaS/followers","following_url":"https://api.github.com/users/Huawei-PaaS/following{/other_user}","gists_url":"https://api.github.com/users/Huawei-PaaS/gists{/gist_id}","starred_url":"https://api.github.com/users/Huawei-PaaS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Huawei-PaaS/subscriptions","organizations_url":"https://api.github.com/users/Huawei-PaaS/orgs","repos_url":"https://api.github.com/users/Huawei-PaaS/repos","events_url":"https://api.github.com/users/Huawei-PaaS/events{/privacy}","received_events_url":"https://api.github.com/users/Huawei-PaaS/received_events","type":"Organization","site_admin":false},"repo":{"id":40632995,"name":"kubernetes","full_name":"Huawei-PaaS/kubernetes","owner":{"login":"Huawei-PaaS","id":6876878,"avatar_url":"https://avatars3.githubusercontent.com/u/6876878?v=3","gravatar_id":"","url":"https://api.github.com/users/Huawei-PaaS","html_url":"https://github.com/Huawei-PaaS","followers_url":"https://api.github.com/users/Huawei-PaaS/followers","following_url":"https://api.github.com/users/Huawei-PaaS/following{/other_user}","gists_url":"https://api.github.com/users/Huawei-PaaS/gists{/gist_id}","starred_url":"https://api.github.com/users/Huawei-PaaS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Huawei-PaaS/subscriptions","organizations_url":"https://api.github.com/users/Huawei-PaaS/orgs","repos_url":"https://api.github.com/users/Huawei-PaaS/repos","events_url":"https://api.github.com/users/Huawei-PaaS/events{/privacy}","received_events_url":"https://api.github.com/users/Huawei-PaaS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Huawei-PaaS/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/Huawei-PaaS/kubernetes","forks_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/forks","keys_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/teams","hooks_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/events","assignees_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/tags","blobs_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/languages","stargazers_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/subscription","commits_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/merges","archive_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/downloads","issues_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/Huawei-PaaS/kubernetes/deployments","created_at":"2015-08-13T01:37:46Z","updated_at":"2017-05-16T21:38:17Z","pushed_at":"2017-06-03T10:59:11Z","git_url":"git://github.com/Huawei-PaaS/kubernetes.git","ssh_url":"git@github.com:Huawei-PaaS/kubernetes.git","clone_url":"https://github.com/Huawei-PaaS/kubernetes.git","svn_url":"https://github.com/Huawei-PaaS/kubernetes","homepage":"http://kubernetes.io","size":425998,"stargazers_count":4,"watchers_count":4,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":1,"forks":4,"open_issues":1,"watchers":4,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"f0962765a7374172625847c84630d3b522ea728f","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-06-05T14:48:16Z","pushed_at":"2017-06-05T14:37:38Z","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":656377,"stargazers_count":23723,"watchers_count":23723,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8397,"mirror_url":null,"open_issues_count":5181,"forks":8397,"open_issues":5181,"watchers":23723,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/46580"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/46580"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/46580/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46580/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/680f4d4c65f87bca9bcb17cf8b83888d9a51af84"}}}}
{"actor":{"display_login":"m1093782566"}}