app/models/packer/PackerProvisionerConfig.scala (45 lines of code) (raw):
package models.packer
import java.nio.file.{Files, Path}
import play.api.libs.json.Json
import scala.jdk.CollectionConverters._
import play.api.libs.json.OWrites
case class PackerProvisionerConfig(
`type`: String,
source: Option[String] = None,
destination: Option[String] = None,
script: Option[String] = None,
inline: Option[Seq[String]] = None,
execute_command: Option[String] = None,
playbook_file: Option[String] = None,
role_paths: Option[Seq[String]] = None,
extra_arguments: Option[Seq[String]] = None
)
object PackerProvisionerConfig {
implicit val jsonWrites: OWrites[PackerProvisionerConfig] =
Json.writes[PackerProvisionerConfig]
def fileCopy(source: Path, destination: String) = PackerProvisionerConfig(
`type` = "file",
source = Some(source.toAbsolutePath.toString),
destination = Some(destination)
)
def executeRemoteScript(script: String) = PackerProvisionerConfig(
`type` = "shell",
script = Some(script),
execute_command = Some("{{ .Vars }} sudo -E bash -x '{{ .Path }}'")
)
def executeRemoteCommands(commands: Seq[String]) = PackerProvisionerConfig(
`type` = "shell",
inline = Some(commands),
execute_command = Some("{{ .Vars }} sudo -E bash -x '{{ .Path }}'")
)
def ansibleLocal(playbookFile: Path, rolesDir: Path) = {
val rolePaths =
Files.list(rolesDir).iterator.asScala.toSeq.map(_.toAbsolutePath.toString)
PackerProvisionerConfig(
`type` = "ansible-local",
extra_arguments = Some(Seq("--verbose")),
playbook_file = Some(playbookFile.toAbsolutePath.toString),
role_paths = Some(rolePaths)
)
}
}