{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/216466478","pull_request_review_id":153949606,"id":216466478,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNjQ2NjQ3OA==","diff_hunk":"@@ -1787,67 +1769,93 @@ EOM\n   sed -i -e \"s@{{image_policy_webhook_config_mount}}@${image_policy_webhook_config_mount}@g\" \"${src_file}\"\n   sed -i -e \"s@{{image_policy_webhook_config_volume}}@${image_policy_webhook_config_volume}@g\" \"${src_file}\"\n \n-  if [[ -z \"${ETCD_KMS_KEY_ID:-}\" ]]; then\n-    # Removing KMS related placeholders.\n-    sed -i -e \" {\n-      s@{{kms_plugin_container}}@@\n-\n-      s@{{kms_socket_mount}}@@\n-      s@{{encryption_provider_mount}}@@\n-\n-      s@{{kms_socket_volume}}@@\n-      s@{{encryption_provider_volume}}@@\n-    } \" \"${src_file}\"\n-  else\n-    local kms_plugin_src_file=\"${src_dir}/kms-plugin-container.manifest\"\n-\n-    if [[ ! -f \"${kms_plugin_src_file}\" ]]; then\n-      echo \"Error: KMS Integration was requested, but \"${kms_plugin_src_file}\" is missing.\"\n-      exit 1\n-    fi\n+  cp \"${src_file}\" \"${ETC_MANIFESTS:-/etc/kubernetes/manifests}\"\n+}\n \n-    if [[ ! -f \"${ENCRYPTION_PROVIDER_CONFIG_PATH}\" ]]; then\n-      echo \"Error: KMS Integration was requested, but \"${ENCRYPTION_PROVIDER_CONFIG_PATH}\" is missing.\"\n-      exit 1\n+# Sets-up etcd encryption.\n+# Configuration of etcd level encryption consists of the following steps:\n+# 1. Writing encryption provider config to disk\n+# 2. Adding experimental-encryption-provider-config flag to kube-apiserver\n+# 3. Add kms-socket-vol and kms-socket-vol-mnt to enable communication with kms-plugin (if requested)\n+#\n+# Expects parameters:\n+# $1 - path to kube-apiserver template\n+# $2 - kube-apiserver startup flags (must be passed by reference)\n+#\n+# Assumes vars (supplied via kube-env):\n+# ENCRYPTION_PROVIDER_CONFIG\n+# CLOUD_KMS_INTEGRATION\n+\n+function setup-etcd-encryption {\n+    local kube_apiserver_template_path=$1\n+\n+    if [[ -z \"${ENCRYPTION_PROVIDER_CONFIG:-}\" ]]; then\n+      sed -i -e \" {\n+        s@{{encryption_provider_mount}}@@\n+        s@{{encryption_provider_volume}}@@\n+        s@{{kms_socket_mount}}@@\n+        s@{{kms_socket_volume}}@@\n+      } \" \"${kube_apiserver_template_path}\"\n+      return\n     fi\n \n-    # TODO: Validate that the encryption config is for KMS.\n-\n-    local kms_socket_dir=\"/var/run/kmsplugin\"\n-\n-    # kms_socket_mnt is used by both kms_plugin and kube-apiserver - this is how these containers talk.\n-    local kms_socket_mnt=\"{ \\\"name\\\": \\\"kmssocket\\\", \\\"mountPath\\\": \\\"${kms_socket_dir}\\\", \\\"readOnly\\\": false}\"\n+    local -n kube_api_server_params=$2\n+    local encryption_provider_config_path=${ENCRYPTION_PROVIDER_CONFIG_PATH:-/etc/srv/kubernetes/encryption-provider-config.yml}\n \n-    local kms_socket_vol=\"{ \\\"name\\\": \\\"kmssocket\\\", \\\"hostPath\\\": {\\\"path\\\": \\\"${kms_socket_dir}\\\", \\\"type\\\": \\\"DirectoryOrCreate\\\"}}\"\n-    local kms_path_to_socket=\"${kms_socket_dir}/socket.sock\"\n+    echo \"${ENCRYPTION_PROVIDER_CONFIG}\" | base64 --decode > \"${encryption_provider_config_path}\"\n+    kube_api_server_params+=\" --experimental-encryption-provider-config=${encryption_provider_config_path}\"\n \n-    local encryption_provider_mnt=\"{ \\\"name\\\": \\\"encryptionconfig\\\", \\\"mountPath\\\": \\\"${ENCRYPTION_PROVIDER_CONFIG_PATH}\\\", \\\"readOnly\\\": true}\"\n-    local encryption_provider_vol=\"{ \\\"name\\\": \\\"encryptionconfig\\\", \\\"hostPath\\\": {\\\"path\\\": \\\"${ENCRYPTION_PROVIDER_CONFIG_PATH}\\\", \\\"type\\\": \\\"File\\\"}}\"\n-\n-    # TODO these are used in other places, convert to global.\n-    local gce_conf_path=\"/etc/gce.conf\"\n-    local cloud_config_mount=\"{\\\"name\\\": \\\"cloudconfigmount\\\",\\\"mountPath\\\": \\\"/etc/gce.conf\\\", \\\"readOnly\\\": true}\"\n-\n-    local kms_plugin_container=$(echo $(sed \" {\n-      s@{{kms_key_uri}}@${ETCD_KMS_KEY_ID}@\n-      s@{{gce_conf_path}}@${gce_conf_path}@\n-      s@{{kms_path_to_socket}}@${kms_path_to_socket}@\n-      s@{{kms_socket_mount}}@${kms_socket_mnt}@\n-      s@{{cloud_config_mount}}@${cloud_config_mount}@\n-    } \" \"${kms_plugin_src_file}\") | tr \"\\n\" \"\\\\n\")\n+    local default_encryption_provider_config_vol=$(echo \"{ \\\"name\\\": \\\"encryptionconfig\\\", \\\"hostPath\\\": {\\\"path\\\": \\\"${encryption_provider_config_path}\\\", \\\"type\\\": \\\"File\\\"}}\" | base64 | tr -d '\\r\\n')\n+    local default_encryption_provider_config_vol_mnt=$(echo \"{ \\\"name\\\": \\\"encryptionconfig\\\", \\\"mountPath\\\": \\\"${encryption_provider_config_path}\\\", \\\"readOnly\\\": true}\" | base64 | tr -d '\\r\\n')\n \n+    local encryption_provider_config_vol_mnt=$(echo \"${ENCRYPTION_PROVIDER_CONFIG_VOL_MNT:-\"${default_encryption_provider_config_vol_mnt}\"}\" | base64 --decode)\n+    local encryption_provider_config_vol=$(echo \"${ENCRYPTION_PROVIDER_CONFIG_VOL:-\"${default_encryption_provider_config_vol}\"}\" | base64 --decode)\n     sed -i -e \" {\n-      s@{{kms_plugin_container}}@${kms_plugin_container},@\n+      s@{{encryption_provider_mount}}@${encryption_provider_config_vol_mnt},@\n+      s@{{encryption_provider_volume}}@${encryption_provider_config_vol},@\n+    } \" \"${kube_apiserver_template_path}\"\n+\n+    if [[ -n \"${CLOUD_KMS_INTEGRATION:-}\" ]]; then\n+      local default_kms_socket_dir=\"/var/run/kmsplugin\"\n+      local default_kms_socket_vol_mnt=$(echo \"{ \\\"name\\\": \\\"kmssocket\\\", \\\"mountPath\\\": \\\"${default_kms_socket_dir}\\\", \\\"readOnly\\\": false}\" | base64 | tr -d '\\r\\n')\n+      local default_kms_socket_vol=$(echo \"{ \\\"name\\\": \\\"kmssocket\\\", \\\"hostPath\\\": {\\\"path\\\": \\\"${default_kms_socket_dir}\\\", \\\"type\\\": \\\"DirectoryOrCreate\\\"}}\" | base64 | tr -d '\\r\\n')\n+\n+      local kms_socket_vol_mnt=$(echo \"${KMS_PLUGIN_SOCKET_VOL_MNT:-\"${default_kms_socket_vol_mnt}\"}\" | base64 --decode)\n+      local kms_socket_vol=$(echo \"${KMS_PLUGIN_SOCKET_VOL:-\"${default_kms_socket_vol}\"}\" | base64 --decode)\n+      sed -i -e \" {\n+        s@{{kms_socket_mount}}@${kms_socket_vol_mnt},@\n+        s@{{kms_socket_volume}}@${kms_socket_vol},@\n+      } \" \"${kube_apiserver_template_path}\"\n+    else\n+      sed -i -e \" {\n+        s@{{kms_socket_mount}}@@\n+        s@{{kms_socket_volume}}@@\n+      } \" \"${kube_apiserver_template_path}\"\n+    fi\n+}\n \n-      s@{{kms_socket_mount}}@${kms_socket_mnt},@\n-      s@{{encryption_provider_mount}}@${encryption_provider_mnt},@\n+# Applies encryption provider config.\n+# This function may be triggered in two scenarios:\n+# 1. Decryption of etcd\n+# 2. Encryption of etcd is added after the cluster is deployed\n+# Both cases require that the existing secrets in etcd be re-proceeded.\n+#\n+# Assumes vars (supplied via kube-env):\n+# ENCRYPTION_PROVIDER_CONFIG_FORCE\n+function apply-encryption-config() {\n+    if [[ -z \"${ENCRYPTION_PROVIDER_CONFIG_FORCE:-}\" ]] || [[ \"${ENCRYPTION_PROVIDER_CONFIG_FORCE:-}\" == \"false\" ]]; then","path":"cluster/gce/gci/configure-helper.sh","position":157,"original_position":157,"commit_id":"bfda078e763953c15734f7d096d15237b3b3fd81","original_commit_id":"bfda078e763953c15734f7d096d15237b3b3fd81","user":{"login":"awly","id":1146263,"node_id":"MDQ6VXNlcjExNDYyNjM=","avatar_url":"https://avatars2.githubusercontent.com/u/1146263?v=4","gravatar_id":"","url":"https://api.github.com/users/awly","html_url":"https://github.com/awly","followers_url":"https://api.github.com/users/awly/followers","following_url":"https://api.github.com/users/awly/following{/other_user}","gists_url":"https://api.github.com/users/awly/gists{/gist_id}","starred_url":"https://api.github.com/users/awly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awly/subscriptions","organizations_url":"https://api.github.com/users/awly/orgs","repos_url":"https://api.github.com/users/awly/repos","events_url":"https://api.github.com/users/awly/events{/privacy}","received_events_url":"https://api.github.com/users/awly/received_events","type":"User","site_admin":false},"body":"`if [[ \"${ENCRYPTION_PROVIDER_CONFIG_FORCE:-false}\" == \"false\" ]];`","created_at":"2018-09-10T20:45:29Z","updated_at":"2018-09-10T20:48:38Z","html_url":"https://github.com/kubernetes/kubernetes/pull/68379#discussion_r216466478","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/216466478"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/68379#discussion_r216466478"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379","id":213765930,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEzNzY1OTMw","html_url":"https://github.com/kubernetes/kubernetes/pull/68379","diff_url":"https://github.com/kubernetes/kubernetes/pull/68379.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/68379.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/68379","number":68379,"state":"open","locked":false,"title":"Enable configure-helper.sh to support two scenarios for etcd level encryption: decryption and adding encryption to existing clusters.","user":{"login":"immutableT","id":24857912,"node_id":"MDQ6VXNlcjI0ODU3OTEy","avatar_url":"https://avatars1.githubusercontent.com/u/24857912?v=4","gravatar_id":"","url":"https://api.github.com/users/immutableT","html_url":"https://github.com/immutableT","followers_url":"https://api.github.com/users/immutableT/followers","following_url":"https://api.github.com/users/immutableT/following{/other_user}","gists_url":"https://api.github.com/users/immutableT/gists{/gist_id}","starred_url":"https://api.github.com/users/immutableT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immutableT/subscriptions","organizations_url":"https://api.github.com/users/immutableT/orgs","repos_url":"https://api.github.com/users/immutableT/repos","events_url":"https://api.github.com/users/immutableT/events{/privacy}","received_events_url":"https://api.github.com/users/immutableT/received_events","type":"User","site_admin":false},"body":"<!--  Thanks for sending a pull request!  Here are some tips for you:\r\n1. If this is your first time, read our contributor guidelines https://git.k8s.io/community/contributors/guide#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide\r\n2. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews\r\n3. Follow the instructions for writing a release note: https://git.k8s.io/community/contributors/guide/release-notes.md\r\n4. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests\r\n-->\r\n\r\n**What this PR does / why we need it**:\r\n\r\n1. Enables two additional scenarios for etcd level encryption:\r\n    Adding encryption to an existing cluster\r\n   Decryption\r\nBoth of the above mentioned scenarios require that secrets be \"touched\" by the envelope transformer post cluster startup. This functionality is implemented in the apply-encryption-config function.\r\n2. Refactor all encryption related logic into a single function - setup-etcd-encryption\r\n3. Remove the responsibility of generating kms-plugin manifest from configure-helper.sh. Implementers of kms-plugins (cloud-providers) should rely on the up-stream components to generate kms-plugin manifest. \r\n\r\n**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:\r\nFixes #\r\n\r\n**Special notes for your reviewer**:\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\nNONE\r\n```\r\n","created_at":"2018-09-06T22:16:27Z","updated_at":"2018-09-10T20:48:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bf59760eb647d2b906bdf898ca2239f42f1fef6b","assignee":{"login":"mikedanese","id":1787169,"node_id":"MDQ6VXNlcjE3ODcxNjk=","avatar_url":"https://avatars3.githubusercontent.com/u/1787169?v=4","gravatar_id":"","url":"https://api.github.com/users/mikedanese","html_url":"https://github.com/mikedanese","followers_url":"https://api.github.com/users/mikedanese/followers","following_url":"https://api.github.com/users/mikedanese/following{/other_user}","gists_url":"https://api.github.com/users/mikedanese/gists{/gist_id}","starred_url":"https://api.github.com/users/mikedanese/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mikedanese/subscriptions","organizations_url":"https://api.github.com/users/mikedanese/orgs","repos_url":"https://api.github.com/users/mikedanese/repos","events_url":"https://api.github.com/users/mikedanese/events{/privacy}","received_events_url":"https://api.github.com/users/mikedanese/received_events","type":"User","site_admin":false},"assignees":[{"login":"awly","id":1146263,"node_id":"MDQ6VXNlcjExNDYyNjM=","avatar_url":"https://avatars2.githubusercontent.com/u/1146263?v=4","gravatar_id":"","url":"https://api.github.com/users/awly","html_url":"https://github.com/awly","followers_url":"https://api.github.com/users/awly/followers","following_url":"https://api.github.com/users/awly/following{/other_user}","gists_url":"https://api.github.com/users/awly/gists{/gist_id}","starred_url":"https://api.github.com/users/awly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awly/subscriptions","organizations_url":"https://api.github.com/users/awly/orgs","repos_url":"https://api.github.com/users/awly/repos","events_url":"https://api.github.com/users/awly/events{/privacy}","received_events_url":"https://api.github.com/users/awly/received_events","type":"User","site_admin":false},{"login":"mikedanese","id":1787169,"node_id":"MDQ6VXNlcjE3ODcxNjk=","avatar_url":"https://avatars3.githubusercontent.com/u/1787169?v=4","gravatar_id":"","url":"https://api.github.com/users/mikedanese","html_url":"https://github.com/mikedanese","followers_url":"https://api.github.com/users/mikedanese/followers","following_url":"https://api.github.com/users/mikedanese/following{/other_user}","gists_url":"https://api.github.com/users/mikedanese/gists{/gist_id}","starred_url":"https://api.github.com/users/mikedanese/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mikedanese/subscriptions","organizations_url":"https://api.github.com/users/mikedanese/orgs","repos_url":"https://api.github.com/users/mikedanese/repos","events_url":"https://api.github.com/users/mikedanese/events{/privacy}","received_events_url":"https://api.github.com/users/mikedanese/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"spiffxp","id":49258,"node_id":"MDQ6VXNlcjQ5MjU4","avatar_url":"https://avatars2.githubusercontent.com/u/49258?v=4","gravatar_id":"","url":"https://api.github.com/users/spiffxp","html_url":"https://github.com/spiffxp","followers_url":"https://api.github.com/users/spiffxp/followers","following_url":"https://api.github.com/users/spiffxp/following{/other_user}","gists_url":"https://api.github.com/users/spiffxp/gists{/gist_id}","starred_url":"https://api.github.com/users/spiffxp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spiffxp/subscriptions","organizations_url":"https://api.github.com/users/spiffxp/orgs","repos_url":"https://api.github.com/users/spiffxp/repos","events_url":"https://api.github.com/users/spiffxp/events{/privacy}","received_events_url":"https://api.github.com/users/spiffxp/received_events","type":"User","site_admin":false},{"login":"MaciekPytel","id":7901030,"node_id":"MDQ6VXNlcjc5MDEwMzA=","avatar_url":"https://avatars2.githubusercontent.com/u/7901030?v=4","gravatar_id":"","url":"https://api.github.com/users/MaciekPytel","html_url":"https://github.com/MaciekPytel","followers_url":"https://api.github.com/users/MaciekPytel/followers","following_url":"https://api.github.com/users/MaciekPytel/following{/other_user}","gists_url":"https://api.github.com/users/MaciekPytel/gists{/gist_id}","starred_url":"https://api.github.com/users/MaciekPytel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MaciekPytel/subscriptions","organizations_url":"https://api.github.com/users/MaciekPytel/orgs","repos_url":"https://api.github.com/users/MaciekPytel/repos","events_url":"https://api.github.com/users/MaciekPytel/events{/privacy}","received_events_url":"https://api.github.com/users/MaciekPytel/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":349530249,"node_id":"MDU6TGFiZWwzNDk1MzAyNDk=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/release-note-none","name":"release-note-none","color":"c2e0c6","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":253450978,"node_id":"MDU6TGFiZWwyNTM0NTA5Nzg=","url":"https://api.github.com/repos/kubernetes/kubernetes/labels/size/L","name":"size/L","color":"ee9900","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/68379/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/bfda078e763953c15734f7d096d15237b3b3fd81","head":{"label":"immutableT:kms-plugin-via-gke","ref":"kms-plugin-via-gke","sha":"bfda078e763953c15734f7d096d15237b3b3fd81","user":{"login":"immutableT","id":24857912,"node_id":"MDQ6VXNlcjI0ODU3OTEy","avatar_url":"https://avatars1.githubusercontent.com/u/24857912?v=4","gravatar_id":"","url":"https://api.github.com/users/immutableT","html_url":"https://github.com/immutableT","followers_url":"https://api.github.com/users/immutableT/followers","following_url":"https://api.github.com/users/immutableT/following{/other_user}","gists_url":"https://api.github.com/users/immutableT/gists{/gist_id}","starred_url":"https://api.github.com/users/immutableT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immutableT/subscriptions","organizations_url":"https://api.github.com/users/immutableT/orgs","repos_url":"https://api.github.com/users/immutableT/repos","events_url":"https://api.github.com/users/immutableT/events{/privacy}","received_events_url":"https://api.github.com/users/immutableT/received_events","type":"User","site_admin":false},"repo":{"id":110576904,"node_id":"MDEwOlJlcG9zaXRvcnkxMTA1NzY5MDQ=","name":"kubernetes","full_name":"immutableT/kubernetes","owner":{"login":"immutableT","id":24857912,"node_id":"MDQ6VXNlcjI0ODU3OTEy","avatar_url":"https://avatars1.githubusercontent.com/u/24857912?v=4","gravatar_id":"","url":"https://api.github.com/users/immutableT","html_url":"https://github.com/immutableT","followers_url":"https://api.github.com/users/immutableT/followers","following_url":"https://api.github.com/users/immutableT/following{/other_user}","gists_url":"https://api.github.com/users/immutableT/gists{/gist_id}","starred_url":"https://api.github.com/users/immutableT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/immutableT/subscriptions","organizations_url":"https://api.github.com/users/immutableT/orgs","repos_url":"https://api.github.com/users/immutableT/repos","events_url":"https://api.github.com/users/immutableT/events{/privacy}","received_events_url":"https://api.github.com/users/immutableT/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/immutableT/kubernetes","description":"Production-Grade Container Scheduling and Management","fork":true,"url":"https://api.github.com/repos/immutableT/kubernetes","forks_url":"https://api.github.com/repos/immutableT/kubernetes/forks","keys_url":"https://api.github.com/repos/immutableT/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/immutableT/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/immutableT/kubernetes/teams","hooks_url":"https://api.github.com/repos/immutableT/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/immutableT/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/immutableT/kubernetes/events","assignees_url":"https://api.github.com/repos/immutableT/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/immutableT/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/immutableT/kubernetes/tags","blobs_url":"https://api.github.com/repos/immutableT/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/immutableT/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/immutableT/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/immutableT/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/immutableT/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/immutableT/kubernetes/languages","stargazers_url":"https://api.github.com/repos/immutableT/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/immutableT/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/immutableT/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/immutableT/kubernetes/subscription","commits_url":"https://api.github.com/repos/immutableT/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/immutableT/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/immutableT/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/immutableT/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/immutableT/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/immutableT/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/immutableT/kubernetes/merges","archive_url":"https://api.github.com/repos/immutableT/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/immutableT/kubernetes/downloads","issues_url":"https://api.github.com/repos/immutableT/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/immutableT/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/immutableT/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/immutableT/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/immutableT/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/immutableT/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/immutableT/kubernetes/deployments","created_at":"2017-11-13T17:06:59Z","updated_at":"2017-11-13T17:08:06Z","pushed_at":"2018-09-10T18:52:30Z","git_url":"git://github.com/immutableT/kubernetes.git","ssh_url":"git@github.com:immutableT/kubernetes.git","clone_url":"https://github.com/immutableT/kubernetes.git","svn_url":"https://github.com/immutableT/kubernetes","homepage":"http://kubernetes.io","size":579919,"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,"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":"d472a5477705317706b09afc9589bb75496aeb02","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","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},"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":"2018-09-10T20:04:04Z","pushed_at":"2018-09-10T20:47:08Z","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":808227,"stargazers_count":41244,"watchers_count":41244,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14323,"mirror_url":null,"archived":false,"open_issues_count":3124,"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":14323,"open_issues":3124,"watchers":41244,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/68379"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/68379"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/68379/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/68379/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/bfda078e763953c15734f7d096d15237b3b3fd81"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"awly"}}