Store docker-compose generate files under data
Rely on the plugin's data directory to store the generated YAML
docker-compose file, so that they will be kept across restarts.
Change-Id: I96d1176b999c924758f76b0492a648a1386b535c
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetup.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetup.scala
index aec2268..1c07435 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetup.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetup.scala
@@ -14,20 +14,20 @@
package com.googlesource.gerrit.plugins.analytics.wizard
import java.io.PrintWriter
+import java.nio.charset.{Charset, StandardCharsets}
+import java.nio.file.{Files, Path}
trait ConfigWriter {
- def write(filename: String, out: String)
+ def write(outputPath: Path, out: String)
}
class ConfigWriterImpl extends ConfigWriter {
- def write(filename: String, out: String) = {
- val p = new PrintWriter(filename)
- p.write(out)
- p.close()
+ def write(outputPath: Path, out: String) {
+ Files.write(outputPath, out.getBytes(StandardCharsets.UTF_8))
}
}
-case class AnalyticDashboardSetup(name: String, config: Option[String] = None)(
+case class AnalyticDashboardSetup(name: String, dockerComposeYamlPath: Path)(
implicit val writer: ConfigWriter) {
private val dockerComposeTemplate = { (name: String) =>
@@ -68,9 +68,8 @@
""".stripMargin
}
- val configFileName = s"/tmp/docker-compose.${name}.yaml"
def createDashboardSetupFile(): Unit = {
- writer.write(configFileName, dockerComposeTemplate(name))
+ writer.write(dockerComposeYamlPath, dockerComposeTemplate(name))
}
}
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
index 44a5512..f63447c 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.analytics.wizard
import java.nio.charset.StandardCharsets.UTF_8
+import java.nio.file.Path
import com.google.common.io.ByteStreams
import com.google.gerrit.extensions.restapi.{
@@ -25,10 +26,11 @@
import com.google.gerrit.server.project.ProjectResource
import com.google.inject.Inject
import AnalyticDashboardSetup.writer
+import com.google.gerrit.extensions.annotations.PluginData
import scala.io.Source
-class GetAnalyticsStack @Inject()() extends RestReadView[ProjectResource] {
+class GetAnalyticsStack @Inject()(@PluginData val dataPath: Path) extends RestReadView[ProjectResource] {
override def apply(
resource: ProjectResource): Response[AnalyticDashboardSetup] = {
@@ -36,29 +38,25 @@
Response.ok(
AnalyticDashboardSetup(
projectName,
- Some(
- Source
- .fromFile(s"/tmp/docker-compose.${projectName}.yaml")
- .getLines
- .mkString)))
+ dataPath.resolve(s"docker-compose.${projectName}.yaml")))
}
}
class Input(var dashboardName: String)
-class PutAnalyticsStack @Inject()()
+class PutAnalyticsStack @Inject()(@PluginData val dataPath: Path)
extends RestModifyView[ProjectResource, Input] {
override def apply(resource: ProjectResource,
input: Input): Response[String] = {
val projectName = resource.getControl.getProject.getName
- AnalyticDashboardSetup(projectName).createDashboardSetupFile()
+ AnalyticDashboardSetup(projectName, dataPath.resolve(s"docker-compose.${projectName}.yaml")).createDashboardSetupFile()
Response.created(s"Dashboard configuration created for $projectName!")
}
}
class DockerComposeCommand(var action: String)
-class PostAnalyticsStack @Inject()()
+class PostAnalyticsStack @Inject()(@PluginData val dataPath: Path)
extends RestModifyView[ProjectResource, DockerComposeCommand] {
override def apply(resource: ProjectResource,
input: DockerComposeCommand): Response[String] = {
@@ -67,8 +65,8 @@
val pb = new ProcessBuilder(
"docker-compose",
"-f",
- s"/tmp/docker-compose.${projectName}.yaml",
- input.action.toLowerCase) // XXX validate command!
+ s"${dataPath.toFile.getAbsolutePath}/docker-compose.${projectName}.yaml",
+ input.action.toLowerCase)
pb.redirectErrorStream(true)
val ps: Process = pb.start
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetupSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetupSpec.scala
index 717d213..c7e0519 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetupSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticDashboardSetupSpec.scala
@@ -1,21 +1,25 @@
package com.googlesource.gerrit.plugins.analytics.wizard
+import java.io.File
+import java.nio.file.Path
+
import org.scalatest.{FlatSpec, Matchers}
class AnalyticDashboardSetupSpec extends FlatSpec with Matchers {
behavior of "AnalyticDashboardSetup"
it should "create a config file with correct name" in {
- var gotFilename: Option[String] = None
+ var gotFilename: Option[Path] = None
class MockWriter extends ConfigWriter {
- override def write(filename: String, out: String): Unit = {
+ override def write(filename: Path, out: String): Unit = {
gotFilename = Some(filename)
}
}
implicit val writer = new MockWriter()
- val ads = AnalyticDashboardSetup("aProject")
+ val composeYamlFile = File.createTempFile(getClass.getName, ".yaml").toPath
+ val ads = AnalyticDashboardSetup("aProject", composeYamlFile)
ads.createDashboardSetupFile()
- gotFilename shouldBe Some(ads.configFileName)
+ gotFilename shouldBe Some(composeYamlFile)
}
}