{"action":"created","comment":{"url":"https://api.github.com/repos/mesosphere/marathon/pulls/comments/230128067","pull_request_review_id":170794797,"id":230128067,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMDEyODA2Nw==","diff_hunk":"@@ -0,0 +1,175 @@\n+package mesosphere.marathon\n+package storage.migration\n+\n+import java.time.OffsetDateTime\n+\n+import akka.Done\n+import akka.http.scaladsl.unmarshalling.Unmarshaller\n+import akka.stream.Materializer\n+import akka.stream.scaladsl.{Flow, Sink}\n+import com.typesafe.scalalogging.StrictLogging\n+import mesosphere.marathon.api.v2.json.Formats\n+import mesosphere.marathon.core.condition.Condition\n+import mesosphere.marathon.core.instance.{Goal, Instance, Reservation}\n+import mesosphere.marathon.core.instance.Instance.{AgentInfo, Id, InstanceState}\n+import mesosphere.marathon.core.storage.store.impl.zk.{ZkId, ZkSerialized}\n+import mesosphere.marathon.core.storage.store.{IdResolver, PersistenceStore}\n+import mesosphere.marathon.core.task.Task\n+import mesosphere.marathon.core.task.state.NetworkInfo\n+import mesosphere.marathon.raml\n+import mesosphere.marathon.raml.Raml\n+import mesosphere.marathon.state.{Timestamp, UnreachableStrategy}\n+import mesosphere.marathon.storage.repository.InstanceRepository\n+import play.api.libs.json._\n+import play.api.libs.functional.syntax._\n+import play.api.libs.json.Reads._\n+import org.apache.mesos.{Protos => MesosProtos}\n+\n+import scala.concurrent.{ExecutionContext, Future}\n+\n+class MigrationTo18(instanceRepository: InstanceRepository, persistenceStore: PersistenceStore[_, _, _]) extends MigrationStep with StrictLogging {\n+\n+  override def migrate()(implicit ctx: ExecutionContext, mat: Materializer): Future[Done] = {\n+    MigrationTo18.migrateInstanceConditions(instanceRepository, persistenceStore)\n+  }\n+}\n+\n+object MigrationTo18 extends MaybeStore with StrictLogging {\n+\n+  import Instance.agentFormat\n+  import mesosphere.marathon.api.v2.json.Formats.TimestampFormat\n+\n+  val migrationConditionReader = new Reads[Condition] {\n+    private def readString(j: JsReadable) = j.validate[String].map {\n+\n+      case created if created.toLowerCase == \"created\" => Condition.Provisioned\n+      case other => Condition(other)\n+    }\n+    override def reads(json: JsValue): JsResult[Condition] =\n+      readString(json).orElse {\n+        json.validate[JsObject].flatMap { obj => readString(obj \\ \"str\") }\n+      }\n+  }\n+\n+  /**\n+    * Read format for instance state where we replace created condition to provisioned.\n+    */\n+  val instanceStateReads17: Reads[InstanceState] = {\n+    (\n+      (__ \\ \"condition\").read[Condition](migrationConditionReader) ~\n+      (__ \\ \"since\").read[Timestamp] ~\n+      (__ \\ \"activeSince\").readNullable[Timestamp] ~\n+      (__ \\ \"healthy\").readNullable[Boolean] ~\n+      (__ \\ \"goal\").read[Goal]\n+    ) { (condition, since, activeSince, healthy, goal) =>\n+        InstanceState(condition, since, activeSince, healthy, goal)\n+      }\n+  }\n+\n+  val taskStatusReads17: Reads[Task.Status] = {\n+    (\n+      (__ \\ \"stagedAt\").read[Timestamp] ~\n+      (__ \\ \"startedAt\").readNullable[Timestamp] ~\n+      (__ \\ \"mesosStatus\").readNullable[MesosProtos.TaskStatus](Task.Status.MesosTaskStatusFormat) ~\n+      (__ \\ \"condition\").read[Condition](migrationConditionReader) ~\n+      (__ \\ \"networkInfo\").read[NetworkInfo](Formats.TaskStatusNetworkInfoFormat)\n+\n+    ) { (stagedAt, startedAt, mesosStatus, condition, networkInfo) =>\n+        Task.Status(stagedAt, startedAt, mesosStatus, condition, networkInfo)\n+      }\n+  }\n+\n+  val taskReads17: Reads[Task] = {\n+    (\n+      (__ \\ \"taskId\").read[Task.Id] ~\n+      (__ \\ \"runSpecVersion\").read[Timestamp] ~\n+      (__ \\ \"status\").read[Task.Status](taskStatusReads17)\n+    ) { (taskId, runSpecVersion, status) =>\n+        Task(taskId, runSpecVersion, status)\n+      }\n+  }\n+\n+  val taskMapReads17: Reads[Map[Task.Id, Task]] = {\n+    mapReads(taskReads17).map {\n+      _.map { case (k, v) => Task.Id(k) -> v }\n+    }\n+  }\n+\n+  /**\n+    * Read format for old instance without goal.\n+    */\n+  val instanceJsonReads17: Reads[Instance] = {\n+    (\n+      (__ \\ \"instanceId\").read[Instance.Id] ~\n+      (__ \\ \"agentInfo\").read[AgentInfo] ~\n+      (__ \\ \"tasksMap\").read[Map[Task.Id, Task]](taskMapReads17) ~\n+      (__ \\ \"runSpecVersion\").read[Timestamp] ~\n+      (__ \\ \"state\").read[InstanceState](instanceStateReads17) ~\n+      (__ \\ \"unreachableStrategy\").readNullable[raml.UnreachableStrategy] ~\n+      (__ \\ \"reservation\").readNullable[Reservation]\n+    ) { (instanceId, agentInfo, tasksMap, runSpecVersion, state, ramlUnreachableStrategy, reservation) =>\n+        val unreachableStrategy = ramlUnreachableStrategy.\n+          map(Raml.fromRaml(_)).getOrElse(UnreachableStrategy.default())\n+        new Instance(instanceId, Some(agentInfo), state, tasksMap, runSpecVersion, unreachableStrategy, reservation)\n+      }\n+  }\n+\n+  implicit val instanceResolver: IdResolver[Instance.Id, JsValue, String, ZkId] =\n+    new IdResolver[Instance.Id, JsValue, String, ZkId] {\n+      override def toStorageId(id: Id, version: Option[OffsetDateTime]): ZkId =\n+        ZkId(category, id.idString, version)\n+\n+      override val category: String = \"instance\"\n+\n+      override def fromStorageId(key: ZkId): Id = Instance.Id.fromIdString(key.id)\n+\n+      override val hasVersions: Boolean = false\n+\n+      override def version(v: JsValue): OffsetDateTime = OffsetDateTime.MIN\n+    }\n+\n+  implicit val instanceJsonUnmarshaller: Unmarshaller[ZkSerialized, JsValue] =\n+    Unmarshaller.strict {\n+      case ZkSerialized(byteString) =>\n+        Json.parse(byteString.utf8String)\n+    }\n+\n+  /**\n+    * This function traverses all instances in ZK and sets the instance goal field.\n+    */\n+  def migrateInstanceConditions(instanceRepository: InstanceRepository, persistenceStore: PersistenceStore[_, _, _])(implicit mat: Materializer): Future[Done] = {\n+\n+    logger.info(\"Starting instance condition migration\")\n+\n+    maybeStore(persistenceStore).map { store =>\n+      instanceRepository\n+        .ids()\n+        .mapAsync(1) { instanceId =>\n+          store.get[Instance.Id, JsValue](instanceId)\n+        }\n+        .via(migrationFlow)\n+        .mapAsync(1) { updatedInstance =>\n+          instanceRepository.store(updatedInstance)\n+        }\n+        .runWith(Sink.ignore)\n+    } getOrElse {\n+      Future.successful(Done)\n+    }\n+  }\n+\n+  /**\n+    * Extract instance from old format with replaced condition.\n+    * @param jsValue The instance as JSON.\n+    * @return The parsed instance.\n+    */\n+  def extractInstanceFromJson(jsValue: JsValue): Instance = jsValue.as[Instance](instanceJsonReads17)\n+\n+  // This flow parses all provided instances and updates their goals. It does not save the updated instances.\n+  val migrationFlow = Flow[Option[JsValue]]\n+    .mapConcat {\n+      case Some(jsValue) =>\n+        List(extractInstanceFromJson(jsValue))","path":"src/main/scala/mesosphere/marathon/storage/migration/MigrationTo18.scala","position":null,"original_position":171,"commit_id":"b58e690ff36b034541c93b0bbf33d6ee15c20bce","original_commit_id":"64a7cc4997c1397c56d522d81f52d4738d2d2be6","user":{"login":"meln1k","id":1043441,"node_id":"MDQ6VXNlcjEwNDM0NDE=","avatar_url":"https://avatars1.githubusercontent.com/u/1043441?v=4","gravatar_id":"","url":"https://api.github.com/users/meln1k","html_url":"https://github.com/meln1k","followers_url":"https://api.github.com/users/meln1k/followers","following_url":"https://api.github.com/users/meln1k/following{/other_user}","gists_url":"https://api.github.com/users/meln1k/gists{/gist_id}","starred_url":"https://api.github.com/users/meln1k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meln1k/subscriptions","organizations_url":"https://api.github.com/users/meln1k/orgs","repos_url":"https://api.github.com/users/meln1k/repos","events_url":"https://api.github.com/users/meln1k/events{/privacy}","received_events_url":"https://api.github.com/users/meln1k/received_events","type":"User","site_admin":false},"body":"the problem is that scala `Option` is not an `Iterable`, and we still need to transform it into List.","created_at":"2018-11-01T17:30:30Z","updated_at":"2018-11-01T17:30:31Z","html_url":"https://github.com/mesosphere/marathon/pull/6612#discussion_r230128067","pull_request_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6612","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/comments/230128067"},"html":{"href":"https://github.com/mesosphere/marathon/pull/6612#discussion_r230128067"},"pull_request":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6612"}},"in_reply_to_id":228894138},"pull_request":{"url":"https://api.github.com/repos/mesosphere/marathon/pulls/6612","id":222142365,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIyMTQyMzY1","html_url":"https://github.com/mesosphere/marathon/pull/6612","diff_url":"https://github.com/mesosphere/marathon/pull/6612.diff","patch_url":"https://github.com/mesosphere/marathon/pull/6612.patch","issue_url":"https://api.github.com/repos/mesosphere/marathon/issues/6612","number":6612,"state":"open","locked":false,"title":"Remove Created condition","user":{"login":"meln1k","id":1043441,"node_id":"MDQ6VXNlcjEwNDM0NDE=","avatar_url":"https://avatars1.githubusercontent.com/u/1043441?v=4","gravatar_id":"","url":"https://api.github.com/users/meln1k","html_url":"https://github.com/meln1k","followers_url":"https://api.github.com/users/meln1k/followers","following_url":"https://api.github.com/users/meln1k/following{/other_user}","gists_url":"https://api.github.com/users/meln1k/gists{/gist_id}","starred_url":"https://api.github.com/users/meln1k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meln1k/subscriptions","organizations_url":"https://api.github.com/users/meln1k/orgs","repos_url":"https://api.github.com/users/meln1k/repos","events_url":"https://api.github.com/users/meln1k/events{/privacy}","received_events_url":"https://api.github.com/users/meln1k/received_events","type":"User","site_admin":false},"body":"Summary:\r\nFor legacy reasons we have 2 condition which are doing basically the same thing:\r\nCreated: Task is known in marathon and sent to Mesos, but not staged yet\r\nProvisioned: An offer for task has been accepted but Mesos did not start the task yet.\r\n\r\nIn this PR Created condition is removed and only provisioned is left\r\n\r\nJIRA issues: MARATHON-8240\r\n","created_at":"2018-10-11T13:40:38Z","updated_at":"2018-11-01T17:30:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"97cb20e31808b5504e1b870b9ad350d72d35b153","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6612/commits","review_comments_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6612/comments","review_comment_url":"https://api.github.com/repos/mesosphere/marathon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mesosphere/marathon/issues/6612/comments","statuses_url":"https://api.github.com/repos/mesosphere/marathon/statuses/b58e690ff36b034541c93b0bbf33d6ee15c20bce","head":{"label":"mesosphere:nm/created-condition-removed","ref":"nm/created-condition-removed","sha":"b58e690ff36b034541c93b0bbf33d6ee15c20bce","user":{"login":"mesosphere","id":3458585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NTg1ODU=","avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"repo":{"id":10941409,"node_id":"MDEwOlJlcG9zaXRvcnkxMDk0MTQwOQ==","name":"marathon","full_name":"mesosphere/marathon","private":false,"owner":{"login":"mesosphere","id":3458585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NTg1ODU=","avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mesosphere/marathon","description":"Deploy and manage containers (including Docker) on top of Apache Mesos at scale.","fork":false,"url":"https://api.github.com/repos/mesosphere/marathon","forks_url":"https://api.github.com/repos/mesosphere/marathon/forks","keys_url":"https://api.github.com/repos/mesosphere/marathon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mesosphere/marathon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mesosphere/marathon/teams","hooks_url":"https://api.github.com/repos/mesosphere/marathon/hooks","issue_events_url":"https://api.github.com/repos/mesosphere/marathon/issues/events{/number}","events_url":"https://api.github.com/repos/mesosphere/marathon/events","assignees_url":"https://api.github.com/repos/mesosphere/marathon/assignees{/user}","branches_url":"https://api.github.com/repos/mesosphere/marathon/branches{/branch}","tags_url":"https://api.github.com/repos/mesosphere/marathon/tags","blobs_url":"https://api.github.com/repos/mesosphere/marathon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mesosphere/marathon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mesosphere/marathon/git/refs{/sha}","trees_url":"https://api.github.com/repos/mesosphere/marathon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mesosphere/marathon/statuses/{sha}","languages_url":"https://api.github.com/repos/mesosphere/marathon/languages","stargazers_url":"https://api.github.com/repos/mesosphere/marathon/stargazers","contributors_url":"https://api.github.com/repos/mesosphere/marathon/contributors","subscribers_url":"https://api.github.com/repos/mesosphere/marathon/subscribers","subscription_url":"https://api.github.com/repos/mesosphere/marathon/subscription","commits_url":"https://api.github.com/repos/mesosphere/marathon/commits{/sha}","git_commits_url":"https://api.github.com/repos/mesosphere/marathon/git/commits{/sha}","comments_url":"https://api.github.com/repos/mesosphere/marathon/comments{/number}","issue_comment_url":"https://api.github.com/repos/mesosphere/marathon/issues/comments{/number}","contents_url":"https://api.github.com/repos/mesosphere/marathon/contents/{+path}","compare_url":"https://api.github.com/repos/mesosphere/marathon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mesosphere/marathon/merges","archive_url":"https://api.github.com/repos/mesosphere/marathon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mesosphere/marathon/downloads","issues_url":"https://api.github.com/repos/mesosphere/marathon/issues{/number}","pulls_url":"https://api.github.com/repos/mesosphere/marathon/pulls{/number}","milestones_url":"https://api.github.com/repos/mesosphere/marathon/milestones{/number}","notifications_url":"https://api.github.com/repos/mesosphere/marathon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mesosphere/marathon/labels{/name}","releases_url":"https://api.github.com/repos/mesosphere/marathon/releases{/id}","deployments_url":"https://api.github.com/repos/mesosphere/marathon/deployments","created_at":"2013-06-25T14:56:34Z","updated_at":"2018-11-01T17:28:39Z","pushed_at":"2018-11-01T17:28:35Z","git_url":"git://github.com/mesosphere/marathon.git","ssh_url":"git@github.com:mesosphere/marathon.git","clone_url":"https://github.com/mesosphere/marathon.git","svn_url":"https://github.com/mesosphere/marathon","homepage":"https://mesosphere.github.io/marathon/","size":38637,"stargazers_count":3747,"watchers_count":3747,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":860,"mirror_url":null,"archived":false,"open_issues_count":16,"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":860,"open_issues":16,"watchers":3747,"default_branch":"master"}},"base":{"label":"mesosphere:master","ref":"master","sha":"9ec5fc65edead28936c39d6986170ab65da6eaa2","user":{"login":"mesosphere","id":3458585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NTg1ODU=","avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"repo":{"id":10941409,"node_id":"MDEwOlJlcG9zaXRvcnkxMDk0MTQwOQ==","name":"marathon","full_name":"mesosphere/marathon","private":false,"owner":{"login":"mesosphere","id":3458585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0NTg1ODU=","avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mesosphere/marathon","description":"Deploy and manage containers (including Docker) on top of Apache Mesos at scale.","fork":false,"url":"https://api.github.com/repos/mesosphere/marathon","forks_url":"https://api.github.com/repos/mesosphere/marathon/forks","keys_url":"https://api.github.com/repos/mesosphere/marathon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mesosphere/marathon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mesosphere/marathon/teams","hooks_url":"https://api.github.com/repos/mesosphere/marathon/hooks","issue_events_url":"https://api.github.com/repos/mesosphere/marathon/issues/events{/number}","events_url":"https://api.github.com/repos/mesosphere/marathon/events","assignees_url":"https://api.github.com/repos/mesosphere/marathon/assignees{/user}","branches_url":"https://api.github.com/repos/mesosphere/marathon/branches{/branch}","tags_url":"https://api.github.com/repos/mesosphere/marathon/tags","blobs_url":"https://api.github.com/repos/mesosphere/marathon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mesosphere/marathon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mesosphere/marathon/git/refs{/sha}","trees_url":"https://api.github.com/repos/mesosphere/marathon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mesosphere/marathon/statuses/{sha}","languages_url":"https://api.github.com/repos/mesosphere/marathon/languages","stargazers_url":"https://api.github.com/repos/mesosphere/marathon/stargazers","contributors_url":"https://api.github.com/repos/mesosphere/marathon/contributors","subscribers_url":"https://api.github.com/repos/mesosphere/marathon/subscribers","subscription_url":"https://api.github.com/repos/mesosphere/marathon/subscription","commits_url":"https://api.github.com/repos/mesosphere/marathon/commits{/sha}","git_commits_url":"https://api.github.com/repos/mesosphere/marathon/git/commits{/sha}","comments_url":"https://api.github.com/repos/mesosphere/marathon/comments{/number}","issue_comment_url":"https://api.github.com/repos/mesosphere/marathon/issues/comments{/number}","contents_url":"https://api.github.com/repos/mesosphere/marathon/contents/{+path}","compare_url":"https://api.github.com/repos/mesosphere/marathon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mesosphere/marathon/merges","archive_url":"https://api.github.com/repos/mesosphere/marathon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mesosphere/marathon/downloads","issues_url":"https://api.github.com/repos/mesosphere/marathon/issues{/number}","pulls_url":"https://api.github.com/repos/mesosphere/marathon/pulls{/number}","milestones_url":"https://api.github.com/repos/mesosphere/marathon/milestones{/number}","notifications_url":"https://api.github.com/repos/mesosphere/marathon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mesosphere/marathon/labels{/name}","releases_url":"https://api.github.com/repos/mesosphere/marathon/releases{/id}","deployments_url":"https://api.github.com/repos/mesosphere/marathon/deployments","created_at":"2013-06-25T14:56:34Z","updated_at":"2018-11-01T17:28:39Z","pushed_at":"2018-11-01T17:28:35Z","git_url":"git://github.com/mesosphere/marathon.git","ssh_url":"git@github.com:mesosphere/marathon.git","clone_url":"https://github.com/mesosphere/marathon.git","svn_url":"https://github.com/mesosphere/marathon","homepage":"https://mesosphere.github.io/marathon/","size":38637,"stargazers_count":3747,"watchers_count":3747,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":860,"mirror_url":null,"archived":false,"open_issues_count":16,"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":860,"open_issues":16,"watchers":3747,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6612"},"html":{"href":"https://github.com/mesosphere/marathon/pull/6612"},"issue":{"href":"https://api.github.com/repos/mesosphere/marathon/issues/6612"},"comments":{"href":"https://api.github.com/repos/mesosphere/marathon/issues/6612/comments"},"review_comments":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6612/comments"},"review_comment":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6612/commits"},"statuses":{"href":"https://api.github.com/repos/mesosphere/marathon/statuses/b58e690ff36b034541c93b0bbf33d6ee15c20bce"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"meln1k"}}