@kumologica/builder
Version:
Kumologica build and deploy module
166 lines (143 loc) • 4.66 kB
JavaScript
const path = require('path');
class TerraformAzureTemplate {
constructor() { }
getResourceGroupName(params) {
return params["resource-group-name"] ? params["resource-group-name"] : "${azurerm_resource_group.resource_group.name}";
}
getServicePlanId(params) {
return params["service-plan-id"] ? params["service-plan-id"] : "${azurerm_app_service_plan.app_service_plan.id}";
}
createTemplate(params, flow) {
let template = {
terraform: {
required_providers: {
azurerm: {
source: "hashicorp/azurerm",
version: "~> 2.26"
}
}
},
provider: {
azurerm: {
features: {}
}
},
resource: {
"random_string": {
random: {
length: 12,
special: false,
lower: true,
upper: false
}
},
/* "null_resource": {
"ImportCommand": {
triggers: {
trigger: "${uuid()}"
},
provisioner: {
"local-exec": {
command: `terraform import "azurerm_resource_group.resource_group" "/subscriptions/${params.alias.subscription_id}/resourceGroups/${this.getResourceGroupName(params)}"`
}
}
}
},*/
"azurerm_storage_account": {
"storage_account": {
name: "kumologica${random_string.random.result}",
resource_group_name: this.getResourceGroupName(params),
location: params.location,
account_tier: "Standard",
account_replication_type: "LRS"
}
},
"azurerm_function_app": {
"function_app": {
name: params["azure-application-name"],
resource_group_name: this.getResourceGroupName(params),
location: params.location,
app_service_plan_id: this.getServicePlanId(params),
app_settings: {
"WEBSITE_RUN_FROM_PACKAGE": "1",
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsDisableHomepage": "true",
"WEBSITE_NODE_DEFAULT_VERSION": params["os-type"] == "windows" ? "~14" : null
},
os_type: params["os-type"] == "linux" ? "linux" : null,
site_config: {
linux_fx_version: params["os-type"] == "linux" ? "node|14" : null,
use_32_bit_worker_process: false
},
storage_account_name: "${azurerm_storage_account.storage_account.name}",
storage_account_access_key: "${azurerm_storage_account.storage_account.primary_access_key}",
version: "~3",
tags: params.tags ? JSON.parse(params.tags) : null
}
},
"azurerm_application_insights": {
"application_insights": {
name: `${params["azure-application-name"]}-application-insights`,
location: params.location,
resource_group_name: this.getResourceGroupName(params),
application_type: "Node.JS"
}
},
"null_resource": {
"function_app_publish": {
provisioner: {
"local-exec": {
command: "${local.publish_code_command}"
}
},
depends_on: ["local.publish_code_command"],
triggers: {
input_json: `filemd5(${params['zip-file-name']})`,
publish_code_command: "${local.publish_code_command}"
}
}
}
},
//func azure functionapp publish azuretf-dev-function-app
locals: {
publish_code_command: "az webapp deployment source config-zip --resource-group " + this.getResourceGroupName(params) + " --name ${azurerm_function_app.function_app.name} --src " + path.join(params.buildDir, params['zip-file-name'])
}
};
if (params.environment) {
const environment = JSON.parse(params.environment);
for (let key in environment) {
template.resource.azurerm_function_app.function_app.app_settings[key] = environment[key];
}
}
if (!params["service-plan-id"]) {
template.resource["azurerm_app_service_plan"] = this.servicePlan(params);
} else {
console.log(`service plan id present: ${params["service-plan-id"]}`);
}
if (!params["resource-group-name"]) {
template.resource["azurerm_resource_group"] = {
"resource_group": {
name: `${params["azure-application-name"]}-resource-group`,
location: params.location
}
}
}
return template;
}
servicePlan(params) {
return {
"app_service_plan": {
name: `${params["azure-application-name"]}-app-service-plan`,
resource_group_name: this.getResourceGroupName(params),
location: params.location,
kind: params["hosting-plan"] === "premium" ? "elastic" : "FunctionApp",
reserved: params["os-type"] === "windows" ? false : true,
sku: {
tier: params["hosting-plan"] === "premium" ? "ElasticPremium" : "Dynamic",
size: params["hosting-plan"] === "premium" ? "EP1" : "Y1"
}
}
}
}
}
module.exports = TerraformAzureTemplate;