{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/131033001","pull_request_review_id":53955886,"id":131033001,"diff_hunk":"@@ -0,0 +1,350 @@\n+/*\n+Copyright 2017 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 kubeletconfig\n+\n+import (\n+\t\"fmt\"\n+\t\"path/filepath\"\n+\t\"time\"\n+\n+\tapiv1 \"k8s.io/api/core/v1\"\n+\t\"k8s.io/apimachinery/pkg/util/wait\"\n+\tclientset \"k8s.io/client-go/kubernetes\"\n+\t\"k8s.io/client-go/tools/cache\"\n+\t\"k8s.io/kubernetes/pkg/apis/componentconfig\"\n+\t\"k8s.io/kubernetes/pkg/apis/componentconfig/validation\"\n+\t\"k8s.io/kubernetes/pkg/version\"\n+\n+\t\"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/badconfig\"\n+\t\"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store\"\n+\t\"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles\"\n+\t\"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/startups\"\n+\t\"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status\"\n+\tutilfs \"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem\"\n+\tutillog \"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log\"\n+\tutilpanic \"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic\"\n+)\n+\n+const (\n+\tbadConfigTrackingDir = \"bad-config-tracking\"\n+\tstartupTrackingDir   = \"startup-tracking\"\n+\tcheckpointsDir       = \"checkpoints\"\n+\tinitConfigDir        = \"init\"\n+)\n+\n+// Controller is the controller which, among other things:\n+// - loads configuration from disk\n+// - checkpoints configuration to disk\n+// - downloads new configuration from the API server\n+// - validates configuration\n+// - monitors for potential crash-loops caused by new configurations\n+// - tracks the last-known-good configuration, and rolls-back to last-known-good when necessary\n+// For more information, see the proposal: https://github.com/kubernetes/kubernetes/pull/29459\n+type Controller struct {\n+\t// dynamicConfig, if true, indicates that we should sync config from the API server\n+\tdynamicConfig bool\n+\n+\t// defaultConfig is the configuration to use if no initConfig is provided\n+\tdefaultConfig *componentconfig.KubeletConfiguration\n+\n+\t// initConfig is the unmarshaled init config, this will be loaded by the Controller if an initConfigDir is provided\n+\tinitConfig *componentconfig.KubeletConfiguration\n+\n+\t// initLoader is for loading the Kubelet's init configuration files from disk\n+\tinitLoader configfiles.Loader\n+\n+\t// pendingConfigSource; write to this channel to indicate that the config source needs to be synced from the API server\n+\tpendingConfigSource chan bool\n+\n+\t// configOK manages the ConfigOK condition that is reported in Node.Status.Conditions\n+\tconfigOK status.ConfigOKCondition\n+\n+\t// informer is the informer that watches the Node object\n+\tinformer cache.SharedInformer\n+\n+\t// checkpointStore persists config source checkpoints to a storage layer\n+\tcheckpointStore store.Store\n+\n+\t// badConfigTracker persists bad-config records to a storage layer\n+\tbadConfigTracker badconfig.Tracker\n+\n+\t// startupTracker persists Kubelet startup records, used for crash-loop detection, to a storage layer\n+\tstartupTracker startups.Tracker\n+}\n+\n+// NewController constructs a new Controller object and returns it. Directory paths must be absolute.\n+// If the `initConfigDir` is an empty string, skips trying to load the init config.\n+// If the `dynamicConfigDir` is an empty string, skips trying to load checkpoints or download new config,\n+// but will still sync the ConfigOK condition if you call StartSync with a non-nil client.\n+func NewController(initConfigDir string, dynamicConfigDir string, defaultConfig *componentconfig.KubeletConfiguration) *Controller {\n+\tfs := utilfs.DefaultFs{}\n+\n+\tvar initLoader configfiles.Loader\n+\tif len(initConfigDir) > 0 {\n+\t\tinitLoader = configfiles.NewFSLoader(fs, initConfigDir)\n+\t}\n+\tdynamicConfig := false\n+\tif len(dynamicConfigDir) > 0 {\n+\t\tdynamicConfig = true\n+\t}\n+\n+\t// Get the current kubelet version; bad-config and startup-tracking information can be kubelet-version specific,\n+\t// e.g. a bug that crash loops an old Kubelet under a given config might be fixed in a new Kubelet or vice-versa,\n+\t// validation might be relaxed in a new Kubelet, etc.\n+\t// We also don't want a change in a file format to break Kubelet upgrades; this makes sure a new kubelet gets\n+\t// a fresh dir to put its config health data in.\n+\t// Note that config checkpoints use the api machinery to store ConfigMaps, and thus get file format versioning for free.\n+\tkubeletVersion := version.Get().String()\n+\n+\treturn &Controller{\n+\t\tdynamicConfig: dynamicConfig,\n+\t\tdefaultConfig: defaultConfig,\n+\t\t// channels must have capacity at least 1, since we signal with non-blocking writes\n+\t\tpendingConfigSource: make(chan bool, 1),\n+\t\tconfigOK:            status.NewConfigOKCondition(),\n+\t\tcheckpointStore:     store.NewFsStore(fs, filepath.Join(dynamicConfigDir, checkpointsDir)),\n+\t\tbadConfigTracker:    badconfig.NewFsTracker(fs, filepath.Join(dynamicConfigDir, badConfigTrackingDir, kubeletVersion)),\n+\t\tstartupTracker:      startups.NewFsTracker(fs, filepath.Join(dynamicConfigDir, startupTrackingDir, kubeletVersion)),\n+\t\tinitLoader:          initLoader,\n+\t}\n+}\n+\n+// Bootstrap attempts to return a valid KubeletConfiguration based on the configuration of the Controller,\n+// or returns an error if no valid configuration could be produced. Bootstrap should be called synchronously before StartSync.\n+func (cc *Controller) Bootstrap() (*componentconfig.KubeletConfiguration, error) {\n+\tutillog.Infof(\"starting controller\")\n+\n+\t// ALWAYS validate the local (default and init) configs. This makes incorrectly provisioned nodes an error.\n+\t// These must be valid because they are the foundational last-known-good configs.\n+\tutillog.Infof(\"validating combination of defaults and flags\")\n+\tif err := validation.ValidateKubeletConfiguration(cc.defaultConfig); err != nil {\n+\t\treturn nil, fmt.Errorf(\"combination of defaults and flags failed validation, error: %v\", err)","path":"pkg/kubelet/kubeletconfig/controller.go","position":135,"original_position":135,"commit_id":"81b7462292f3d652ff7eb9e7ec330445d5550138","original_commit_id":"81b7462292f3d652ff7eb9e7ec330445d5550138","user":{"login":"dchen1107","id":7740897,"avatar_url":"https://avatars2.githubusercontent.com/u/7740897?v=4","gravatar_id":"","url":"https://api.github.com/users/dchen1107","html_url":"https://github.com/dchen1107","followers_url":"https://api.github.com/users/dchen1107/followers","following_url":"https://api.github.com/users/dchen1107/following{/other_user}","gists_url":"https://api.github.com/users/dchen1107/gists{/gist_id}","starred_url":"https://api.github.com/users/dchen1107/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dchen1107/subscriptions","organizations_url":"https://api.github.com/users/dchen1107/orgs","repos_url":"https://api.github.com/users/dchen1107/repos","events_url":"https://api.github.com/users/dchen1107/events{/privacy}","received_events_url":"https://api.github.com/users/dchen1107/received_events","type":"User","site_admin":false},"body":"One thing is unclear to me in this pr is if the validation of default and init config failed, should kubelet exit with an error? Or keep running if it can but reporting bad status? ","created_at":"2017-08-03T01:00:39Z","updated_at":"2017-08-03T01:24:34Z","html_url":"https://github.com/kubernetes/kubernetes/pull/46254#discussion_r131033001","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/131033001"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/46254#discussion_r131033001"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254","id":121880379,"html_url":"https://github.com/kubernetes/kubernetes/pull/46254","diff_url":"https://github.com/kubernetes/kubernetes/pull/46254.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/46254.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/46254","number":46254,"state":"open","locked":false,"title":"Alpha Dynamic Kubelet Configuration","user":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars1.githubusercontent.com/u/903617?v=4","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"body":"Feature: https://github.com/kubernetes/features/issues/281\r\n\r\nThis proposal contains the alpha implementation of the Dynamic Kubelet Configuration feature proposed in ~#29459~ [community/contributors/design-proposals/dynamic-kubelet-configuration.md](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/dynamic-kubelet-configuration.md). \r\n\r\nPlease note:\r\n- ~The proposal doc is not yet up to date with this implementation, there are some subtle differences and some more significant ones. I will update the proposal doc to match by tomorrow afternoon.~\r\n- ~This obviously needs more tests. I plan to write several O(soon). Since it's alpha and feature-gated, I'm decoupling this review from the review of the tests.~ I've beefed up the unit tests, though there is still plenty of testing to be done.\r\n- ~I'm temporarily holding off on updating the generated docs, api specs, etc, for the sake of my reviewers :smile:~ these files now live in a separate commit; the first commit is the one to review.\r\n\r\n/cc @dchen1107 @vishh @bgrant0607 @thockin @derekwaynecarr \r\n\r\n```release-note\r\nAdds (alpha feature) the ability to dynamically configure Kubelets by enabling the DynamicKubeletConfig feature gate, posting a ConfigMap to the API server, and setting the spec.configSource field on Node objects. See the proposal at https://github.com/kubernetes/community/blob/master/contributors/design-proposals/dynamic-kubelet-configuration.md for details.\r\n```\r\n","created_at":"2017-05-22T22:43:52Z","updated_at":"2017-08-03T01:24:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a33f5beb1575b6cff13080a48ad4e590b9dfd6fa","assignee":{"login":"thockin","id":5595220,"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},"assignees":[{"login":"thockin","id":5595220,"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},{"login":"derekwaynecarr","id":6233452,"avatar_url":"https://avatars3.githubusercontent.com/u/6233452?v=4","gravatar_id":"","url":"https://api.github.com/users/derekwaynecarr","html_url":"https://github.com/derekwaynecarr","followers_url":"https://api.github.com/users/derekwaynecarr/followers","following_url":"https://api.github.com/users/derekwaynecarr/following{/other_user}","gists_url":"https://api.github.com/users/derekwaynecarr/gists{/gist_id}","starred_url":"https://api.github.com/users/derekwaynecarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/derekwaynecarr/subscriptions","organizations_url":"https://api.github.com/users/derekwaynecarr/orgs","repos_url":"https://api.github.com/users/derekwaynecarr/repos","events_url":"https://api.github.com/users/derekwaynecarr/events{/privacy}","received_events_url":"https://api.github.com/users/derekwaynecarr/received_events","type":"User","site_admin":false},{"login":"vishh","id":7063592,"avatar_url":"https://avatars2.githubusercontent.com/u/7063592?v=4","gravatar_id":"","url":"https://api.github.com/users/vishh","html_url":"https://github.com/vishh","followers_url":"https://api.github.com/users/vishh/followers","following_url":"https://api.github.com/users/vishh/following{/other_user}","gists_url":"https://api.github.com/users/vishh/gists{/gist_id}","starred_url":"https://api.github.com/users/vishh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishh/subscriptions","organizations_url":"https://api.github.com/users/vishh/orgs","repos_url":"https://api.github.com/users/vishh/repos","events_url":"https://api.github.com/users/vishh/events{/privacy}","received_events_url":"https://api.github.com/users/vishh/received_events","type":"User","site_admin":false},{"login":"dchen1107","id":7740897,"avatar_url":"https://avatars2.githubusercontent.com/u/7740897?v=4","gravatar_id":"","url":"https://api.github.com/users/dchen1107","html_url":"https://github.com/dchen1107","followers_url":"https://api.github.com/users/dchen1107/followers","following_url":"https://api.github.com/users/dchen1107/following{/other_user}","gists_url":"https://api.github.com/users/dchen1107/gists{/gist_id}","starred_url":"https://api.github.com/users/dchen1107/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dchen1107/subscriptions","organizations_url":"https://api.github.com/users/dchen1107/orgs","repos_url":"https://api.github.com/users/dchen1107/repos","events_url":"https://api.github.com/users/dchen1107/events{/privacy}","received_events_url":"https://api.github.com/users/dchen1107/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"caesarxuchao","id":2823529,"avatar_url":"https://avatars2.githubusercontent.com/u/2823529?v=4","gravatar_id":"","url":"https://api.github.com/users/caesarxuchao","html_url":"https://github.com/caesarxuchao","followers_url":"https://api.github.com/users/caesarxuchao/followers","following_url":"https://api.github.com/users/caesarxuchao/following{/other_user}","gists_url":"https://api.github.com/users/caesarxuchao/gists{/gist_id}","starred_url":"https://api.github.com/users/caesarxuchao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caesarxuchao/subscriptions","organizations_url":"https://api.github.com/users/caesarxuchao/orgs","repos_url":"https://api.github.com/users/caesarxuchao/repos","events_url":"https://api.github.com/users/caesarxuchao/events{/privacy}","received_events_url":"https://api.github.com/users/caesarxuchao/received_events","type":"User","site_admin":false},{"login":"thockin","id":5595220,"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},{"login":"derekwaynecarr","id":6233452,"avatar_url":"https://avatars3.githubusercontent.com/u/6233452?v=4","gravatar_id":"","url":"https://api.github.com/users/derekwaynecarr","html_url":"https://github.com/derekwaynecarr","followers_url":"https://api.github.com/users/derekwaynecarr/followers","following_url":"https://api.github.com/users/derekwaynecarr/following{/other_user}","gists_url":"https://api.github.com/users/derekwaynecarr/gists{/gist_id}","starred_url":"https://api.github.com/users/derekwaynecarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/derekwaynecarr/subscriptions","organizations_url":"https://api.github.com/users/derekwaynecarr/orgs","repos_url":"https://api.github.com/users/derekwaynecarr/repos","events_url":"https://api.github.com/users/derekwaynecarr/events{/privacy}","received_events_url":"https://api.github.com/users/derekwaynecarr/received_events","type":"User","site_admin":false},{"login":"vishh","id":7063592,"avatar_url":"https://avatars2.githubusercontent.com/u/7063592?v=4","gravatar_id":"","url":"https://api.github.com/users/vishh","html_url":"https://github.com/vishh","followers_url":"https://api.github.com/users/vishh/followers","following_url":"https://api.github.com/users/vishh/following{/other_user}","gists_url":"https://api.github.com/users/vishh/gists{/gist_id}","starred_url":"https://api.github.com/users/vishh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishh/subscriptions","organizations_url":"https://api.github.com/users/vishh/orgs","repos_url":"https://api.github.com/users/vishh/repos","events_url":"https://api.github.com/users/vishh/events{/privacy}","received_events_url":"https://api.github.com/users/vishh/received_events","type":"User","site_admin":false},{"login":"bgrant0607","id":7725777,"avatar_url":"https://avatars1.githubusercontent.com/u/7725777?v=4","gravatar_id":"","url":"https://api.github.com/users/bgrant0607","html_url":"https://github.com/bgrant0607","followers_url":"https://api.github.com/users/bgrant0607/followers","following_url":"https://api.github.com/users/bgrant0607/following{/other_user}","gists_url":"https://api.github.com/users/bgrant0607/gists{/gist_id}","starred_url":"https://api.github.com/users/bgrant0607/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgrant0607/subscriptions","organizations_url":"https://api.github.com/users/bgrant0607/orgs","repos_url":"https://api.github.com/users/bgrant0607/repos","events_url":"https://api.github.com/users/bgrant0607/events{/privacy}","received_events_url":"https://api.github.com/users/bgrant0607/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/36","html_url":"https://github.com/kubernetes/kubernetes/milestone/36","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/36/labels","id":2545392,"number":36,"title":"v1.8","description":"Kubernetes 1.8 release milestone, date is TBD.","creator":{"login":"timothysc","id":169553,"avatar_url":"https://avatars0.githubusercontent.com/u/169553?v=4","gravatar_id":"","url":"https://api.github.com/users/timothysc","html_url":"https://github.com/timothysc","followers_url":"https://api.github.com/users/timothysc/followers","following_url":"https://api.github.com/users/timothysc/following{/other_user}","gists_url":"https://api.github.com/users/timothysc/gists{/gist_id}","starred_url":"https://api.github.com/users/timothysc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timothysc/subscriptions","organizations_url":"https://api.github.com/users/timothysc/orgs","repos_url":"https://api.github.com/users/timothysc/repos","events_url":"https://api.github.com/users/timothysc/events{/privacy}","received_events_url":"https://api.github.com/users/timothysc/received_events","type":"User","site_admin":false},"open_issues":219,"closed_issues":132,"state":"open","created_at":"2017-05-26T17:18:43Z","updated_at":"2017-08-02T22:27:57Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/46254/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/81b7462292f3d652ff7eb9e7ec330445d5550138","head":{"label":"mtaufen:dkcfg","ref":"dkcfg","sha":"81b7462292f3d652ff7eb9e7ec330445d5550138","user":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars1.githubusercontent.com/u/903617?v=4","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"repo":{"id":58391682,"name":"kubernetes","full_name":"mtaufen/kubernetes","owner":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars1.githubusercontent.com/u/903617?v=4","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mtaufen/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/mtaufen/kubernetes","forks_url":"https://api.github.com/repos/mtaufen/kubernetes/forks","keys_url":"https://api.github.com/repos/mtaufen/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mtaufen/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mtaufen/kubernetes/teams","hooks_url":"https://api.github.com/repos/mtaufen/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/mtaufen/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/mtaufen/kubernetes/events","assignees_url":"https://api.github.com/repos/mtaufen/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/mtaufen/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/mtaufen/kubernetes/tags","blobs_url":"https://api.github.com/repos/mtaufen/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mtaufen/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mtaufen/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/mtaufen/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mtaufen/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/mtaufen/kubernetes/languages","stargazers_url":"https://api.github.com/repos/mtaufen/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/mtaufen/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/mtaufen/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/mtaufen/kubernetes/subscription","commits_url":"https://api.github.com/repos/mtaufen/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/mtaufen/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/mtaufen/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/mtaufen/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/mtaufen/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/mtaufen/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mtaufen/kubernetes/merges","archive_url":"https://api.github.com/repos/mtaufen/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mtaufen/kubernetes/downloads","issues_url":"https://api.github.com/repos/mtaufen/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/mtaufen/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/mtaufen/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/mtaufen/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mtaufen/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/mtaufen/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/mtaufen/kubernetes/deployments","created_at":"2016-05-09T16:30:01Z","updated_at":"2016-05-09T16:30:16Z","pushed_at":"2017-08-02T15:40:02Z","git_url":"git://github.com/mtaufen/kubernetes.git","ssh_url":"git@github.com:mtaufen/kubernetes.git","clone_url":"https://github.com/mtaufen/kubernetes.git","svn_url":"https://github.com/mtaufen/kubernetes","homepage":"http://kubernetes.io","size":449560,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"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":"5ce3b359f1c38a599893fa49ecd31706ed02db42","user":{"login":"kubernetes","id":13629408,"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,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"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},"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-08-03T01:18:48Z","pushed_at":"2017-08-03T01:09:39Z","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":669587,"stargazers_count":25513,"watchers_count":25513,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":9106,"mirror_url":null,"open_issues_count":5195,"forks":9106,"open_issues":5195,"watchers":25513,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/46254"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/46254"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/46254/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/46254/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/81b7462292f3d652ff7eb9e7ec330445d5550138"}}}}
{"actor":{"display_login":"dchen1107"}}