|
6 | 6 | import yaml |
7 | 7 | from dataclasses import dataclass |
8 | 8 | from packaging.version import parse as parse_version |
9 | | -from typing import List, Optional, Dict |
| 9 | +from typing import List, Optional, Dict, Tuple |
10 | 10 |
|
11 | 11 | import requests |
12 | 12 | from dbt_artifacts_parser.parser import parse_run_results, parse_manifest |
|
19 | 19 | send_event_json, |
20 | 20 | is_tracking_enabled, |
21 | 21 | ) |
22 | | -from .utils import run_as_daemon, truncate_error |
| 22 | +from .utils import get_from_dict_with_raise, run_as_daemon, truncate_error |
23 | 23 | from . import connect_to_table, diff_tables, Algorithm |
24 | 24 |
|
25 | 25 | RUN_RESULTS_PATH = "/target/run_results.json" |
@@ -297,18 +297,40 @@ def set_project_dict(self): |
297 | 297 | with open(self.project_dir + PROJECT_FILE) as project: |
298 | 298 | self.project_dict = yaml.safe_load(project) |
299 | 299 |
|
300 | | - def set_connection(self): |
301 | | - with open(self.profiles_dir + PROFILES_FILE) as profiles: |
| 300 | + def _get_connection_creds(self) -> Tuple[Dict[str, str], str]: |
| 301 | + profiles_path = self.profiles_dir + PROFILES_FILE |
| 302 | + with open(profiles_path) as profiles: |
302 | 303 | profiles = yaml.safe_load(profiles) |
303 | 304 |
|
304 | 305 | dbt_profile = self.project_dict.get("profile") |
305 | | - profile_outputs = profiles.get(dbt_profile) |
306 | | - profile_target = profile_outputs.get("target") |
307 | | - credentials = profile_outputs.get("outputs").get(profile_target) |
308 | | - conn_type = credentials.get("type").lower() |
| 306 | + |
| 307 | + profile_outputs = get_from_dict_with_raise( |
| 308 | + profiles, dbt_profile, f"No profile '{dbt_profile}' found in '{profiles_path}'." |
| 309 | + ) |
| 310 | + profile_target = get_from_dict_with_raise( |
| 311 | + profile_outputs, "target", f"No target found in profile '{dbt_profile}' in '{profiles_path}'." |
| 312 | + ) |
| 313 | + outputs = get_from_dict_with_raise( |
| 314 | + profile_outputs, "outputs", f"No outputs found in profile '{dbt_profile}' in '{profiles_path}'." |
| 315 | + ) |
| 316 | + credentials = get_from_dict_with_raise( |
| 317 | + outputs, |
| 318 | + profile_target, |
| 319 | + f"No credentials found for target '{profile_target}' in profile '{dbt_profile}' in '{profiles_path}'.", |
| 320 | + ) |
| 321 | + conn_type = get_from_dict_with_raise( |
| 322 | + credentials, |
| 323 | + "type", |
| 324 | + f"No type found for target '{profile_target}' in profile '{dbt_profile}' in '{profiles_path}'.", |
| 325 | + ) |
| 326 | + conn_type = conn_type.lower() |
309 | 327 |
|
310 | 328 | # values can contain env_vars |
311 | 329 | rendered_credentials = ProfileRenderer().render_data(credentials) |
| 330 | + return rendered_credentials, conn_type |
| 331 | + |
| 332 | + def set_connection(self): |
| 333 | + rendered_credentials, conn_type = self._get_connection_creds() |
312 | 334 |
|
313 | 335 | if conn_type == "snowflake": |
314 | 336 | if rendered_credentials.get("password") is None or rendered_credentials.get("private_key_path") is not None: |
|
0 commit comments