terraform-modules/dataform/tf-dataform.tf (601 lines of code) (raw):
####################################################################################
# Copyright 2022 Google LLC
#
# Licensed 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
#
# https://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.
####################################################################################
####################################################################################
# Create the Dataform resources
#
# Author: Adam Paternostro
#
# References: https://github.com/GoogleCloudPlatform/magic-modules/blob/main/mmv1/templates/terraform/examples/dataform_repository.tf.erb
#
# Notes: Not all features of Dataform are supported via Terraform at the time this was authored
# REST API calls were used and can be replaced as additional Terraform support is added
####################################################################################
# Need this version to implement
terraform {
required_providers {
google = {
source = "hashicorp/google-beta"
version = "5.35.0"
}
}
}
####################################################################################
# Variables
####################################################################################
variable "project_id" {}
variable "project_number" {}
variable "dataform_region" {}
variable "storage_bucket" {}
variable "curl_impersonation" {}
variable "bigquery_region" {}
locals {
dataform_upload_dataform_json_file = templatefile("../dataform/dataform_golden_demo/demo_flow/dataform.json",
{
project_id = var.project_id
bigquery_region = var.bigquery_region
})
dataform_create_biglake_table_file = templatefile("../dataform/dataform_golden_demo/demo_flow/definitions/operations/create_biglake_table.sqlx",
{
processed_bucket = "processed-${var.storage_bucket}"
})
}
# Create a Git repo
/*
resource "google_sourcerepo_repository" "git_repository" {
provider = google
project = var.project_id
name = "dataform_git_repo"
}
*/
# Create a secret manager
resource "google_secret_manager_secret" "secret" {
project = var.project_id
provider = google
secret_id = "dataform"
replication {
auto {}
}
}
# Set secret. This is a placeholder so everything is in place, you just need to tie to your Git provider
# NOTE: You will need to replace with your GitHub PAT or GitLab PAT (PAT = Personal Access Token)
# https://cloud.google.com/dataform/docs/connect-repository
resource "google_secret_manager_secret_version" "secret_version" {
provider = google
secret = google_secret_manager_secret.secret.id
secret_data = "REPLAC-ME-WITH-PAT-TOKEN"
depends_on = [
google_secret_manager_secret.secret,
]
}
# Create Dataform repo with Git
resource "google_dataform_repository" "dataform_repository" {
provider = google
project = var.project_id
region = var.dataform_region
name = "dataform_golden_demo"
/* Not set for demo. You will need to do this via the UI after updating the secret with your PAT token
git_remote_settings {
url = google_sourcerepo_repository.git_repository.url
default_branch = "main"
authentication_token_secret_version = google_secret_manager_secret_version.secret_version.id
}
*/
depends_on = [
google_secret_manager_secret_version.secret_version,
]
}
# Dataform will create a sevice account upon first call.
# Wait for IAM Sync
# e.g. service-361618282238@gcp-sa-dataform.iam.gserviceaccount.com
# The 361618282238 is your Project Number
resource "time_sleep" "create_dataform_repository_time_delay" {
depends_on = [google_dataform_repository.dataform_repository]
create_duration = "30s"
}
# Grant required BigQuery User access for Dataform
resource "google_project_iam_member" "dataform_bigquery_user" {
project = var.project_id
role = "roles/bigquery.user"
member = "serviceAccount:service-${var.project_number}@gcp-sa-dataform.iam.gserviceaccount.com"
depends_on = [
time_sleep.create_dataform_repository_time_delay
]
}
# The service account need to be able to access the secret
# Dataform's service account is unable to access to the configured secret.
# Make sure the secret exists and is shared with your Dataform service account: service-361618282238@gcp-sa-dataform.iam.gserviceaccount.com.
resource "google_secret_manager_secret_iam_member" "member" {
project = var.project_id
secret_id = google_secret_manager_secret.secret.secret_id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:service-${var.project_number}@gcp-sa-dataform.iam.gserviceaccount.com"
depends_on = [
time_sleep.create_dataform_repository_time_delay
]
}
# Required since we are setting BigLake permissions
resource "google_project_iam_custom_role" "dataformrole" {
project = var.project_id
role_id = "DataformRole"
title = "Dataform Role"
description = "Used for Dataform automation"
permissions = ["bigquery.connections.delegate","bigquery.routines.get"]
}
# Add custom role to Dataform service account
resource "google_project_iam_member" "dataform_custom_role" {
project = var.project_id
role = google_project_iam_custom_role.dataformrole.id
member = "serviceAccount:service-${var.project_number}@gcp-sa-dataform.iam.gserviceaccount.com"
depends_on = [
google_project_iam_member.dataform_bigquery_user
]
}
####################################################################################################
# Deploy Dataform items (that currently cannot be done via Terraform)
####################################################################################################
# https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/create
resource "null_resource" "dataform_create_workspace" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces?workspaceId=demo_flow \
--data \ '{"name":"demo_flow"}'
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
]
}
########################################################################################
# Upload the files to the root directory
########################################################################################
# https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/writeFile
resource "null_resource" "dataform_upload_gitignore" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \".gitignore\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/.gitignore")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
]
}
# Upload the Dataform.json file
resource "null_resource" "dataform_upload_dataform_json" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"dataform.json\", \"contents\" : \"${base64encode(local.dataform_upload_dataform_json_file)}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
]
}
resource "null_resource" "dataform_upload_package_json" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"package.json\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/package.json")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
]
}
########################################################################################
# Create "definitions" directory
########################################################################################
# https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/makeDirectory
resource "null_resource" "dataform_create_definitions_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"definitions\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
]
}
########################################################################################
# Create and upload the "definitions/operations" directory
########################################################################################
# definitions/operations
resource "null_resource" "dataform_create_operations_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"definitions/operations\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
]
}
# definitions/operations/create_biglake_table.sqlx
resource "null_resource" "dataform_create_biglake_table" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/operations/create_biglake_table.sqlx\", \"contents\" : \"${base64encode(local.dataform_create_biglake_table_file)}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
]
}
########################################################################################
# Create and upload the "definitions/reporting" directory
########################################################################################
# definitions/reporting
resource "null_resource" "dataform_create_reporting_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"definitions/reporting\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
]
}
# definitions/operations/taxi_rides_summary.sqlx
resource "null_resource" "dataform_taxi_rides_summary" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/reporting/taxi_rides_summary.sqlx\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/definitions/reporting/taxi_rides_summary.sqlx")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
]
}
########################################################################################
# Create and upload the "definitions/sources" directory
########################################################################################
# definitions/sources
resource "null_resource" "dataform_create_sources_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"definitions/sources\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
]
}
# definitions/sources/biglake_payment_type.sqlx
resource "null_resource" "dataform_biglake_payment_type" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/sources/biglake_payment_type.sqlx\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/definitions/sources/biglake_payment_type.sqlx")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
]
}
# definitions/sources/taxi_trips_pub_sub.sqlx
resource "null_resource" "dataform_taxi_trips_pub_sub" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/sources/taxi_trips_pub_sub.sqlx\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/definitions/sources/taxi_trips_pub_sub.sqlx")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
]
}
########################################################################################
# Create and upload the "definitions/staging" directory
########################################################################################
# definitions/staging
resource "null_resource" "dataform_create_staging_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"definitions/staging\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
]
}
# definitions/staging/rides_group_data.sqlx
resource "null_resource" "dataform_rides_group_data" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/staging/rides_group_data.sqlx\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/definitions/staging/rides_group_data.sqlx")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
]
}
# definitions/staging/taxi_parsed_data.sqlx
resource "null_resource" "dataform_taxi_parsed_data" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"definitions/staging/taxi_parsed_data.sqlx\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/definitions/staging/taxi_parsed_data.sqlx")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
null_resource.dataform_taxi_parsed_data,
]
}
########################################################################################
# Create and upload the "includes" directory
########################################################################################
# includes
resource "null_resource" "dataform_create_includes_dir" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:makeDirectory \
--data \ "{ \"path\" : \"includes\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
null_resource.dataform_taxi_parsed_data,
]
}
# includes/CreateBiglake.js
resource "null_resource" "dataform_CreateBiglake" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:writeFile \
--data \ "{ \"path\" : \"includes/CreateBiglake.js\", \"contents\" : \"${filebase64("../dataform/dataform_golden_demo/demo_flow/includes/CreateBiglake.js")}\" }"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
null_resource.dataform_taxi_parsed_data,
null_resource.dataform_create_includes_dir,
]
}
########################################################################################
# Install the npm packages
# This will create the "package-lock.json" file (which is managed by dataform)
########################################################################################
# https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/installNpmPackages
# POST https://dataform.googleapis.com/v1beta1/{workspace=projects/*/locations/*/repositories/*/workspaces/*}:installNpmPackages
resource "null_resource" "dataform_install_npm_packages" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:installNpmPackages \
--data \ "{}"
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
null_resource.dataform_taxi_parsed_data,
null_resource.dataform_create_includes_dir,
null_resource.dataform_CreateBiglake,
]
}
########################################################################################
# Commit all the files and changes
########################################################################################
# https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories.workspaces/commit
# POST https://dataform.googleapis.com/v1beta1/{name=projects/*/locations/*/repositories/*/workspaces/*}:commit
resource "null_resource" "dataform_git_commit" {
provisioner "local-exec" {
when = create
command = <<EOF
curl \
--header "Authorization: Bearer $(gcloud auth print-access-token ${var.curl_impersonation})" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
-X POST https://dataform.googleapis.com/v1beta1/projects/${var.project_id}/locations/${var.dataform_region}/repositories/dataform_golden_demo/workspaces/demo_flow:commit \
--data \ '{ "author": { "name": "Admin", "emailAddress": "admin@paternostro.altostrat.com" }, "commitMessage": "Terraform Commit" }'
EOF
}
depends_on = [
google_dataform_repository.dataform_repository,
time_sleep.create_dataform_repository_time_delay,
null_resource.dataform_create_workspace,
null_resource.dataform_upload_gitignore,
null_resource.dataform_upload_dataform_json,
null_resource.dataform_upload_package_json,
null_resource.dataform_create_definitions_dir,
null_resource.dataform_create_operations_dir,
null_resource.dataform_create_biglake_table,
null_resource.dataform_create_reporting_dir,
null_resource.dataform_taxi_rides_summary,
null_resource.dataform_create_sources_dir,
null_resource.dataform_biglake_payment_type,
null_resource.dataform_taxi_trips_pub_sub,
null_resource.dataform_create_staging_dir,
null_resource.dataform_rides_group_data,
null_resource.dataform_taxi_parsed_data,
null_resource.dataform_create_includes_dir,
null_resource.dataform_CreateBiglake,
null_resource.dataform_install_npm_packages
]
}
####################################################################################
# Outputs
####################################################################################
output "dataform_repository" {
value = google_dataform_repository.dataform_repository.name
}