{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/229573476","pull_request_review_id":170103970,"id":229573476,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyOTU3MzQ3Ng==","diff_hunk":"@@ -0,0 +1,240 @@\n+/*\n+Copyright 2018 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 priorities\n+\n+import (\n+\t\"fmt\"\n+\t\"math\"\n+\t\"strings\"\n+\n+\t\"github.com/golang/glog\"\n+\t\"k8s.io/api/core/v1\"\n+\tv1helper \"k8s.io/kubernetes/pkg/apis/core/v1/helper\"\n+\t\"k8s.io/kubernetes/pkg/scheduler/algorithm\"\n+\tpriorityutil \"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util\"\n+\tschedulerapi \"k8s.io/kubernetes/pkg/scheduler/api\"\n+\tschedulercache \"k8s.io/kubernetes/pkg/scheduler/cache\"\n+)\n+\n+// ResourceBinPacking contains information to calculate bin packing priority.\n+type ResourceBinPacking struct {\n+\tResources []Resources\n+}\n+\n+//Resources contains resource name and weight\n+type Resources struct {\n+\tResource v1.ResourceName\n+\tWeight   int\n+}\n+\n+// NewResourceBinPacking creates a ResourceBinPackingPriorityMap.\n+func NewResourceBinPacking(resources []Resources) (algorithm.PriorityMapFunction, algorithm.PriorityReduceFunction) {\n+\tfor i, elm := range resources {\n+\t\tif elm.Weight == 0 {\n+\t\t\tresources[i].Weight = 1\n+\t\t}\n+\t}\n+\tresourceBinPackingPrioritizer := &ResourceBinPacking{\n+\t\tResources: resources,\n+\t}\n+\treturn resourceBinPackingPrioritizer.ResourceBinPackingPriorityMap, nil\n+}\n+\n+// ResourceBinPackingPriorityDefault creates a resourceBinPacking based prioity\n+func ResourceBinPackingPriorityDefault() *ResourceBinPacking {\n+\tdefaultResourceBinPackingPrioritizer := &ResourceBinPacking{\n+\t\tResources: []Resources{},\n+\t}\n+\treturn defaultResourceBinPackingPrioritizer\n+}\n+\n+// ResourceBinPackingPriorityMap is a priority function that favors nodes that have higher utlization of scare resource.\n+// It will detect whether the requested scarce resource is present on a node, and then calculate a score ranging from 0 to 10\n+// based total utlization (best fit)\n+// - If none of the scare resource are requested, this node will be given the lowest priority.\n+// - If the scarce resource is requested, the larger the resource utlization ratio, the higher the node's priority.\n+func (r *ResourceBinPacking) ResourceBinPackingPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) {\n+\tvar score int\n+\tnode := nodeInfo.Node()\n+\tif len(r.Resources) == 0 {\n+\t\treturn schedulerapi.HostPriority{}, fmt.Errorf(\"resource not defined\")\n+\t}\n+\tif node == nil {\n+\t\treturn schedulerapi.HostPriority{}, fmt.Errorf(\"node not found\")\n+\t}\n+\tnodeScore := float64(0)\n+\tweightSum := 0\n+\n+\tfor _, elm := range r.Resources {\n+\t\tnodeScore += calculateScareResourceScore(nodeInfo, pod, elm.Resource) * float64(elm.Weight)\n+\t\tweightSum += elm.Weight\n+\t}\n+\tnodeScore = nodeScore / float64(weightSum)\n+\tif glog.V(10) {\n+\t\tglog.Infof(\n+\t\t\t\"%v -> %v: ResourceBinPackingPriority, Score: (%d)\", pod.Name, node.Name, score,\n+\t\t)\n+\t}\n+\n+\treturn schedulerapi.HostPriority{\n+\t\tHost:  node.Name,\n+\t\tScore: int(math.Round(nodeScore)),\n+\t}, nil\n+\n+}\n+\n+// calculateScareResourceScore returns total utlization of the scare resource on the node\n+func calculateScareResourceScore(nodeInfo *schedulercache.NodeInfo, pod *v1.Pod, resource v1.ResourceName) float64 {\n+\tallocatable := nodeInfo.AllocatableResource()\n+\tused := nodeInfo.RequestedResource()\n+\tvar requested schedulercache.Resource\n+\tvar requestedInit schedulercache.Resource\n+\tswitch resource {\n+\tcase v1.ResourceCPU:\n+\t\t{\n+\t\t\tfor i := range pod.Spec.Containers {\n+\t\t\t\tcontainer := &pod.Spec.Containers[i]\n+\t\t\t\tcpu, _ := priorityutil.GetNonzeroRequests(&container.Resources.Requests)\n+\t\t\t\trequested.MilliCPU += cpu\n+\t\t\t}\n+\t\t\tfor i := range pod.Spec.InitContainers {\n+\t\t\t\tcontainer := &pod.Spec.InitContainers[i]\n+\t\t\t\tcpu, _ := priorityutil.GetNonzeroRequests(&container.Resources.Requests)\n+\t\t\t\tif requestedInit.MilliCPU < cpu {\n+\t\t\t\t\trequestedInit.MilliCPU = cpu\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif requestedInit.MilliCPU > requested.MilliCPU {\n+\t\t\t\trequested.MilliCPU = requestedInit.MilliCPU\n+\t\t\t}\n+\n+\t\t\t//println(\"CPU used: %d, requested: %d, available: %d\",\n+\t\t\t//\tnodeInfo.NonZeroRequest().MilliCPU, requested.MilliCPU, allocatable.MilliCPU)\n+\t\t\treturn float64((nodeInfo.NonZeroRequest().MilliCPU+requested.MilliCPU)*schedulerapi.MaxPriority) / float64(allocatable.MilliCPU)\n+\n+\t\t}\n+\n+\tcase v1.ResourceMemory:\n+\t\t{\n+\t\t\tfor i := range pod.Spec.Containers {\n+\t\t\t\tcontainer := &pod.Spec.Containers[i]\n+\t\t\t\t_, memory := priorityutil.GetNonzeroRequests(&container.Resources.Requests)\n+\t\t\t\trequested.Memory += memory\n+\t\t\t}\n+\t\t\tfor i := range pod.Spec.InitContainers {\n+\t\t\t\tcontainer := &pod.Spec.InitContainers[i]\n+\t\t\t\t_, memory := priorityutil.GetNonzeroRequests(&container.Resources.Requests)\n+\t\t\t\tif requestedInit.Memory < memory {\n+\t\t\t\t\trequestedInit.Memory = memory\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif requestedInit.Memory > requested.Memory {\n+\t\t\t\trequested.Memory = requestedInit.Memory\n+\t\t\t}\n+\t\t\t//println(\"Memory used: %d, requested: %d, available: %d\",\n+\t\t\t//\tnodeInfo.NonZeroRequest().Memory, requested.Memory, allocatable.Memory)\n+\t\t\treturn float64((nodeInfo.NonZeroRequest().Memory+requested.Memory)*schedulerapi.MaxPriority) / float64(allocatable.Memory)\n+\t\t}\n+\n+\tcase v1.ResourceEphemeralStorage:\n+\t\t{\n+\t\t\tfor i := range pod.Spec.Containers {\n+\t\t\t\tcontainer := &pod.Spec.Containers[i]\n+\t\t\t\tif quantity, ok := container.Resources.Requests[v1.ResourceEphemeralStorage]; ok {\n+\t\t\t\t\trequested.EphemeralStorage += quantity.Value()\n+\t\t\t\t}\n+\n+\t\t\t}\n+\t\t\tfor i := range pod.Spec.InitContainers {\n+\t\t\t\tcontainer := &pod.Spec.InitContainers[i]\n+\t\t\t\tif quantity, ok := container.Resources.Requests[v1.ResourceEphemeralStorage]; ok {\n+\t\t\t\t\tif requestedInit.EphemeralStorage < quantity.Value() {\n+\t\t\t\t\t\trequestedInit.EphemeralStorage = quantity.Value()\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif requestedInit.EphemeralStorage > requested.EphemeralStorage {\n+\t\t\t\trequested.EphemeralStorage = requestedInit.EphemeralStorage\n+\t\t\t}\n+\t\t\treturn float64((used.EphemeralStorage+requested.EphemeralStorage)*schedulerapi.MaxPriority) / float64(allocatable.EphemeralStorage)\n+\n+\t\t}\n+\tdefault:\n+\t\tif v1helper.IsScalarResourceName(resource) {\n+\t\t\tif podRequestsResource(*pod, resource) {\n+\t\t\t\tfor i := range pod.Spec.Containers {\n+\t\t\t\t\tcontainer := &pod.Spec.Containers[i]\n+\t\t\t\t\tif quantity, ok := container.Resources.Requests[resource]; ok {\n+\t\t\t\t\t\trequested.AddScalar(resource, quantity.Value())\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t\tfor i := range pod.Spec.InitContainers {\n+\t\t\t\t\tcontainer := &pod.Spec.InitContainers[i]\n+\t\t\t\t\tif quantity, ok := container.Resources.Requests[resource]; ok {\n+\t\t\t\t\t\tif requestedInit.ScalarResources[resource] < quantity.Value() {\n+\t\t\t\t\t\t\trequested.SetScalar(resource, quantity.Value())\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\n+\t\t\t\t}\n+\t\t\t\tif requestedInit.ScalarResources[resource] > requested.ScalarResources[resource] {\n+\t\t\t\t\trequested.ScalarResources[resource] = requestedInit.ScalarResources[resource]\n+\t\t\t\t}\n+\n+\t\t\t\treturn float64((used.ScalarResources[resource]+requested.ScalarResources[resource])*schedulerapi.MaxPriority) / float64(allocatable.ScalarResources[resource])\n+\n+\t\t\t}\n+\t\t}\n+\n+\t}\n+\treturn 0\n+}\n+\n+// podRequestsResource checks if a given pod requests the scare resource. if false the priority is set to 0\n+func podRequestsResource(pod v1.Pod, resource v1.ResourceName) bool {\n+\tif strings.Contains(string(resource), \"cpu\") {\n+\t\treturn true\n+\t}\n+\tif strings.Contains(string(resource), \"memory\") {\n+\t\treturn true\n+\t}\n+\tcontainerRequestsResource := func(container v1.Container) bool {\n+\t\tfor resName, quantity := range container.Resources.Requests {\n+\t\t\tif resName == resource && quantity.MilliValue() > 0 {\n+\t\t\t\treturn true\n+\t\t\t}\n+\t\t}\n+\t\tfor resName, quantity := range container.Resources.Limits {","path":"pkg/scheduler/algorithm/priorities/resource_bin_packing.go","position":221,"original_position":221,"commit_id":"2254fd8aed0f5afdb3124015a99e4b447f818cd6","original_commit_id":"2254fd8aed0f5afdb3124015a99e4b447f818cd6","user":{"login":"k82cn","id":18107181,"node_id":"MDQ6VXNlcjE4MTA3MTgx","avatar_url":"https://avatars0.githubusercontent.com/u/18107181?v=4","gravatar_id":"","url":"https://api.github.com/users/k82cn","html_url":"https://github.com/k82cn","followers_url":"https://api.github.com/users/k82cn/followers","following_url":"https://api.github.com/users/k82cn/following{/other_user}","gists_url":"https://api.github.com/users/k82cn/gists{/gist_id}","starred_url":"https://api.github.com/users/k82cn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/k82cn/subscriptions","organizations_url":"https://api.github.com/users/k82cn/orgs","repos_url":"https://api.github.com/users/k82cn/repos","events_url":"https://api.github.com/users/k82cn/events{/privacy}","received_events_url":"https://api.github.com/users/k82cn/received_events","type":"User","site_admin":false},"body":"do we need to consider limits?","created_at":"2018-10-31T06:11:40Z","updated_at":"2018-10-31T06:11:40Z","html_url":"https://github.com/kubernetes/kubernetes/pull/68429#discussion_r229573476","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/229573476"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/68429#discussion_r229573476"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429","id":214054080,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE0MDU0MDgw","html_url":"https://github.com/kubernetes/kubernetes/pull/68429","diff_url":"https://github.com/kubernetes/kubernetes/pull/68429.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/68429.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/68429","number":68429,"state":"open","locked":false,"title":"Resource bin packing ","user":{"login":"sudeshsh","id":29582829,"node_id":"MDQ6VXNlcjI5NTgyODI5","avatar_url":"https://avatars2.githubusercontent.com/u/29582829?v=4","gravatar_id":"","url":"https://api.github.com/users/sudeshsh","html_url":"https://github.com/sudeshsh","followers_url":"https://api.github.com/users/sudeshsh/followers","following_url":"https://api.github.com/users/sudeshsh/following{/other_user}","gists_url":"https://api.github.com/users/sudeshsh/gists{/gist_id}","starred_url":"https://api.github.com/users/sudeshsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sudeshsh/subscriptions","organizations_url":"https://api.github.com/users/sudeshsh/orgs","repos_url":"https://api.github.com/users/sudeshsh/repos","events_url":"https://api.github.com/users/sudeshsh/events{/privacy}","received_events_url":"https://api.github.com/users/sudeshsh/received_events","type":"User","site_admin":false},"body":"**What this PR does / why we need it**:\r\nThis PR allows users to bin pack scarce resources using the newly implemented ResourceBinPacking Priority Function.\r\n\r\n\r\n**Which issue(s) this PR fixes** :\r\nFixes #68036\r\n\r\n**Special notes for your reviewer**:\r\nFor testing \r\n```yaml\r\n...\r\n\"priorities\" : [\r\n    {\"name\" : \"LeastRequestedPriority\", \"weight\" : 1},\r\n    ...\r\n   {\r\n      \"resourceBinPacking\": { \r\n      \"resources\" : [{ \"resource\" : \"intel.com/foo\", \"weight\": 5 }, { \"resource\" : \"intel.com/bar\", \r\n                                \"weight\": 2 }]\r\n      }\r\n    }\r\n        ],\r\n```\r\nPatch Nodes \r\n```\r\ncurl --header \"Content-Type: application/json-patch+json\" \\\r\n--request PATCH \\\r\n--data '[{\"op\": \"add\", \"path\": \"/status/capacity/intel.com~1foo”, \"value\": \"4\"}]' \\\r\nhttp://localhost:8001/api/v1/nodes/<node-name>/status\r\n```\r\n**Release note**:\r\n<!--  Write your release note:\r\n1. Enter your extended release note in the below block. If the PR requires additional action from users switching to the new release, include the string \"action required\".\r\n2. If no release note is required, just write \"NONE\".\r\n-->\r\n```release-note\r\nAdd ResourceBinPakcing priority function. The function is parametrized to pass the resource name which needs to be bin packed.\r\nNode score is calculated using (requested + used)/ available  \r\nThe function is disabled by default and can be enabled via the scheduler policy config file.\r\n```\r\n","created_at":"2018-09-07T22:30:43Z","updated_at":"2018-10-31T06:11:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"30c1ad1e67a7f42901b3e733e782d03b5b6dde6a","assignee":{"login":"k82cn","id":18107181,"node_id":"MDQ6VXNlcjE4MTA3MTgx","avatar_url":"https://avatars0.githubusercontent.com/u/18107181?v=4","gravatar_id":"","url":"https://api.github.com/users/k82cn","html_url":"https://github.com/k82cn","followers_url":"https://api.github.com/users/k82cn/followers","following_url":"https://api.github.com/users/k82cn/following{/other_user}","gists_url":"https://api.github.com/users/k82cn/gists{/gist_id}","starred_url":"https://api.github.com/users/k82cn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/k82cn/subscriptions","organizations_url":"https://api.github.com/users/k82cn/orgs","repos_url":"https://api.github.com/users/k82cn/repos","events_url":"https://api.github.com/users/k82cn/events{/privacy}","received_events_url":"https://api.github.com/users/k82cn/received_events","type":"User","site_admin":false},"assignees":[{"login":"k82cn","id":18107181,"node_id":"MDQ6VXNlcjE4MTA3MTgx","avatar_url":"https://avatars0.githubusercontent.com/u/18107181?v=4","gravatar_id":"","url":"https://api.github.com/users/k82cn","html_url":"https://github.com/k82cn","followers_url":"https://api.github.com/users/k82cn/followers","following_url":"https://api.github.com/users/k82cn/following{/other_user}","gists_url":"https://api.github.com/users/k82cn/gists{/gist_id}","starred_url":"https://api.github.com/users/k82cn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/k82cn/subscriptions","organizations_url":"https://api.github.com/users/k82cn/orgs","repos_url":"https://api.github.com/users/k82cn/repos","events_url":"https://api.github.com/users/k82cn/events{/privacy}","received_events_url":"https://api.github.com/users/k82cn/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"balajismaniam","id":4707353,"node_id":"MDQ6VXNlcjQ3MDczNTM=","avatar_url":"https://avatars3.githubusercontent.com/u/4707353?v=4","gravatar_id":"","url":"https://api.github.com/users/balajismaniam","html_url":"https://github.com/balajismaniam","followers_url":"https://api.github.com/users/balajismaniam/followers","following_url":"https://api.github.com/users/balajismaniam/following{/other_user}","gists_url":"https://api.github.com/users/balajismaniam/gists{/gist_id}","starred_url":"https://api.github.com/users/balajismaniam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/balajismaniam/subscriptions","organizations_url":"https://api.github.com/users/balajismaniam/orgs","repos_url":"https://api.github.com/users/balajismaniam/repos","events_url":"https://api.github.com/users/balajismaniam/events{/privacy}","received_events_url":"https://api.github.com/users/balajismaniam/received_events","type":"User","site_admin":false},{"login":"davidopp","id":8264113,"node_id":"MDQ6VXNlcjgyNjQxMTM=","avatar_url":"https://avatars2.githubusercontent.com/u/8264113?v=4","gravatar_id":"","url":"https://api.github.com/users/davidopp","html_url":"https://github.com/davidopp","followers_url":"https://api.github.com/users/davidopp/followers","following_url":"https://api.github.com/users/davidopp/following{/other_user}","gists_url":"https://api.github.com/users/davidopp/gists{/gist_id}","starred_url":"https://api.github.com/users/davidopp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidopp/subscriptions","organizations_url":"https://api.github.com/users/davidopp/orgs","repos_url":"https://api.github.com/users/davidopp/repos","events_url":"https://api.github.com/users/davidopp/events{/privacy}","received_events_url":"https://api.github.com/users/davidopp/received_events","type":"User","site_admin":false},{"login":"bsalamat","id":14308438,"node_id":"MDQ6VXNlcjE0MzA4NDM4","avatar_url":"https://avatars3.githubusercontent.com/u/14308438?v=4","gravatar_id":"","url":"https://api.github.com/users/bsalamat","html_url":"https://github.com/bsalamat","followers_url":"https://api.github.com/users/bsalamat/followers","following_url":"https://api.github.com/users/bsalamat/following{/other_user}","gists_url":"https://api.github.com/users/bsalamat/gists{/gist_id}","starred_url":"https://api.github.com/users/bsalamat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bsalamat/subscriptions","organizations_url":"https://api.github.com/users/bsalamat/orgs","repos_url":"https://api.github.com/users/bsalamat/repos","events_url":"https://api.github.com/users/bsalamat/events{/privacy}","received_events_url":"https://api.github.com/users/bsalamat/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":477397086,"node_id":"MDU6TGFiZWw0NzczOTcwODY=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/cncf-cla:%20yes","name":"cncf-cla: yes","color":"bfe5bf","default":false},{"id":267761362,"node_id":"MDU6TGFiZWwyNjc3NjEzNjI=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/kind/feature","name":"kind/feature","color":"c7def8","default":false},{"id":200149833,"node_id":"MDU6TGFiZWwyMDAxNDk4MzM=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/release-note","name":"release-note","color":"c2e0c6","default":false},{"id":238245616,"node_id":"MDU6TGFiZWwyMzgyNDU2MTY=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/autoscaling","name":"sig/autoscaling","color":"d2b48c","default":false},{"id":173494222,"node_id":"MDU6TGFiZWwxNzM0OTQyMjI=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/cluster-lifecycle","name":"sig/cluster-lifecycle","color":"d2b48c","default":false},{"id":125550211,"node_id":"MDU6TGFiZWwxMjU1NTAyMTE=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/scheduling","name":"sig/scheduling","color":"d2b48c","default":false},{"id":253451057,"node_id":"MDU6TGFiZWwyNTM0NTEwNTc=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/size/XL","name":"size/XL","color":"ee5500","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/68429/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/2254fd8aed0f5afdb3124015a99e4b447f818cd6","head":{"label":"sudeshsh:scarce_resource_bin_packing","ref":"scarce_resource_bin_packing","sha":"2254fd8aed0f5afdb3124015a99e4b447f818cd6","user":{"login":"sudeshsh","id":29582829,"node_id":"MDQ6VXNlcjI5NTgyODI5","avatar_url":"https://avatars2.githubusercontent.com/u/29582829?v=4","gravatar_id":"","url":"https://api.github.com/users/sudeshsh","html_url":"https://github.com/sudeshsh","followers_url":"https://api.github.com/users/sudeshsh/followers","following_url":"https://api.github.com/users/sudeshsh/following{/other_user}","gists_url":"https://api.github.com/users/sudeshsh/gists{/gist_id}","starred_url":"https://api.github.com/users/sudeshsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sudeshsh/subscriptions","organizations_url":"https://api.github.com/users/sudeshsh/orgs","repos_url":"https://api.github.com/users/sudeshsh/repos","events_url":"https://api.github.com/users/sudeshsh/events{/privacy}","received_events_url":"https://api.github.com/users/sudeshsh/received_events","type":"User","site_admin":false},"repo":{"id":146352718,"node_id":"MDEwOlJlcG9zaXRvcnkxNDYzNTI3MTg=","name":"kubernetes","full_name":"sudeshsh/kubernetes","private":false,"owner":{"login":"sudeshsh","id":29582829,"node_id":"MDQ6VXNlcjI5NTgyODI5","avatar_url":"https://avatars2.githubusercontent.com/u/29582829?v=4","gravatar_id":"","url":"https://api.github.com/users/sudeshsh","html_url":"https://github.com/sudeshsh","followers_url":"https://api.github.com/users/sudeshsh/followers","following_url":"https://api.github.com/users/sudeshsh/following{/other_user}","gists_url":"https://api.github.com/users/sudeshsh/gists{/gist_id}","starred_url":"https://api.github.com/users/sudeshsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sudeshsh/subscriptions","organizations_url":"https://api.github.com/users/sudeshsh/orgs","repos_url":"https://api.github.com/users/sudeshsh/repos","events_url":"https://api.github.com/users/sudeshsh/events{/privacy}","received_events_url":"https://api.github.com/users/sudeshsh/received_events","type":"User","site_admin":false},"html_url":"https://github.com/sudeshsh/kubernetes","description":"Production-Grade Container Scheduling and Management","fork":true,"url":"https://api.github.com/repos/sudeshsh/kubernetes","forks_url":"https://api.github.com/repos/sudeshsh/kubernetes/forks","keys_url":"https://api.github.com/repos/sudeshsh/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sudeshsh/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sudeshsh/kubernetes/teams","hooks_url":"https://api.github.com/repos/sudeshsh/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/sudeshsh/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/sudeshsh/kubernetes/events","assignees_url":"https://api.github.com/repos/sudeshsh/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/sudeshsh/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/sudeshsh/kubernetes/tags","blobs_url":"https://api.github.com/repos/sudeshsh/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sudeshsh/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sudeshsh/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/sudeshsh/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sudeshsh/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/sudeshsh/kubernetes/languages","stargazers_url":"https://api.github.com/repos/sudeshsh/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/sudeshsh/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/sudeshsh/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/sudeshsh/kubernetes/subscription","commits_url":"https://api.github.com/repos/sudeshsh/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/sudeshsh/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/sudeshsh/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/sudeshsh/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/sudeshsh/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/sudeshsh/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sudeshsh/kubernetes/merges","archive_url":"https://api.github.com/repos/sudeshsh/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sudeshsh/kubernetes/downloads","issues_url":"https://api.github.com/repos/sudeshsh/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/sudeshsh/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/sudeshsh/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/sudeshsh/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sudeshsh/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/sudeshsh/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/sudeshsh/kubernetes/deployments","created_at":"2018-08-27T20:51:31Z","updated_at":"2018-08-27T20:52:10Z","pushed_at":"2018-10-24T18:23:58Z","git_url":"git://github.com/sudeshsh/kubernetes.git","ssh_url":"git@github.com:sudeshsh/kubernetes.git","clone_url":"https://github.com/sudeshsh/kubernetes.git","svn_url":"https://github.com/sudeshsh/kubernetes","homepage":"http://kubernetes.io","size":588607,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"3abb9f0ad7fd27a52679e395e73a62bebefea6fe","user":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyMDU4MDQ5OA==","name":"kubernetes","full_name":"kubernetes/kubernetes","private":false,"owner":{"login":"kubernetes","id":13629408,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNjI5NDA4","avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","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},"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":"2018-10-31T05:36:27Z","pushed_at":"2018-10-31T06:02: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":"https://kubernetes.io","size":810131,"stargazers_count":43200,"watchers_count":43200,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":15034,"mirror_url":null,"archived":false,"open_issues_count":3168,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":15034,"open_issues":3168,"watchers":43200,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/68429"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/68429"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/68429/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68429/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/2254fd8aed0f5afdb3124015a99e4b447f818cd6"}},"author_association":"NONE"}}
{"actor":{"display_login":"k82cn"}}