# Copyright 2023 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
#
#      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.

apiVersion: blueprints.cloud.google.com/v1alpha1
kind: BlueprintMetadata
metadata:
  name: terraform-google-bigquery
  annotations:
    config.kubernetes.io/local-config: "true"
spec:
  info:
    title: terraform-google-bigquery
    source:
      repo: https://github.com/terraform-google-modules/terraform-google-bigquery
      sourceType: git
    version: 7.0.0
    actuationTool:
      flavor: Terraform
      version: ">= 0.13"
    description: {}
  content:
    subBlueprints:
      - name: authorization
        location: modules/authorization
      - name: data_warehouse
        location: modules/data_warehouse
      - name: scheduled_queries
        location: modules/scheduled_queries
      - name: udf
        location: modules/udf
    examples:
      - name: basic_bq
        location: examples/basic_bq
      - name: basic_view
        location: examples/basic_view
      - name: data_warehouse
        location: examples/data_warehouse
      - name: multiple_tables
        location: examples/multiple_tables
      - name: scheduled_queries
        location: examples/scheduled_queries
  interfaces:
    variables:
      - name: access
        description: An array of objects that define dataset access for one or more entities.
        varType: any
        defaultValue:
          - role: roles/bigquery.dataOwner
            special_group: projectOwners
      - name: dataset_id
        description: Unique ID for the dataset being provisioned.
        varType: string
        defaultValue: null
        required: true
      - name: dataset_labels
        description: Key value pairs in a map for dataset labels
        varType: map(string)
        defaultValue: {}
      - name: dataset_name
        description: Friendly name for the dataset being provisioned.
        varType: string
        defaultValue: null
      - name: default_table_expiration_ms
        description: TTL of tables using the dataset in MS
        varType: number
        defaultValue: null
      - name: delete_contents_on_destroy
        description: (Optional) If set to true, delete all the tables in the dataset when destroying the resource; otherwise, destroying the resource will fail if tables are present.
        varType: bool
        defaultValue: null
      - name: deletion_protection
        description: Whether or not to allow Terraform to destroy the instance. Unless this field is set to false in Terraform state, a terraform destroy or terraform apply that would delete the instance will fail
        varType: bool
        defaultValue: false
      - name: description
        description: Dataset description.
        varType: string
        defaultValue: null
      - name: encryption_key
        description: Default encryption key to apply to the dataset. Defaults to null (Google-managed).
        varType: string
        defaultValue: null
      - name: external_tables
        description: A list of objects which include table_id, expiration_time, external_data_configuration, and labels.
        varType: |-
          list(object({
              table_id              = string,
              description           = optional(string),
              autodetect            = bool,
              compression           = string,
              ignore_unknown_values = bool,
              max_bad_records       = number,
              schema                = string,
              source_format         = string,
              source_uris           = list(string),
              csv_options = object({
                quote                 = string,
                allow_jagged_rows     = bool,
                allow_quoted_newlines = bool,
                encoding              = string,
                field_delimiter       = string,
                skip_leading_rows     = number,
              }),
              google_sheets_options = object({
                range             = string,
                skip_leading_rows = number,
              }),
              hive_partitioning_options = object({
                mode              = string,
                source_uri_prefix = string,
              }),
              expiration_time = string,
              max_staleness   = optional(string),
              labels          = map(string),
            }))
        defaultValue: []
      - name: location
        description: The regional location for the dataset only US and EU are allowed in module
        varType: string
        defaultValue: US
      - name: materialized_views
        description: A list of objects which includes view_id, view_query, clustering, time_partitioning, range_partitioning, expiration_time and labels
        varType: |-
          list(object({
              view_id             = string,
              description         = optional(string),
              query               = string,
              enable_refresh      = bool,
              refresh_interval_ms = string,
              clustering          = list(string),
              time_partitioning = object({
                expiration_ms            = string,
                field                    = string,
                type                     = string,
                require_partition_filter = bool,
              }),
              range_partitioning = object({
                field = string,
                range = object({
                  start    = string,
                  end      = string,
                  interval = string,
                }),
              }),
              expiration_time = string,
              max_staleness   = optional(string),
              labels          = map(string),
            }))
        defaultValue: []
      - name: max_time_travel_hours
        description: Defines the time travel window in hours
        varType: number
        defaultValue: null
      - name: project_id
        description: Project where the dataset and table are created
        varType: string
        defaultValue: null
        required: true
      - name: routines
        description: A list of objects which include routine_id, routine_type, routine_language, definition_body, return_type, routine_description and arguments.
        varType: |-
          list(object({
              routine_id      = string,
              routine_type    = string,
              language        = string,
              definition_body = string,
              return_type     = string,
              description     = string,
              arguments = list(object({
                name          = string,
                data_type     = string,
                argument_kind = string,
                mode          = string,
              })),
            }))
        defaultValue: []
      - name: tables
        description: A list of objects which include table_id, table_name, schema, clustering, time_partitioning, range_partitioning, expiration_time and labels.
        varType: |-
          list(object({
              table_id    = string,
              description = optional(string),
              table_name  = optional(string),
              schema      = string,
              clustering  = list(string),
              time_partitioning = object({
                expiration_ms            = string,
                field                    = string,
                type                     = string,
                require_partition_filter = bool,
              }),
              range_partitioning = object({
                field = string,
                range = object({
                  start    = string,
                  end      = string,
                  interval = string,
                }),
              }),
              expiration_time = string,
              labels          = map(string),
            }))
        defaultValue: []
      - name: views
        description: A list of objects which include view_id and view query
        varType: |-
          list(object({
              view_id        = string,
              description    = optional(string),
              query          = string,
              use_legacy_sql = bool,
              labels         = map(string),
            }))
        defaultValue: []
    outputs:
      - name: bigquery_dataset
        description: Bigquery dataset resource.
      - name: bigquery_external_tables
        description: Map of BigQuery external table resources being provisioned.
      - name: bigquery_tables
        description: Map of bigquery table resources being provisioned.
      - name: bigquery_views
        description: Map of bigquery view resources being provisioned.
      - name: external_table_ids
        description: Unique IDs for any external tables being provisioned
      - name: external_table_names
        description: Friendly names for any external tables being provisioned
      - name: project
        description: Project where the dataset and tables are created
      - name: routine_ids
        description: Unique IDs for any routine being provisioned
      - name: table_ids
        description: Unique id for the table being provisioned
      - name: table_names
        description: Friendly name for the table being provisioned
      - name: view_ids
        description: Unique id for the view being provisioned
      - name: view_names
        description: friendlyname for the view being provisioned
  requirements:
    roles:
      - level: Project
        roles:
          - roles/bigquery.admin
          - roles/cloudkms.cryptoKeyEncrypterDecrypter
          - roles/owner
    services:
      - cloudkms.googleapis.com
      - cloudresourcemanager.googleapis.com
      - bigquery.googleapis.com
      - bigquerystorage.googleapis.com
      - bigqueryconnection.googleapis.com
      - serviceusage.googleapis.com
      - iam.googleapis.com
