{"action":"created","comment":{"url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/comments/149997285","pull_request_review_id":75480211,"id":149997285,"diff_hunk":"@@ -0,0 +1,180 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\n+ * contributor license agreements.  See the NOTICE file distributed with\n+ * this work for additional information regarding copyright ownership.\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\n+ * (the \"License\"); you may not use this file except in compliance with\n+ * the License.  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+package org.apache.spark.deploy.k8s.submit.steps\n+\n+import scala.collection.JavaConverters._\n+\n+import io.fabric8.kubernetes.api.model.Service\n+import org.mockito.{Mock, MockitoAnnotations}\n+import org.mockito.Mockito.when\n+import org.scalatest.BeforeAndAfter\n+\n+import org.apache.spark.{SparkConf, SparkFunSuite}\n+import org.apache.spark.deploy.k8s.config._\n+import org.apache.spark.deploy.k8s.constants._\n+import org.apache.spark.util.Clock\n+\n+private[spark] class DriverServiceBootstrapStepSuite\n+    extends SparkFunSuite with BeforeAndAfter {\n+\n+  private val SHORT_RESOURCE_NAME_PREFIX =\n+    \"a\" * (DriverServiceBootstrapStep.MAX_SERVICE_NAME_LENGTH -\n+      DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX.length)\n+\n+  private val LONG_RESOURCE_NAME_PREFIX =\n+    \"a\" * (DriverServiceBootstrapStep.MAX_SERVICE_NAME_LENGTH -\n+      DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX.length + 1)\n+  private val DRIVER_LABELS = Map(\n+    \"label1key\" -> \"label1value\",\n+    \"label2key\" -> \"label2value\")\n+\n+  @Mock\n+  private var clock: Clock = _\n+\n+  private var sparkConf: SparkConf = _\n+\n+  before {\n+    MockitoAnnotations.initMocks(this)\n+    sparkConf = new SparkConf(false)\n+  }\n+\n+  test(\"Headless service has a port for the driver RPC and the block manager.\") {\n+    val configurationStep = new DriverServiceBootstrapStep(\n+      SHORT_RESOURCE_NAME_PREFIX,\n+      DRIVER_LABELS,\n+      sparkConf\n+        .set(\"spark.driver.port\", \"9000\")\n+        .set(org.apache.spark.internal.config.DRIVER_BLOCK_MANAGER_PORT, 8080),\n+      clock)\n+    val baseDriverSpec = KubernetesDriverSpec.initialSpec(sparkConf.clone())\n+    val resolvedDriverSpec = configurationStep.configureDriver(baseDriverSpec)\n+    assert(resolvedDriverSpec.otherKubernetesResources.size === 1)\n+    assert(resolvedDriverSpec.otherKubernetesResources.head.isInstanceOf[Service])\n+    val driverService = resolvedDriverSpec.otherKubernetesResources.head.asInstanceOf[Service]\n+    verifyService(\n+      9000,\n+      8080,\n+      s\"$SHORT_RESOURCE_NAME_PREFIX${DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX}\",\n+      driverService)\n+  }\n+\n+  test(\"Hostname and ports are set according to the service name.\") {\n+    val configurationStep = new DriverServiceBootstrapStep(\n+      SHORT_RESOURCE_NAME_PREFIX,\n+      DRIVER_LABELS,\n+      sparkConf\n+        .set(\"spark.driver.port\", \"9000\")\n+        .set(org.apache.spark.internal.config.DRIVER_BLOCK_MANAGER_PORT, 8080)\n+        .set(KUBERNETES_NAMESPACE, \"my-namespace\"),\n+      clock)\n+    val baseDriverSpec = KubernetesDriverSpec.initialSpec(sparkConf.clone())\n+    val resolvedDriverSpec = configurationStep.configureDriver(baseDriverSpec)\n+    val expectedServiceName = SHORT_RESOURCE_NAME_PREFIX +\n+      DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX\n+    val expectedHostName = s\"$expectedServiceName.my-namespace.svc.cluster.local\"\n+    verifySparkConfHostNames(resolvedDriverSpec.driverSparkConf, expectedHostName)\n+  }\n+\n+  test(\"Ports should resolve to defaults in SparkConf and in the service.\") {\n+    val configurationStep = new DriverServiceBootstrapStep(\n+      SHORT_RESOURCE_NAME_PREFIX,\n+      DRIVER_LABELS,\n+      sparkConf,\n+      clock)\n+    val baseDriverSpec = KubernetesDriverSpec.initialSpec(sparkConf.clone())\n+    val resolvedDriverSpec = configurationStep.configureDriver(baseDriverSpec)\n+    verifyService(\n+      DEFAULT_DRIVER_PORT,\n+      DEFAULT_BLOCKMANAGER_PORT,\n+      s\"$SHORT_RESOURCE_NAME_PREFIX${DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX}\",\n+      resolvedDriverSpec.otherKubernetesResources.head.asInstanceOf[Service])\n+    assert(resolvedDriverSpec.driverSparkConf.get(\"spark.driver.port\") ===\n+      DEFAULT_DRIVER_PORT.toString)\n+    assert(resolvedDriverSpec.driverSparkConf.get(\n+      org.apache.spark.internal.config.DRIVER_BLOCK_MANAGER_PORT) === DEFAULT_BLOCKMANAGER_PORT)\n+  }\n+\n+  test(\"Long prefixes should switch to using a generated name.\") {\n+    val configurationStep = new DriverServiceBootstrapStep(\n+      LONG_RESOURCE_NAME_PREFIX,\n+      DRIVER_LABELS,\n+      sparkConf.set(KUBERNETES_NAMESPACE, \"my-namespace\"),\n+      clock)\n+    when(clock.getTimeMillis()).thenReturn(10000)\n+    val baseDriverSpec = KubernetesDriverSpec.initialSpec(sparkConf.clone())\n+    val resolvedDriverSpec = configurationStep.configureDriver(baseDriverSpec)\n+    val driverService = resolvedDriverSpec.otherKubernetesResources.head.asInstanceOf[Service]\n+    val expectedServiceName = s\"spark-10000${DriverServiceBootstrapStep.DRIVER_SVC_POSTFIX}\"\n+    assert(driverService.getMetadata.getName === expectedServiceName)\n+    val expectedHostName = s\"$expectedServiceName.my-namespace.svc.cluster.local\"\n+    verifySparkConfHostNames(resolvedDriverSpec.driverSparkConf, expectedHostName)\n+  }\n+\n+  test(\"Disallow bind address and driver host to be set explicitly.\") {\n+    val configurationStep = new DriverServiceBootstrapStep(\n+      LONG_RESOURCE_NAME_PREFIX,\n+      DRIVER_LABELS,\n+      sparkConf.set(org.apache.spark.internal.config.DRIVER_BIND_ADDRESS, \"host\"),\n+      clock)\n+    try {\n+      configurationStep.configureDriver(KubernetesDriverSpec.initialSpec(sparkConf))\n+      fail(\"The driver bind address should not be allowed.\")\n+    } catch {\n+      case e: Throwable =>\n+        assert(e.getMessage ===\n+          s\"requirement failed: ${DriverServiceBootstrapStep.DRIVER_BIND_ADDRESS_KEY} is\" +\n+            s\" not supported in Kubernetes mode, as the driver's bind address is managed\" +\n+            s\" and set to the driver pod's IP address.\")\n+    }\n+    sparkConf.remove(org.apache.spark.internal.config.DRIVER_BIND_ADDRESS)\n+    sparkConf.set(org.apache.spark.internal.config.DRIVER_HOST_ADDRESS, \"host\")\n+    try {\n+      configurationStep.configureDriver(KubernetesDriverSpec.initialSpec(sparkConf))\n+      fail(\"The driver host address should not be allowed.\")\n+    } catch {\n+      case e: Throwable =>\n+        assert(e.getMessage ===\n+          s\"requirement failed: ${DriverServiceBootstrapStep.DRIVER_HOST_KEY} is\" +\n+            s\" not supported in Kubernetes mode, as the driver's hostname will be managed via\" +\n+            s\" a Kubernetes service.\")","path":"resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/submit/steps/DriverServiceBootstrapStepSuite.scala","position":153,"original_position":153,"commit_id":"80c0ff2255d555d3fcacbf4fe180cb16c9612cbc","original_commit_id":"80c0ff2255d555d3fcacbf4fe180cb16c9612cbc","user":{"login":"liyinan926","id":3709137,"avatar_url":"https://avatars2.githubusercontent.com/u/3709137?v=4","gravatar_id":"","url":"https://api.github.com/users/liyinan926","html_url":"https://github.com/liyinan926","followers_url":"https://api.github.com/users/liyinan926/followers","following_url":"https://api.github.com/users/liyinan926/following{/other_user}","gists_url":"https://api.github.com/users/liyinan926/gists{/gist_id}","starred_url":"https://api.github.com/users/liyinan926/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/liyinan926/subscriptions","organizations_url":"https://api.github.com/users/liyinan926/orgs","repos_url":"https://api.github.com/users/liyinan926/repos","events_url":"https://api.github.com/users/liyinan926/events{/privacy}","received_events_url":"https://api.github.com/users/liyinan926/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2017-11-09T15:39:17Z","updated_at":"2017-11-09T15:39:17Z","html_url":"https://github.com/apache-spark-on-k8s/spark/pull/545#discussion_r149997285","pull_request_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/comments/149997285"},"html":{"href":"https://github.com/apache-spark-on-k8s/spark/pull/545#discussion_r149997285"},"pull_request":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545"}},"in_reply_to_id":149880128},"pull_request":{"url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545","id":151259221,"html_url":"https://github.com/apache-spark-on-k8s/spark/pull/545","diff_url":"https://github.com/apache-spark-on-k8s/spark/pull/545.diff","patch_url":"https://github.com/apache-spark-on-k8s/spark/pull/545.patch","issue_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/545","number":545,"state":"open","locked":false,"title":"Spark on Kubernetes - basic submission client","user":{"login":"liyinan926","id":3709137,"avatar_url":"https://avatars2.githubusercontent.com/u/3709137?v=4","gravatar_id":"","url":"https://api.github.com/users/liyinan926","html_url":"https://github.com/liyinan926","followers_url":"https://api.github.com/users/liyinan926/followers","following_url":"https://api.github.com/users/liyinan926/following{/other_user}","gists_url":"https://api.github.com/users/liyinan926/gists{/gist_id}","starred_url":"https://api.github.com/users/liyinan926/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/liyinan926/subscriptions","organizations_url":"https://api.github.com/users/liyinan926/orgs","repos_url":"https://api.github.com/users/liyinan926/repos","events_url":"https://api.github.com/users/liyinan926/events{/privacy}","received_events_url":"https://api.github.com/users/liyinan926/received_events","type":"User","site_admin":false},"body":"Second draft upstreaming PR that contains the basic submission client implementation and unit tests. Branch `spark-kubernetes-3-updated` is a clone of `spark-kubernetes-3` with latest changes from `upstream/master` merged in. `spark-kubernetes-4` includes all our changes in `spark-kubernetes-3`.\r\n\r\ncc @foxish @mccheah @apache-spark-on-k8s/contributors\r\n","created_at":"2017-11-07T23:50:02Z","updated_at":"2017-11-09T15:39:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c132d3d6a8ff8a62b08a63bc175e9cf144197577","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kimoonkim","id":5914904,"avatar_url":"https://avatars1.githubusercontent.com/u/5914904?v=4","gravatar_id":"","url":"https://api.github.com/users/kimoonkim","html_url":"https://github.com/kimoonkim","followers_url":"https://api.github.com/users/kimoonkim/followers","following_url":"https://api.github.com/users/kimoonkim/following{/other_user}","gists_url":"https://api.github.com/users/kimoonkim/gists{/gist_id}","starred_url":"https://api.github.com/users/kimoonkim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kimoonkim/subscriptions","organizations_url":"https://api.github.com/users/kimoonkim/orgs","repos_url":"https://api.github.com/users/kimoonkim/repos","events_url":"https://api.github.com/users/kimoonkim/events{/privacy}","received_events_url":"https://api.github.com/users/kimoonkim/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545/commits","review_comments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545/comments","review_comment_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/545/comments","statuses_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/statuses/80c0ff2255d555d3fcacbf4fe180cb16c9612cbc","head":{"label":"apache-spark-on-k8s:spark-kubernetes-4","ref":"spark-kubernetes-4","sha":"80c0ff2255d555d3fcacbf4fe180cb16c9612cbc","user":{"login":"apache-spark-on-k8s","id":24321138,"avatar_url":"https://avatars1.githubusercontent.com/u/24321138?v=4","gravatar_id":"","url":"https://api.github.com/users/apache-spark-on-k8s","html_url":"https://github.com/apache-spark-on-k8s","followers_url":"https://api.github.com/users/apache-spark-on-k8s/followers","following_url":"https://api.github.com/users/apache-spark-on-k8s/following{/other_user}","gists_url":"https://api.github.com/users/apache-spark-on-k8s/gists{/gist_id}","starred_url":"https://api.github.com/users/apache-spark-on-k8s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache-spark-on-k8s/subscriptions","organizations_url":"https://api.github.com/users/apache-spark-on-k8s/orgs","repos_url":"https://api.github.com/users/apache-spark-on-k8s/repos","events_url":"https://api.github.com/users/apache-spark-on-k8s/events{/privacy}","received_events_url":"https://api.github.com/users/apache-spark-on-k8s/received_events","type":"Organization","site_admin":false},"repo":{"id":75415639,"name":"spark","full_name":"apache-spark-on-k8s/spark","owner":{"login":"apache-spark-on-k8s","id":24321138,"avatar_url":"https://avatars1.githubusercontent.com/u/24321138?v=4","gravatar_id":"","url":"https://api.github.com/users/apache-spark-on-k8s","html_url":"https://github.com/apache-spark-on-k8s","followers_url":"https://api.github.com/users/apache-spark-on-k8s/followers","following_url":"https://api.github.com/users/apache-spark-on-k8s/following{/other_user}","gists_url":"https://api.github.com/users/apache-spark-on-k8s/gists{/gist_id}","starred_url":"https://api.github.com/users/apache-spark-on-k8s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache-spark-on-k8s/subscriptions","organizations_url":"https://api.github.com/users/apache-spark-on-k8s/orgs","repos_url":"https://api.github.com/users/apache-spark-on-k8s/repos","events_url":"https://api.github.com/users/apache-spark-on-k8s/events{/privacy}","received_events_url":"https://api.github.com/users/apache-spark-on-k8s/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache-spark-on-k8s/spark","description":"Apache Spark enhanced with native Kubernetes scheduler back-end","fork":true,"url":"https://api.github.com/repos/apache-spark-on-k8s/spark","forks_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/forks","keys_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/teams","hooks_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/hooks","issue_events_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/events{/number}","events_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/events","assignees_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/assignees{/user}","branches_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/branches{/branch}","tags_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/tags","blobs_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/languages","stargazers_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/stargazers","contributors_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/contributors","subscribers_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/subscribers","subscription_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/subscription","commits_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/contents/{+path}","compare_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/merges","archive_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/downloads","issues_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues{/number}","pulls_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/labels{/name}","releases_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/releases{/id}","deployments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/deployments","created_at":"2016-12-02T17:15:19Z","updated_at":"2017-11-09T00:15:26Z","pushed_at":"2017-11-09T00:18:35Z","git_url":"git://github.com/apache-spark-on-k8s/spark.git","ssh_url":"git@github.com:apache-spark-on-k8s/spark.git","clone_url":"https://github.com/apache-spark-on-k8s/spark.git","svn_url":"https://github.com/apache-spark-on-k8s/spark","homepage":"","size":267059,"stargazers_count":271,"watchers_count":271,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":58,"mirror_url":null,"archived":false,"open_issues_count":127,"forks":58,"open_issues":127,"watchers":271,"default_branch":"branch-2.2-kubernetes"}},"base":{"label":"apache-spark-on-k8s:spark-kubernetes-3-updated","ref":"spark-kubernetes-3-updated","sha":"aa1b3463037e8ec534eb7dfca199a069e94752ac","user":{"login":"apache-spark-on-k8s","id":24321138,"avatar_url":"https://avatars1.githubusercontent.com/u/24321138?v=4","gravatar_id":"","url":"https://api.github.com/users/apache-spark-on-k8s","html_url":"https://github.com/apache-spark-on-k8s","followers_url":"https://api.github.com/users/apache-spark-on-k8s/followers","following_url":"https://api.github.com/users/apache-spark-on-k8s/following{/other_user}","gists_url":"https://api.github.com/users/apache-spark-on-k8s/gists{/gist_id}","starred_url":"https://api.github.com/users/apache-spark-on-k8s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache-spark-on-k8s/subscriptions","organizations_url":"https://api.github.com/users/apache-spark-on-k8s/orgs","repos_url":"https://api.github.com/users/apache-spark-on-k8s/repos","events_url":"https://api.github.com/users/apache-spark-on-k8s/events{/privacy}","received_events_url":"https://api.github.com/users/apache-spark-on-k8s/received_events","type":"Organization","site_admin":false},"repo":{"id":75415639,"name":"spark","full_name":"apache-spark-on-k8s/spark","owner":{"login":"apache-spark-on-k8s","id":24321138,"avatar_url":"https://avatars1.githubusercontent.com/u/24321138?v=4","gravatar_id":"","url":"https://api.github.com/users/apache-spark-on-k8s","html_url":"https://github.com/apache-spark-on-k8s","followers_url":"https://api.github.com/users/apache-spark-on-k8s/followers","following_url":"https://api.github.com/users/apache-spark-on-k8s/following{/other_user}","gists_url":"https://api.github.com/users/apache-spark-on-k8s/gists{/gist_id}","starred_url":"https://api.github.com/users/apache-spark-on-k8s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache-spark-on-k8s/subscriptions","organizations_url":"https://api.github.com/users/apache-spark-on-k8s/orgs","repos_url":"https://api.github.com/users/apache-spark-on-k8s/repos","events_url":"https://api.github.com/users/apache-spark-on-k8s/events{/privacy}","received_events_url":"https://api.github.com/users/apache-spark-on-k8s/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache-spark-on-k8s/spark","description":"Apache Spark enhanced with native Kubernetes scheduler back-end","fork":true,"url":"https://api.github.com/repos/apache-spark-on-k8s/spark","forks_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/forks","keys_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/teams","hooks_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/hooks","issue_events_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/events{/number}","events_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/events","assignees_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/assignees{/user}","branches_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/branches{/branch}","tags_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/tags","blobs_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/languages","stargazers_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/stargazers","contributors_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/contributors","subscribers_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/subscribers","subscription_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/subscription","commits_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/contents/{+path}","compare_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/merges","archive_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/downloads","issues_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues{/number}","pulls_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/labels{/name}","releases_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/releases{/id}","deployments_url":"https://api.github.com/repos/apache-spark-on-k8s/spark/deployments","created_at":"2016-12-02T17:15:19Z","updated_at":"2017-11-09T00:15:26Z","pushed_at":"2017-11-09T00:18:35Z","git_url":"git://github.com/apache-spark-on-k8s/spark.git","ssh_url":"git@github.com:apache-spark-on-k8s/spark.git","clone_url":"https://github.com/apache-spark-on-k8s/spark.git","svn_url":"https://github.com/apache-spark-on-k8s/spark","homepage":"","size":267059,"stargazers_count":271,"watchers_count":271,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":58,"mirror_url":null,"archived":false,"open_issues_count":127,"forks":58,"open_issues":127,"watchers":271,"default_branch":"branch-2.2-kubernetes"}},"_links":{"self":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545"},"html":{"href":"https://github.com/apache-spark-on-k8s/spark/pull/545"},"issue":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/545"},"comments":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/issues/545/comments"},"review_comments":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545/comments"},"review_comment":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/pulls/545/commits"},"statuses":{"href":"https://api.github.com/repos/apache-spark-on-k8s/spark/statuses/80c0ff2255d555d3fcacbf4fe180cb16c9612cbc"}},"author_association":"OWNER"}}
{"actor":{"display_login":"liyinan926"}}