from dataclasses import dataclass from typing import Optional from dbt.adapters.base import Credentials import dbt.exceptions @dataclass class GlueCredentials(Credentials): """ Required connections for a Glue connection""" role_arn: str region: str workers: int worker_type: str session_provisioning_timeout_in_seconds: int = 120 location: Optional[str] = None extra_jars: Optional[str] = None idle_timeout: int = 10 query_timeout_in_minutes: int = 300 glue_version: Optional[str] = "3.0" security_configuration: Optional[str] = None connections: Optional[str] = None conf: Optional[str] = None extra_py_files: Optional[str] = None delta_athena_prefix: Optional[str] = None tags: Optional[str] = None database: Optional[str] # type: ignore seed_format: Optional[str] = "parquet" seed_mode: Optional[str] = "overwrite" default_arguments: Optional[str] = None iceberg_glue_commit_lock_table: Optional[str] = "myGlueLockTable" use_interactive_session_role_for_api_calls: bool = False @property def type(self): return "glue" @property def unique_field(self): return "glue" @classmethod def __pre_deserialize__(cls, data): data = super().__pre_deserialize__(data) if "database" not in data: data["database"] = None return data def __post_init__(self): # spark classifies database and schema as the same thing if self.database is not None and self.database != self.schema: raise dbt.exceptions.DbtRuntimeError( f" schema: {self.schema} \n" f" database: {self.database} \n" f"On Spark, database must be omitted or have the same value as" f" schema." ) self.database = None def _connection_keys(self): """ Keys to show when debugging """ return [ 'role_arn', 'region', 'workers', 'worker_type', 'session_provisioning_timeout_in_seconds', 'schema', 'location', 'extra_jars', 'idle_timeout', 'query_timeout_in_minutes', 'glue_version', 'security_configuration', 'connections', 'conf', 'extra_py_files', 'delta_athena_prefix', 'tags', 'seed_format', 'seed_mode', 'default_arguments', 'iceberg_glue_commit_lock_table' ]