{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/232395897","pull_request_review_id":173592707,"id":232395897,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMjM5NTg5Nw==","diff_hunk":"@@ -0,0 +1,341 @@\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 conversion\n+\n+import (\n+\t\"context\"\n+\t\"errors\"\n+\t\"fmt\"\n+\n+\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n+\t\"k8s.io/apimachinery/pkg/runtime\"\n+\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n+\t\"k8s.io/apimachinery/pkg/util/uuid\"\n+\t\"k8s.io/apiserver/pkg/util/webhook\"\n+\t\"k8s.io/client-go/rest\"\n+\n+\tinternal \"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions\"\n+\t\"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1\"\n+\t\"k8s.io/apimachinery/pkg/apis/meta/v1\"\n+)\n+\n+type webhookConverterFactory struct {\n+\tclientManager webhook.ClientManager\n+}\n+\n+func newWebhookConverterFactory(serviceResolver webhook.ServiceResolver, authResolverWrapper webhook.AuthenticationInfoResolverWrapper) (*webhookConverterFactory, error) {\n+\tclientManager, err := webhook.NewClientManager(v1beta1.SchemeGroupVersion, v1beta1.AddToScheme)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\tauthInfoResolver, err := webhook.NewDefaultAuthenticationInfoResolver(\"\")\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\t// Set defaults which may be overridden later.\n+\tclientManager.SetAuthenticationInfoResolver(authInfoResolver)\n+\tclientManager.SetAuthenticationInfoResolverWrapper(authResolverWrapper)\n+\tclientManager.SetServiceResolver(serviceResolver)\n+\treturn &webhookConverterFactory{clientManager}, nil\n+}\n+\n+// webhookConverter is a converter that calls an external webhook to do the CR conversion.\n+type webhookConverter struct {\n+\tvalidVersions map[schema.GroupVersion]bool\n+\tclientManager webhook.ClientManager\n+\trestClient    *rest.RESTClient\n+\tname          string\n+\tnopConverter  nopConverter\n+}\n+\n+func webhookClientConfigForCRD(crd *internal.CustomResourceDefinition) *webhook.ClientConfig {\n+\tapiConfig := crd.Spec.Conversion.WebhookClientConfig\n+\tret := webhook.ClientConfig{\n+\t\tName:     fmt.Sprintf(\"conversion_webhook_for_%s\", crd.Name),\n+\t\tCABundle: apiConfig.CABundle,\n+\t}\n+\tif apiConfig.URL != nil {\n+\t\tret.URL = *apiConfig.URL\n+\t}\n+\tif apiConfig.Service != nil {\n+\t\tret.Service = &webhook.ClientConfigService{\n+\t\t\tName:      apiConfig.Service.Name,\n+\t\t\tNamespace: apiConfig.Service.Namespace,\n+\t\t}\n+\t\tif apiConfig.Service.Path != nil {\n+\t\t\tret.Service.Path = *apiConfig.Service.Path\n+\t\t}\n+\t}\n+\treturn &ret\n+}\n+\n+var _ runtime.ObjectConvertor = &webhookConverter{}\n+\n+func (f *webhookConverterFactory) NewWebhookConverter(validVersions map[schema.GroupVersion]bool, crd *internal.CustomResourceDefinition) (*webhookConverter, error) {\n+\trestClient, err := f.clientManager.HookClient(*webhookClientConfigForCRD(crd))\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn &webhookConverter{\n+\t\tclientManager: f.clientManager,\n+\t\tvalidVersions: validVersions,\n+\t\trestClient:    restClient,\n+\t\tname:          crd.Name,\n+\t\tnopConverter:  nopConverter{validVersions: validVersions},\n+\t}, nil\n+}\n+\n+func (webhookConverter) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) {\n+\treturn \"\", \"\", errors.New(\"unstructured cannot convert field labels\")\n+}\n+\n+func (c *webhookConverter) Convert(in, out, context interface{}) error {\n+\tunstructIn, ok := in.(*unstructured.Unstructured)\n+\tif !ok {\n+\t\treturn fmt.Errorf(\"input type %T in not valid for unstructured conversion\", in)\n+\t}\n+\n+\tunstructOut, ok := out.(*unstructured.Unstructured)\n+\tif !ok {\n+\t\treturn fmt.Errorf(\"output type %T in not valid for unstructured conversion\", out)\n+\t}\n+\n+\toutGVK := unstructOut.GroupVersionKind()\n+\tif !c.validVersions[outGVK.GroupVersion()] {\n+\t\treturn fmt.Errorf(\"request to convert CR from an invalid group/version: %s\", outGVK.String())\n+\t}\n+\tinGVK := unstructIn.GroupVersionKind()\n+\tif !c.validVersions[inGVK.GroupVersion()] {\n+\t\treturn fmt.Errorf(\"request to convert CR to an invalid group/version: %s\", inGVK.String())\n+\t}\n+\n+\tconverted, err := c.ConvertToVersion(unstructIn, outGVK.GroupVersion())\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tunstructuredConverted, ok := converted.(runtime.Unstructured)\n+\tif !ok {\n+\t\t// this should not happened\n+\t\treturn fmt.Errorf(\"CR conversion failed\")\n+\t}\n+\tunstructOut.SetUnstructuredContent(unstructuredConverted.UnstructuredContent())\n+\treturn nil\n+}\n+\n+func createConversionReview(obj runtime.Object, apiVersion string) *v1beta1.ConversionReview {\n+\tlistObj, isList := obj.(*unstructured.UnstructuredList)\n+\tvar objects []runtime.RawExtension\n+\tif isList {\n+\t\tfor _, item := range listObj.Items {\n+\t\t\t// Only sent item for conversion, if the apiVersion is different\n+\t\t\tif item.GetAPIVersion() != apiVersion {\n+\t\t\t\tobjects = append(objects, runtime.RawExtension{Object: item.DeepCopyObject()})\n+\t\t\t}\n+\t\t}\n+\t} else {\n+\t\tobjects = []runtime.RawExtension{{Object: obj}}\n+\t}\n+\treturn &v1beta1.ConversionReview{\n+\t\tRequest: &v1beta1.ConversionRequest{\n+\t\t\tObjects:           objects,\n+\t\t\tDesiredAPIVersion: apiVersion,\n+\t\t\tUID:               uuid.NewUUID(),\n+\t\t},\n+\t\tResponse: &v1beta1.ConversionResponse{},\n+\t}\n+}\n+\n+func getRawExtensionObject(rx runtime.RawExtension) (runtime.Object, error) {\n+\tif rx.Object != nil {\n+\t\treturn rx.Object, nil\n+\t}\n+\tu := unstructured.Unstructured{}\n+\terr := u.UnmarshalJSON(rx.Raw)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn &u, nil\n+}\n+\n+func ensureCorrectGVK(obj runtime.Object, gvk schema.GroupVersionKind) error {\n+\tconvertedGVK := obj.GetObjectKind().GroupVersionKind()\n+\tif convertedGVK != gvk {\n+\t\treturn fmt.Errorf(\"invalid GVK returned by conversion webhook. expected=%s, actual=%s\", gvk, convertedGVK)\n+\t}\n+\treturn nil\n+}\n+\n+func (c *webhookConverter) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) {\n+\t// In general, the webhook should not do any defaulting or validation. A special case of that is an empty object\n+\t// conversion that must result an empty object and practically is the same as nopConverter.\n+\t// A smoke test in API machinery calls the converter on empty objects. As this case happens consistently\n+\t// it special cased here not to call webhook converter. The test initiated here:\n+\t// https://github.com/kubernetes/kubernetes/blob/dbb448bbdcb9e440eee57024ffa5f1698956a054/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go#L201\n+\tif isEmptyUnstructuredObject(in) {\n+\t\treturn c.nopConverter.ConvertToVersion(in, target)\n+\t}\n+\n+\tfromGVK := in.GetObjectKind().GroupVersionKind()\n+\ttoGVK, ok := target.KindForGroupVersionKinds([]schema.GroupVersionKind{fromGVK})\n+\tif !ok {\n+\t\t// TODO: should this be a typed error?\n+\t\treturn nil, fmt.Errorf(\"%v is unstructured and is not suitable for converting to %q\", fromGVK.String(), target)\n+\t}\n+\tif !c.validVersions[toGVK.GroupVersion()] {\n+\t\treturn nil, fmt.Errorf(\"request to convert CR to an invalid group/version: %s\", toGVK.String())\n+\t}\n+\tlistObj, isList := in.(*unstructured.UnstructuredList)\n+\tif isList {\n+\t\tfor i, item := range listObj.Items {\n+\t\t\tif !c.validVersions[item.GroupVersionKind().GroupVersion()] {\n+\t\t\t\treturn nil, fmt.Errorf(\"request to convert List of CRs to an invalid group/version for item %v: %s\", i, item.GroupVersionKind())\n+\t\t\t}\n+\t\t}\n+\t\tif !c.validVersions[fromGVK.GroupVersion()] {","path":"staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go","position":208,"original_position":208,"commit_id":"3f892671f6a57c44c35f336d8d31ba18523dcaa3","original_commit_id":"3f892671f6a57c44c35f336d8d31ba18523dcaa3","user":{"login":"liggitt","id":980082,"node_id":"MDQ6VXNlcjk4MDA4Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/980082?v=4","gravatar_id":"","url":"https://api.github.com/users/liggitt","html_url":"https://github.com/liggitt","followers_url":"https://api.github.com/users/liggitt/followers","following_url":"https://api.github.com/users/liggitt/following{/other_user}","gists_url":"https://api.github.com/users/liggitt/gists{/gist_id}","starred_url":"https://api.github.com/users/liggitt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/liggitt/subscriptions","organizations_url":"https://api.github.com/users/liggitt/orgs","repos_url":"https://api.github.com/users/liggitt/repos","events_url":"https://api.github.com/users/liggitt/events{/privacy}","received_events_url":"https://api.github.com/users/liggitt/received_events","type":"User","site_admin":false},"body":"either compute fromGVK per-item inside the loop or move this check and message outside the loop. isn't `fromGVK` for a particular item `item.GroupVersionKind()`?","created_at":"2018-11-09T21:15:25Z","updated_at":"2018-11-09T21:38:24Z","html_url":"https://github.com/kubernetes/kubernetes/pull/67006#discussion_r232395897","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/232395897"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/67006#discussion_r232395897"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006","id":206313470,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA2MzEzNDcw","html_url":"https://github.com/kubernetes/kubernetes/pull/67006","diff_url":"https://github.com/kubernetes/kubernetes/pull/67006.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/67006.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/67006","number":67006,"state":"open","locked":false,"title":"CRD webhook conversion","user":{"login":"mbohlool","id":1613024,"node_id":"MDQ6VXNlcjE2MTMwMjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/1613024?v=4","gravatar_id":"","url":"https://api.github.com/users/mbohlool","html_url":"https://github.com/mbohlool","followers_url":"https://api.github.com/users/mbohlool/followers","following_url":"https://api.github.com/users/mbohlool/following{/other_user}","gists_url":"https://api.github.com/users/mbohlool/gists{/gist_id}","starred_url":"https://api.github.com/users/mbohlool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbohlool/subscriptions","organizations_url":"https://api.github.com/users/mbohlool/orgs","repos_url":"https://api.github.com/users/mbohlool/repos","events_url":"https://api.github.com/users/mbohlool/events{/privacy}","received_events_url":"https://api.github.com/users/mbohlool/received_events","type":"User","site_admin":false},"body":"This PR is ready for review. I plan to bring parts of it (specially the refactoring in first commits) into a new PR. What is intentionally missing from this PR to make it smaller is multi-scheme and multi-print-column etc. support that will be done in a separate PR.\r\n\r\nThe PR has an end to end test with a nice image that can be used as a reference to implement conversion webhooks (it has separate framework and user code). I will use that for documentation and kubebuilder support.\r\n\r\n\r\n```release-note\r\nAdd support for CRD conversion webhook\r\n```\r\n\r\n--------------\r\nRelated PRs and Issues\r\n--------------\r\n- [Feature issue](https://github.com/kubernetes/features/issues/598)\r\n- ~#67798: Refactor webhook calling code. Dependency of this PR. Already merged.~\r\n- ~#67795: The API changes. Going through final API reviews. This PR is rebased on that.~\r\n- ~#70211 : Multi version schema, additionalprintcolumn and subresources. Not a direct dependency of this PR but related. Current Status: ready to review~\r\n- ~#70087: Support internal versions for CRDs (fix a bug in /scale). Already merged.~","created_at":"2018-08-06T07:39:33Z","updated_at":"2018-11-09T21:38:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"371e4e8177ceb9045ab91867c5068a795bdfbb68","assignee":{"login":"mbohlool","id":1613024,"node_id":"MDQ6VXNlcjE2MTMwMjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/1613024?v=4","gravatar_id":"","url":"https://api.github.com/users/mbohlool","html_url":"https://github.com/mbohlool","followers_url":"https://api.github.com/users/mbohlool/followers","following_url":"https://api.github.com/users/mbohlool/following{/other_user}","gists_url":"https://api.github.com/users/mbohlool/gists{/gist_id}","starred_url":"https://api.github.com/users/mbohlool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbohlool/subscriptions","organizations_url":"https://api.github.com/users/mbohlool/orgs","repos_url":"https://api.github.com/users/mbohlool/repos","events_url":"https://api.github.com/users/mbohlool/events{/privacy}","received_events_url":"https://api.github.com/users/mbohlool/received_events","type":"User","site_admin":false},"assignees":[{"login":"mbohlool","id":1613024,"node_id":"MDQ6VXNlcjE2MTMwMjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/1613024?v=4","gravatar_id":"","url":"https://api.github.com/users/mbohlool","html_url":"https://github.com/mbohlool","followers_url":"https://api.github.com/users/mbohlool/followers","following_url":"https://api.github.com/users/mbohlool/following{/other_user}","gists_url":"https://api.github.com/users/mbohlool/gists{/gist_id}","starred_url":"https://api.github.com/users/mbohlool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbohlool/subscriptions","organizations_url":"https://api.github.com/users/mbohlool/orgs","repos_url":"https://api.github.com/users/mbohlool/repos","events_url":"https://api.github.com/users/mbohlool/events{/privacy}","received_events_url":"https://api.github.com/users/mbohlool/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"luxas","id":5442475,"node_id":"MDQ6VXNlcjU0NDI0NzU=","avatar_url":"https://avatars1.githubusercontent.com/u/5442475?v=4","gravatar_id":"","url":"https://api.github.com/users/luxas","html_url":"https://github.com/luxas","followers_url":"https://api.github.com/users/luxas/followers","following_url":"https://api.github.com/users/luxas/following{/other_user}","gists_url":"https://api.github.com/users/luxas/gists{/gist_id}","starred_url":"https://api.github.com/users/luxas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luxas/subscriptions","organizations_url":"https://api.github.com/users/luxas/orgs","repos_url":"https://api.github.com/users/luxas/repos","events_url":"https://api.github.com/users/luxas/events{/privacy}","received_events_url":"https://api.github.com/users/luxas/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":136601536,"node_id":"MDU6TGFiZWwxMzY2MDE1MzY=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/area/apiserver","name":"area/apiserver","color":"0052cc","default":false},{"id":556590057,"node_id":"MDU6TGFiZWw1NTY1OTAwNTc=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/area/custom-resources","name":"area/custom-resources","color":"0052cc","default":false},{"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":200149833,"node_id":"MDU6TGFiZWwyMDAxNDk4MzM=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/release-note","name":"release-note","color":"c2e0c6","default":false},{"id":173493835,"node_id":"MDU6TGFiZWwxNzM0OTM4MzU=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/api-machinery","name":"sig/api-machinery","color":"d2b48c","default":false},{"id":636152047,"node_id":"MDU6TGFiZWw2MzYxNTIwNDc=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/architecture","name":"sig/architecture","color":"d2b48c","default":false},{"id":483069764,"node_id":"MDU6TGFiZWw0ODMwNjk3NjQ=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/sig/testing","name":"sig/testing","color":"d2b48c","default":false},{"id":253451093,"node_id":"MDU6TGFiZWwyNTM0NTEwOTM=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/size/XXL","name":"size/XXL","color":"ee0000","default":false}],"milestone":{"url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/40","html_url":"https://github.com/kubernetes/kubernetes/milestone/40","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/40/labels","id":2913713,"node_id":"MDk6TWlsZXN0b25lMjkxMzcxMw==","number":40,"title":"v1.13","description":"","creator":{"login":"thockin","id":5595220,"node_id":"MDQ6VXNlcjU1OTUyMjA=","avatar_url":"https://avatars0.githubusercontent.com/u/5595220?v=4","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},"open_issues":74,"closed_issues":95,"state":"open","created_at":"2017-11-15T06:32:59Z","updated_at":"2018-11-09T21:38:05Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/67006/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3f892671f6a57c44c35f336d8d31ba18523dcaa3","head":{"label":"mbohlool:crd_webhook_conversion","ref":"crd_webhook_conversion","sha":"3f892671f6a57c44c35f336d8d31ba18523dcaa3","user":{"login":"mbohlool","id":1613024,"node_id":"MDQ6VXNlcjE2MTMwMjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/1613024?v=4","gravatar_id":"","url":"https://api.github.com/users/mbohlool","html_url":"https://github.com/mbohlool","followers_url":"https://api.github.com/users/mbohlool/followers","following_url":"https://api.github.com/users/mbohlool/following{/other_user}","gists_url":"https://api.github.com/users/mbohlool/gists{/gist_id}","starred_url":"https://api.github.com/users/mbohlool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbohlool/subscriptions","organizations_url":"https://api.github.com/users/mbohlool/orgs","repos_url":"https://api.github.com/users/mbohlool/repos","events_url":"https://api.github.com/users/mbohlool/events{/privacy}","received_events_url":"https://api.github.com/users/mbohlool/received_events","type":"User","site_admin":false},"repo":{"id":58666689,"node_id":"MDEwOlJlcG9zaXRvcnk1ODY2NjY4OQ==","name":"kubernetes","full_name":"mbohlool/kubernetes","private":false,"owner":{"login":"mbohlool","id":1613024,"node_id":"MDQ6VXNlcjE2MTMwMjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/1613024?v=4","gravatar_id":"","url":"https://api.github.com/users/mbohlool","html_url":"https://github.com/mbohlool","followers_url":"https://api.github.com/users/mbohlool/followers","following_url":"https://api.github.com/users/mbohlool/following{/other_user}","gists_url":"https://api.github.com/users/mbohlool/gists{/gist_id}","starred_url":"https://api.github.com/users/mbohlool/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbohlool/subscriptions","organizations_url":"https://api.github.com/users/mbohlool/orgs","repos_url":"https://api.github.com/users/mbohlool/repos","events_url":"https://api.github.com/users/mbohlool/events{/privacy}","received_events_url":"https://api.github.com/users/mbohlool/received_events","type":"User","site_admin":false},"html_url":"https://github.com/mbohlool/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/mbohlool/kubernetes","forks_url":"https://api.github.com/repos/mbohlool/kubernetes/forks","keys_url":"https://api.github.com/repos/mbohlool/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mbohlool/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mbohlool/kubernetes/teams","hooks_url":"https://api.github.com/repos/mbohlool/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/mbohlool/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/mbohlool/kubernetes/events","assignees_url":"https://api.github.com/repos/mbohlool/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/mbohlool/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/mbohlool/kubernetes/tags","blobs_url":"https://api.github.com/repos/mbohlool/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mbohlool/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mbohlool/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/mbohlool/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mbohlool/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/mbohlool/kubernetes/languages","stargazers_url":"https://api.github.com/repos/mbohlool/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/mbohlool/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/mbohlool/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/mbohlool/kubernetes/subscription","commits_url":"https://api.github.com/repos/mbohlool/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/mbohlool/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/mbohlool/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/mbohlool/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/mbohlool/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/mbohlool/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mbohlool/kubernetes/merges","archive_url":"https://api.github.com/repos/mbohlool/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mbohlool/kubernetes/downloads","issues_url":"https://api.github.com/repos/mbohlool/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/mbohlool/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/mbohlool/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/mbohlool/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mbohlool/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/mbohlool/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/mbohlool/kubernetes/deployments","created_at":"2016-05-12T18:30:33Z","updated_at":"2018-06-04T05:32:10Z","pushed_at":"2018-11-09T21:14:15Z","git_url":"git://github.com/mbohlool/kubernetes.git","ssh_url":"git@github.com:mbohlool/kubernetes.git","clone_url":"https://github.com/mbohlool/kubernetes.git","svn_url":"https://github.com/mbohlool/kubernetes","homepage":"http://kubernetes.io","size":583267,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":3,"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":3,"watchers":1,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"c3d05c816d315383b861ca2330c18e3211324864","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-11-09T21:31:59Z","pushed_at":"2018-11-09T21:23:17Z","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":813307,"stargazers_count":43621,"watchers_count":43621,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":15159,"mirror_url":null,"archived":false,"open_issues_count":3184,"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":15159,"open_issues":3184,"watchers":43621,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/67006"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/67006"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/67006/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/67006/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3f892671f6a57c44c35f336d8d31ba18523dcaa3"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"liggitt"}}