From 90e756eb35a311c933876006a7b65e16e3fa2b65 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Tue, 22 Aug 2017 09:57:07 -0700 Subject: Add new traits for postgres docker databases and inserting test data --- build.sbt | 3 +- .../scala/xyz/driver/core/database/database.scala | 67 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index f0a0a73..dcb313a 100644 --- a/build.sbt +++ b/build.sbt @@ -21,5 +21,6 @@ lazy val core = (project in file(".")) "com.typesafe.slick" %% "slick" % "3.1.1", "com.typesafe" % "config" % "1.2.1", "com.typesafe.scala-logging" %% "scala-logging" % "3.5.0", - "ch.qos.logback" % "logback-classic" % "1.1.3" + "ch.qos.logback" % "logback-classic" % "1.1.3", + "com.spotify" % "docker-client" % "8.9.0" classifier "shaded" )) diff --git a/src/main/scala/xyz/driver/core/database/database.scala b/src/main/scala/xyz/driver/core/database/database.scala index dd2ed88..ac695da 100644 --- a/src/main/scala/xyz/driver/core/database/database.scala +++ b/src/main/scala/xyz/driver/core/database/database.scala @@ -122,6 +122,53 @@ package database { def naturalKeyMapper[T] = MappedColumnType.base[Id[T], String](_.value, Id[T](_)) } + trait PostgresDockerContainerDatabase { + import com.spotify.docker.client._ + import com.spotify.docker.client.messages._ + + lazy val dockerClient: DockerClient = DefaultDockerClient.fromEnv().build() + + @SuppressWarnings(Array("org.wartremover.warts.Var")) + var dockerId: Option[String] = None + + def setupDockerDatabase(username: String = "postgres", + password: String = "postgres", + database: String = "postgres", + hostPort: Int = 15432): Unit = { + import collection.JavaConverters._ + import sys.process._ + + // https://github.com/spotify/docker-client/issues/857 + // dockerClient.pull("postgres") + + "docker pull postgres" ! + + val portBindings: Map[String, List[PortBinding]] = Map("5432" -> List(PortBinding.of("0.0.0.0", hostPort))) + val portBindingsJava = portBindings.mapValues(_.asJava).asJava + val hostConfig = HostConfig.builder().portBindings(portBindingsJava).build() + val containerConfig = + ContainerConfig + .builder() + .hostConfig(hostConfig) + .image("postgres") + .exposedPorts("5432") + .env( + s"POSTGRES_USER=$username", + s"POSTGRES_DB=$database", + s"POSTGRES_PASSWORD=$password" + ) + .build() + + val creation = dockerClient.createContainer(containerConfig) + dockerClient.startContainer(creation.id()) + dockerId = Some(creation.id()) + } + + def killDockerDatabase(): Unit = { + dockerId.foreach(dockerClient.killContainer) + } + } + trait CreateAndDropSchema { val slickDal: xyz.driver.core.database.SlickDal val tables: GeneratedTables @@ -137,6 +184,26 @@ package database { def dropSchema(): Unit = { Await.result(slickDal.execute(tables.schema.drop >> tables.dropNamespaceSchema), Duration.Inf) } + } + + trait PostgresTestData { + val slickDal: xyz.driver.core.database.SlickDal + val tables: GeneratedTables + + def insertTestData(database: xyz.driver.core.database.Database, filePath: String)( + implicit executionContext: ExecutionContext): Future[Int] = { + import database.profile.api.{DBIO => _, _} + + val file = Paths.get(filePath) + val inserts = new String(Files.readAllBytes(file), "UTF-8") + + slickDal.execute(sql"#$inserts".asUpdate) + } + } + + trait HsqlTestData { + val slickDal: xyz.driver.core.database.SlickDal + val tables: GeneratedTables def insertTestData(database: xyz.driver.core.database.Database, filePath: String)( implicit executionContext: ExecutionContext): Future[Int] = { -- cgit v1.2.3 From d8932d000f6af3ab595ffdde43e7afb65759d80d Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Tue, 22 Aug 2017 13:05:07 -0700 Subject: Add exclusion rule to docker-client dependency --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index dcb313a..eb17abf 100644 --- a/build.sbt +++ b/build.sbt @@ -22,5 +22,7 @@ lazy val core = (project in file(".")) "com.typesafe" % "config" % "1.2.1", "com.typesafe.scala-logging" %% "scala-logging" % "3.5.0", "ch.qos.logback" % "logback-classic" % "1.1.3", - "com.spotify" % "docker-client" % "8.9.0" classifier "shaded" + "com.spotify" % "docker-client" % "8.9.0" classifier "shaded" excludeAll( + ExclusionRule(organization = "com.fasterxml.jackson.core") + ) )) -- cgit v1.2.3 From d9ed9e9fff25548f7aa85be5875c5d1998258198 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Tue, 22 Aug 2017 16:26:15 -0700 Subject: Remove test-related classes out of database package --- build.sbt | 5 +- .../scala/xyz/driver/core/database/database.scala | 106 --------------------- 2 files changed, 1 insertion(+), 110 deletions(-) diff --git a/build.sbt b/build.sbt index eb17abf..f0a0a73 100644 --- a/build.sbt +++ b/build.sbt @@ -21,8 +21,5 @@ lazy val core = (project in file(".")) "com.typesafe.slick" %% "slick" % "3.1.1", "com.typesafe" % "config" % "1.2.1", "com.typesafe.scala-logging" %% "scala-logging" % "3.5.0", - "ch.qos.logback" % "logback-classic" % "1.1.3", - "com.spotify" % "docker-client" % "8.9.0" classifier "shaded" excludeAll( - ExclusionRule(organization = "com.fasterxml.jackson.core") - ) + "ch.qos.logback" % "logback-classic" % "1.1.3" )) diff --git a/src/main/scala/xyz/driver/core/database/database.scala b/src/main/scala/xyz/driver/core/database/database.scala index ac695da..1dd0355 100644 --- a/src/main/scala/xyz/driver/core/database/database.scala +++ b/src/main/scala/xyz/driver/core/database/database.scala @@ -6,8 +6,6 @@ import xyz.driver.core.date.Date import xyz.driver.core.time.Time import scala.concurrent.Future -import scala.concurrent.ExecutionContext -import java.nio.file.{Files, Paths} import com.typesafe.config.Config package database { @@ -122,110 +120,6 @@ package database { def naturalKeyMapper[T] = MappedColumnType.base[Id[T], String](_.value, Id[T](_)) } - trait PostgresDockerContainerDatabase { - import com.spotify.docker.client._ - import com.spotify.docker.client.messages._ - - lazy val dockerClient: DockerClient = DefaultDockerClient.fromEnv().build() - - @SuppressWarnings(Array("org.wartremover.warts.Var")) - var dockerId: Option[String] = None - - def setupDockerDatabase(username: String = "postgres", - password: String = "postgres", - database: String = "postgres", - hostPort: Int = 15432): Unit = { - import collection.JavaConverters._ - import sys.process._ - - // https://github.com/spotify/docker-client/issues/857 - // dockerClient.pull("postgres") - - "docker pull postgres" ! - - val portBindings: Map[String, List[PortBinding]] = Map("5432" -> List(PortBinding.of("0.0.0.0", hostPort))) - val portBindingsJava = portBindings.mapValues(_.asJava).asJava - val hostConfig = HostConfig.builder().portBindings(portBindingsJava).build() - val containerConfig = - ContainerConfig - .builder() - .hostConfig(hostConfig) - .image("postgres") - .exposedPorts("5432") - .env( - s"POSTGRES_USER=$username", - s"POSTGRES_DB=$database", - s"POSTGRES_PASSWORD=$password" - ) - .build() - - val creation = dockerClient.createContainer(containerConfig) - dockerClient.startContainer(creation.id()) - dockerId = Some(creation.id()) - } - - def killDockerDatabase(): Unit = { - dockerId.foreach(dockerClient.killContainer) - } - } - - trait CreateAndDropSchema { - val slickDal: xyz.driver.core.database.SlickDal - val tables: GeneratedTables - - import tables.profile.api._ - import scala.concurrent.Await - import scala.concurrent.duration.Duration - - def createSchema(): Unit = { - Await.result(slickDal.execute(tables.createNamespaceSchema >> tables.schema.create), Duration.Inf) - } - - def dropSchema(): Unit = { - Await.result(slickDal.execute(tables.schema.drop >> tables.dropNamespaceSchema), Duration.Inf) - } - } - - trait PostgresTestData { - val slickDal: xyz.driver.core.database.SlickDal - val tables: GeneratedTables - - def insertTestData(database: xyz.driver.core.database.Database, filePath: String)( - implicit executionContext: ExecutionContext): Future[Int] = { - import database.profile.api.{DBIO => _, _} - - val file = Paths.get(filePath) - val inserts = new String(Files.readAllBytes(file), "UTF-8") - - slickDal.execute(sql"#$inserts".asUpdate) - } - } - - trait HsqlTestData { - val slickDal: xyz.driver.core.database.SlickDal - val tables: GeneratedTables - - def insertTestData(database: xyz.driver.core.database.Database, filePath: String)( - implicit executionContext: ExecutionContext): Future[Int] = { - - import database.profile.api.{DBIO => _, _} - - val file = Paths.get(filePath) - val sqlLine = new String(Files.readAllBytes(file), "UTF-8") - - slickDal.execute(sqlu"""CREATE PROCEDURE INSERT_TEST_DATA() - MODIFIES SQL DATA - BEGIN ATOMIC - #$sqlLine - END; - """).flatMap { _ => - slickDal.execute(sqlu"""{call INSERT_TEST_DATA()}""").flatMap { _ => - slickDal.execute(sqlu"""drop PROCEDURE INSERT_TEST_DATA;""") - } - } - } - } - trait DatabaseObject extends ColumnTypes { def createTables(): Future[Unit] def disconnect(): Unit -- cgit v1.2.3