blob: fb1520e50df3f86245097985c91729afe0aabd1b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* License); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.pswidersk.gradle.terraform.TerraformTask
import java.io.ByteArrayOutputStream
description = "Apache Beam :: Playground :: Deploy"
val licenseText = "################################################################################\n" +
"# Licensed to the Apache Software Foundation (ASF) under one\n" +
"# or more contributor license agreements. See the NOTICE file\n" +
"# distributed with this work for additional information\n" +
"# regarding copyright ownership. The ASF licenses this file\n" +
"# to you under the Apache License, Version 2.0 (the\n" +
"# \"License\"); you may not use this file except in compliance\n" +
"# with 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" +
"################################################################################"
plugins {
id("com.pswidersk.terraform-plugin") version "1.0.0"
}
terraformPlugin {
terraformVersion.set("1.4.2")
}
tasks {
/* init Infrastructure for migrate */
register<TerraformTask>("terraformInit") {
// exec args can be passed by commandline, for example
var environment = "unknown"
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"init", "-migrate-state",
"-backend-config=./environment/$environment/state.tfbackend",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* refresh Infrastucture for remote state */
register<TerraformTask>("terraformRef") {
mustRunAfter(":playground:terraform:terraformInit")
var project_id = "unknown"
var environment = "unknown"
var region = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"refresh",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=region=$region",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* build only Infrastructurte */
register<TerraformTask>("terraformApplyInf") {
var environment = "unknown"
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-target=module.infrastructure",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* build All */
register<TerraformTask>("terraformApply") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
var docker_tag = if (project.hasProperty("docker-tag")) {
project.property("docker-tag") as String
} else {
environment
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=docker_image_tag=$docker_tag",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
register<TerraformTask>("terraformDestroy") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"destroy",
"-auto-approve",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
}
tasks.register("readState") {
group = "deploy"
dependsOn(":playground:terraform:terraformInit")
dependsOn(":playground:terraform:terraformRef")
}
tasks.register("pushBack") {
group = "deploy"
dependsOn(":playground:backend:containers:go:dockerTagsPush")
dependsOn(":playground:backend:containers:java:dockerTagsPush")
dependsOn(":playground:backend:containers:python:dockerTagsPush")
dependsOn(":playground:backend:containers:scio:dockerTagsPush")
dependsOn(":playground:backend:containers:router:dockerTagsPush")
}
tasks.register("pushFront") {
group = "deploy"
dependsOn(":playground:frontend:dockerTagsPush")
}
/* initialization infrastructure */
tasks.register("InitInfrastructure") {
group = "deploy"
description = "initialization infrastructure"
val init = tasks.getByName("terraformInit")
val apply = tasks.getByName("terraformApplyInf")
dependsOn(init)
dependsOn(apply)
apply.mustRunAfter(init)
}
tasks.register("indexcreate") {
group = "deploy"
val indexpath = "../index.yaml"
doLast {
exec {
executable("gcloud")
args("app", "deploy", indexpath)
}
}
}
tasks.register<TerraformTask>("setPlaygroundStaticIpAddress") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_static_ip_address")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_static_ip_address"] = standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundRedisIp") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_redis_ip")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_redis_ip"] = standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundGkeProject") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_gke_project")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_gke_project"] = standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundStaticIpAddressName") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_static_ip_address_name")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_static_ip_address_name"] =
standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundFunctionCleanupUrl") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_function_cleanup_url")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_function_cleanup_url"] =
standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundFunctionPutUrl") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_function_put_url")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_function_put_url"] =
standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register<TerraformTask>("setPlaygroundFunctionViewUrl") {
group = "deploy"
dependsOn("terraformInit")
dependsOn("terraformRef")
args("output", "playground_function_view_url")
standardOutput = ByteArrayOutputStream()
doLast {
project.rootProject.extra["playground_function_view_url"] =
standardOutput.toString().trim().replace("\"", "")
}
}
tasks.register("takeConfig") {
group = "deploy"
dependsOn("setPlaygroundStaticIpAddress")
dependsOn("setPlaygroundRedisIp")
dependsOn("setPlaygroundGkeProject")
dependsOn("setPlaygroundStaticIpAddressName")
dependsOn("setPlaygroundFunctionCleanupUrl")
dependsOn("setPlaygroundFunctionPutUrl")
dependsOn("setPlaygroundFunctionViewUrl")
doLast {
var d_tag = ""
var dns_name = ""
if (project.hasProperty("dns-name")) {
dns_name = project.property("dns-name") as String
}
if (project.hasProperty("docker-tag")) {
d_tag = project.property("docker-tag") as String
}
val configFileName = "values.yaml"
val modulePath = project(":playground").projectDir.absolutePath
val file = File("$modulePath/infrastructure/helm-playground/$configFileName")
val lines = file.readLines()
val endOfSlice = lines.indexOfFirst { it.contains("static_ip") }
if (endOfSlice != -1) {
val oldContent = lines.slice(0 until endOfSlice)
val flagDelete = file.delete()
if (!flagDelete) {
throw kotlin.RuntimeException("Deleting file failed")
}
val sb = kotlin.text.StringBuilder()
val lastLine = oldContent[oldContent.size - 1]
oldContent.forEach {
if (it == lastLine) {
sb.append(it)
} else {
sb.appendLine(it)
}
}
file.writeText(sb.toString())
}
val ipaddr = project.rootProject.extra["playground_static_ip_address"]
val redis = project.rootProject.extra["playground_redis_ip"]
val proj = project.rootProject.extra["playground_gke_project"]
val registry = project.rootProject.extra["docker-repository-root"]
val ipaddrname = project.rootProject.extra["playground_static_ip_address_name"]
val datastore_name = if (project.hasProperty("datastore-namespace")) (project.property("datastore-namespace") as String) else ""
val pgfuncclean = project.rootProject.extra["playground_function_cleanup_url"]
val pgfuncput = project.rootProject.extra["playground_function_put_url"]
val pgfuncview = project.rootProject.extra["playground_function_view_url"]
file.appendText(
"""
static_ip: ${ipaddr}
redis_ip: ${redis}:6379
project_id: ${proj}
registry: ${registry}
static_ip_name: ${ipaddrname}
tag: $d_tag
datastore_name: ${datastore_name}
dns_name: ${dns_name}
func_clean: ${pgfuncclean}
func_put: ${pgfuncput}
func_view: ${pgfuncview}
"""
)
}
}
task("applyMigrations") {
doLast {
val namespace = if (project.hasProperty("datastore-namespace")) (project.property("datastore-namespace") as String) else ""
val projectId = project.rootProject.extra["playground_gke_project"]
val modulePath = project(":playground").projectDir.absolutePath
val sdkConfig = "$modulePath/sdks.yaml"
exec {
workingDir("$modulePath/backend")
executable("go")
args("run", "cmd/migration_tool/migration_tool.go",
"-project-id", projectId,
"-sdk-config", sdkConfig,
"-namespace", namespace)
}
}
}
tasks.register("helmRelease") {
group = "deploy"
val modulePath = project(":playground").projectDir.absolutePath
val helmdir = File("$modulePath/infrastructure/helm-playground/")
doLast{
exec {
executable("helm")
args("upgrade", "--install", "playground", "$helmdir")
}
}
}
tasks.register("gkebackend") {
group = "deploy"
val initTask = tasks.getByName("terraformInit")
val takeConfigTask = tasks.getByName("takeConfig")
val pushBackTask = tasks.getByName("pushBack")
val pushFrontTask = tasks.getByName("pushFront")
val indexcreateTask = tasks.getByName("indexcreate")
val helmTask = tasks.getByName("helmRelease")
var applyMigrations = tasks.getByName("applyMigrations")
dependsOn(initTask)
dependsOn(takeConfigTask)
dependsOn(pushBackTask)
dependsOn(pushFrontTask)
dependsOn(indexcreateTask)
dependsOn(applyMigrations)
dependsOn(helmTask)
takeConfigTask.mustRunAfter(initTask)
pushBackTask.mustRunAfter(takeConfigTask)
pushFrontTask.mustRunAfter(pushBackTask)
indexcreateTask.mustRunAfter(pushFrontTask)
applyMigrations.mustRunAfter(indexcreateTask)
helmTask.mustRunAfter(applyMigrations)
}