{"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/23802934","id":23802934,"diff_hunk":"@@ -0,0 +1,201 @@\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+\n+package org.apache.spark.deploy.rest\n+\n+import scala.collection.Map\n+import scala.collection.JavaConversions._\n+\n+import org.json4s.jackson.JsonMethods._\n+import org.json4s.JsonAST._\n+\n+import org.apache.spark.Logging\n+import org.apache.spark.util.Utils\n+\n+/**\n+ * A general message exchanged in the stable application submission REST protocol.\n+ *\n+ * The message is represented by a set of fields in the form of key value pairs.\n+ * Each message must contain an ACTION field, which fully specifies the type of the message.\n+ * For compatibility with older versions of Spark, existing fields must not be removed or\n+ * modified, though new fields can be added as necessary.\n+ */\n+private[spark] abstract class SubmitRestProtocolMessage(\n+    action: SubmitRestProtocolAction,\n+    actionField: ActionField,\n+    requiredFields: Seq[SubmitRestProtocolField]) {\n+\n+  // Maintain the insert order for converting to JSON later\n+  private val fields = new java.util.LinkedHashMap[SubmitRestProtocolField, String]\n+  val className = Utils.getFormattedClassName(this)\n+\n+  // Set the action field\n+  fields.put(actionField, action.toString)\n+\n+  /** Return all fields currently set in this message. */\n+  def getFields: Map[SubmitRestProtocolField, String] = fields.toMap","path":"core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala","position":50,"original_position":50,"commit_id":"d7a1f9fbb586035a53ea0a22f6703d11ed3818db","original_commit_id":"d7a1f9fbb586035a53ea0a22f6703d11ed3818db","user":{"login":"vanzin","id":1694083,"avatar_url":"https://avatars.githubusercontent.com/u/1694083?v=3","gravatar_id":"","url":"https://api.github.com/users/vanzin","html_url":"https://github.com/vanzin","followers_url":"https://api.github.com/users/vanzin/followers","following_url":"https://api.github.com/users/vanzin/following{/other_user}","gists_url":"https://api.github.com/users/vanzin/gists{/gist_id}","starred_url":"https://api.github.com/users/vanzin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vanzin/subscriptions","organizations_url":"https://api.github.com/users/vanzin/orgs","repos_url":"https://api.github.com/users/vanzin/repos","events_url":"https://api.github.com/users/vanzin/events{/privacy}","received_events_url":"https://api.github.com/users/vanzin/received_events","type":"User","site_admin":false},"body":"> Is that how we have been doing it in Spark for all json serialization? Are you suggesting we should change all of them?\r\nI'd love to have the existing JSON serializers in Spark use something like Jackson. `JsonProtocol.scala` is an abomination and a maintenance nightmare. (/imho)\r\n\r\nBTW, as Matei requested, we should discuss the protocol in the bug. We're reviewing the code here.","created_at":"2015-01-29T21:12:31Z","updated_at":"2015-01-29T21:12:31Z","html_url":"https://github.com/apache/spark/pull/4216#discussion_r23802934","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/4216","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/23802934"},"html":{"href":"https://github.com/apache/spark/pull/4216#discussion_r23802934"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/4216"}}},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/4216","id":28078969,"html_url":"https://github.com/apache/spark/pull/4216","diff_url":"https://github.com/apache/spark/pull/4216.diff","patch_url":"https://github.com/apache/spark/pull/4216.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/4216","number":4216,"state":"open","locked":false,"title":"[SPARK-5388] Provide a stable application submission gateway","user":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"body":"The goal is to provide a stable application submission gateway that is not inherently based on Akka, which is unstable across versions. This PR targets standalone cluster mode, but is implemented in a general enough manner to be extended to other modes in the future. Client mode is currently not included in the changes here because there are many more Akka messages exchanged there.\r\n\r\nAs of the changes here, the Master will advertise two ports, 7077 and 17077. We need to keep around the old one (7077) for client mode and older versions of Spark submit. However, all new versions of Spark submit will use the REST gateway (17077).\r\n\r\nBy the way this includes ~700 lines of tests.","created_at":"2015-01-27T02:26:15Z","updated_at":"2015-01-29T21:12:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cb982218f91d94b3095c93daac87c24d5113930a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/4216/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/4216/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments/{number}","comments_url":"https://api.github.com/repos/apache/spark/issues/4216/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/d7a1f9fbb586035a53ea0a22f6703d11ed3818db","head":{"label":"andrewor14:rest","ref":"rest","sha":"d7a1f9fbb586035a53ea0a22f6703d11ed3818db","user":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"repo":{"id":17231517,"name":"spark","full_name":"andrewor14/spark","owner":{"login":"andrewor14","id":2133137,"avatar_url":"https://avatars.githubusercontent.com/u/2133137?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewor14","html_url":"https://github.com/andrewor14","followers_url":"https://api.github.com/users/andrewor14/followers","following_url":"https://api.github.com/users/andrewor14/following{/other_user}","gists_url":"https://api.github.com/users/andrewor14/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewor14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewor14/subscriptions","organizations_url":"https://api.github.com/users/andrewor14/orgs","repos_url":"https://api.github.com/users/andrewor14/repos","events_url":"https://api.github.com/users/andrewor14/events{/privacy}","received_events_url":"https://api.github.com/users/andrewor14/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/andrewor14/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/andrewor14/spark","forks_url":"https://api.github.com/repos/andrewor14/spark/forks","keys_url":"https://api.github.com/repos/andrewor14/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andrewor14/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andrewor14/spark/teams","hooks_url":"https://api.github.com/repos/andrewor14/spark/hooks","issue_events_url":"https://api.github.com/repos/andrewor14/spark/issues/events{/number}","events_url":"https://api.github.com/repos/andrewor14/spark/events","assignees_url":"https://api.github.com/repos/andrewor14/spark/assignees{/user}","branches_url":"https://api.github.com/repos/andrewor14/spark/branches{/branch}","tags_url":"https://api.github.com/repos/andrewor14/spark/tags","blobs_url":"https://api.github.com/repos/andrewor14/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andrewor14/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andrewor14/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/andrewor14/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andrewor14/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/andrewor14/spark/languages","stargazers_url":"https://api.github.com/repos/andrewor14/spark/stargazers","contributors_url":"https://api.github.com/repos/andrewor14/spark/contributors","subscribers_url":"https://api.github.com/repos/andrewor14/spark/subscribers","subscription_url":"https://api.github.com/repos/andrewor14/spark/subscription","commits_url":"https://api.github.com/repos/andrewor14/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/andrewor14/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/andrewor14/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/andrewor14/spark/issues/comments/{number}","contents_url":"https://api.github.com/repos/andrewor14/spark/contents/{+path}","compare_url":"https://api.github.com/repos/andrewor14/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andrewor14/spark/merges","archive_url":"https://api.github.com/repos/andrewor14/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andrewor14/spark/downloads","issues_url":"https://api.github.com/repos/andrewor14/spark/issues{/number}","pulls_url":"https://api.github.com/repos/andrewor14/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/andrewor14/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/andrewor14/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andrewor14/spark/labels{/name}","releases_url":"https://api.github.com/repos/andrewor14/spark/releases{/id}","created_at":"2014-02-27T00:52:37Z","updated_at":"2015-01-28T19:10:48Z","pushed_at":"2015-01-29T04:07:01Z","git_url":"git://github.com/andrewor14/spark.git","ssh_url":"git@github.com:andrewor14/spark.git","clone_url":"https://github.com/andrewor14/spark.git","svn_url":"https://github.com/andrewor14/spark","homepage":null,"size":92673,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"622ff09d036b40caa4c177508e8a948beccfd88f","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":17165658,"name":"spark","full_name":"apache/spark","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/spark","description":"Mirror of Apache Spark","fork":false,"url":"https://api.github.com/repos/apache/spark","forks_url":"https://api.github.com/repos/apache/spark/forks","keys_url":"https://api.github.com/repos/apache/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/spark/teams","hooks_url":"https://api.github.com/repos/apache/spark/hooks","issue_events_url":"https://api.github.com/repos/apache/spark/issues/events{/number}","events_url":"https://api.github.com/repos/apache/spark/events","assignees_url":"https://api.github.com/repos/apache/spark/assignees{/user}","branches_url":"https://api.github.com/repos/apache/spark/branches{/branch}","tags_url":"https://api.github.com/repos/apache/spark/tags","blobs_url":"https://api.github.com/repos/apache/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/spark/languages","stargazers_url":"https://api.github.com/repos/apache/spark/stargazers","contributors_url":"https://api.github.com/repos/apache/spark/contributors","subscribers_url":"https://api.github.com/repos/apache/spark/subscribers","subscription_url":"https://api.github.com/repos/apache/spark/subscription","commits_url":"https://api.github.com/repos/apache/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/spark/issues/comments/{number}","contents_url":"https://api.github.com/repos/apache/spark/contents/{+path}","compare_url":"https://api.github.com/repos/apache/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/spark/merges","archive_url":"https://api.github.com/repos/apache/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/spark/downloads","issues_url":"https://api.github.com/repos/apache/spark/issues{/number}","pulls_url":"https://api.github.com/repos/apache/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/spark/labels{/name}","releases_url":"https://api.github.com/repos/apache/spark/releases{/id}","created_at":"2014-02-25T08:00:08Z","updated_at":"2015-01-29T21:01:10Z","pushed_at":"2015-01-29T21:01:10Z","git_url":"git://github.com/apache/spark.git","ssh_url":"git@github.com:apache/spark.git","clone_url":"https://github.com/apache/spark.git","svn_url":"https://github.com/apache/spark","homepage":null,"size":1169771,"stargazers_count":2691,"watchers_count":2691,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2376,"mirror_url":"git://git.apache.org/spark.git","open_issues_count":334,"forks":2376,"open_issues":334,"watchers":2691,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/4216"},"html":{"href":"https://github.com/apache/spark/pull/4216"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/4216"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/4216/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/4216/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/4216/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/d7a1f9fbb586035a53ea0a22f6703d11ed3818db"}}}}