airbyte-internal-ops 0.5.1__py3-none-any.whl → 0.5.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-internal-ops
3
- Version: 0.5.1
3
+ Version: 0.5.2
4
4
  Summary: MCP and API interfaces that let the agents do the admin work
5
5
  Author-email: Aaron Steers <aj@airbyte.io>
6
6
  Keywords: admin,airbyte,api,mcp
@@ -245,7 +245,7 @@ airbyte_ops_mcp/cli/__init__.py,sha256=XpL7FyVfgabfBF2JR7u7NwJ2krlYqjd_OwLcWf-Xc
245
245
  airbyte_ops_mcp/cli/_base.py,sha256=I8tWnyQf0ks4r3J8N8h-5GZxyn37T-55KsbuHnxYlcg,415
246
246
  airbyte_ops_mcp/cli/_shared.py,sha256=jg-xMyGzTCGPqKd8VTfE_3kGPIyO_3Kx5sQbG4rPc0Y,1311
247
247
  airbyte_ops_mcp/cli/app.py,sha256=SEdBpqFUG2O8zGV5ifwptxrLGFph_dLr66-MX9d69gQ,789
248
- airbyte_ops_mcp/cli/cloud.py,sha256=18SiVVMAibzPpGiEgKiga1BZ5x4QlLREOLd_VmNZwSo,45831
248
+ airbyte_ops_mcp/cli/cloud.py,sha256=jac0FcG3UvNNeNNhqZR04uY9BCyVvins1kjO0LRZ86Y,45861
249
249
  airbyte_ops_mcp/cli/gh.py,sha256=koJPu0MDB6AW7mJq2z4dZV65ofvsZTkqoeitGF8KJR8,5364
250
250
  airbyte_ops_mcp/cli/registry.py,sha256=L4nDKhlegr31gSE-GUvDFSq10KgDz5kJuZXgLIxYIyg,9785
251
251
  airbyte_ops_mcp/cli/repo.py,sha256=G1hoQpH0XYhUH3FFOsia9xabGB0LP9o3XcwBuqvFVo0,16331
@@ -286,12 +286,12 @@ airbyte_ops_mcp/prod_db_access/sql.py,sha256=E7HQratZC5LbCXdvpQzZRd09SmCVnY_4Ru-
286
286
  airbyte_ops_mcp/registry/__init__.py,sha256=iEaPlt9GrnlaLbc__98TguNeZG8wuQu7S-_2QkhHcbA,858
287
287
  airbyte_ops_mcp/registry/models.py,sha256=B4L4TKr52wo0xs0CqvCBrpowqjShzVnZ5eTr2-EyhNs,2346
288
288
  airbyte_ops_mcp/registry/publish.py,sha256=VoPxsM2_0zJ829orzCRN-kjgcJtuBNyXgW4I9J680ro,12717
289
- airbyte_ops_mcp/regression_tests/__init__.py,sha256=8pwJIdz1Lb9oFV6UQ3DSjYKd8HCSqU8RpH5SDgEcEBA,1038
289
+ airbyte_ops_mcp/regression_tests/__init__.py,sha256=qdveN866w50VmiDmTD0IW8Buo4UUn_1m9mKNS6hgj5U,1092
290
290
  airbyte_ops_mcp/regression_tests/cdk_secrets.py,sha256=iRjqqBS96KZoswfgT7ju-pE_pfbYoDy4PfrK-K8uyYs,3204
291
291
  airbyte_ops_mcp/regression_tests/ci_output.py,sha256=os69gcEhbomrGRAfnwPYAXhsAiJSWOuyW1gWZPx9-hw,15498
292
292
  airbyte_ops_mcp/regression_tests/config.py,sha256=dwWeY0tatdbwl9BqbhZ7EljoZDCtKmGO5fvOAIxeXmA,5873
293
293
  airbyte_ops_mcp/regression_tests/connection_fetcher.py,sha256=laGkxVfDl8_S-Azst28wijvPnOB-bmuuk2B_2e-0yjY,13170
294
- airbyte_ops_mcp/regression_tests/connection_secret_retriever.py,sha256=FhWNVWq7sON4nwUmVJv8BgXBOqg1YV4b5WuWyCzZ0LU,4695
294
+ airbyte_ops_mcp/regression_tests/connection_secret_retriever.py,sha256=e2RvLEtAcpSHnYobP3wGNYGk8VNVI6MallX3cS0UPgA,5561
295
295
  airbyte_ops_mcp/regression_tests/connector_runner.py,sha256=OZzUa2aLh0sHaEARsDePOA-e3qEX4cvh3Jhnvi8S1rY,10130
296
296
  airbyte_ops_mcp/regression_tests/evaluation_modes.py,sha256=lAL6pEDmy_XCC7_m4_NXjt_f6Z8CXeAhMkc0FU8bm_M,1364
297
297
  airbyte_ops_mcp/regression_tests/http_metrics.py,sha256=busCYLb7qID0vv7yAtzARf__-HukpE3mAoc-pYI_gCQ,13256
@@ -306,7 +306,7 @@ airbyte_ops_mcp/regression_tests/regression/comparators.py,sha256=MJkLZEKHivgrG0
306
306
  airbyte_ops_mcp/regression_tests/validation/__init__.py,sha256=MBEwGOoNuqT4_oCahtoK62OKWIjUCfWa7vZTxNj_0Ek,1532
307
307
  airbyte_ops_mcp/regression_tests/validation/catalog_validators.py,sha256=jqqVAMOk0mtdPgwu4d0hA0ZEjtsNh5gapvGydRv3_qk,12553
308
308
  airbyte_ops_mcp/regression_tests/validation/record_validators.py,sha256=RjauAhKWNwxMBTu0eNS2hMFNQVs5CLbQU51kp6FOVDk,7432
309
- airbyte_internal_ops-0.5.1.dist-info/METADATA,sha256=6FSpbOvu29YiilQjtOkOgmjW66Pxx-AlPciUPTmM8G0,5731
310
- airbyte_internal_ops-0.5.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
311
- airbyte_internal_ops-0.5.1.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
312
- airbyte_internal_ops-0.5.1.dist-info/RECORD,,
309
+ airbyte_internal_ops-0.5.2.dist-info/METADATA,sha256=vKolAxrXmB-dgddkjeQxYNZZL0ID11L51nID5LeMkMk,5731
310
+ airbyte_internal_ops-0.5.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
311
+ airbyte_internal_ops-0.5.2.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
312
+ airbyte_internal_ops-0.5.2.dist-info/RECORD,,
@@ -65,6 +65,7 @@ from airbyte_ops_mcp.regression_tests.connection_fetcher import (
65
65
  save_connection_data_to_files,
66
66
  )
67
67
  from airbyte_ops_mcp.regression_tests.connection_secret_retriever import (
68
+ SecretRetrievalError,
68
69
  enrich_config_with_secrets,
69
70
  should_use_secret_retriever,
70
71
  )
@@ -847,13 +848,14 @@ def regression_test(
847
848
  retrieval_reason="Regression test with USE_CONNECTION_SECRET_RETRIEVER=true",
848
849
  )
849
850
  print_success("Successfully retrieved unmasked secrets from database")
850
- except Exception as e:
851
- print_error(f"Failed to retrieve unmasked secrets: {e}")
851
+ except SecretRetrievalError as e:
852
+ write_github_output("success", False)
853
+ write_github_output("error", str(e))
852
854
  exit_with_error(
853
- f"Failed to retrieve unmasked secrets: {e}\n"
854
- f"Unset USE_CONNECTION_SECRET_RETRIEVER or verify that the "
855
- f"{ENV_GCP_PROD_DB_ACCESS_CREDENTIALS} environment variable is set "
856
- f"with valid database credentials and that the Cloud SQL Proxy is running."
855
+ f"{e}\n\n"
856
+ f"This connection cannot be used for regression testing. "
857
+ f"Please use a connection from a non-EU workspace, or use GSM-based "
858
+ f"integration test credentials instead (by omitting --connection-id)."
857
859
  )
858
860
 
859
861
  config_file, catalog_file = save_connection_data_to_files(
@@ -10,6 +10,7 @@ from airbyte_ops_mcp.regression_tests.connection_fetcher import (
10
10
  fetch_connection_data,
11
11
  )
12
12
  from airbyte_ops_mcp.regression_tests.connection_secret_retriever import (
13
+ SecretRetrievalError,
13
14
  enrich_config_with_secrets,
14
15
  is_secret_retriever_enabled,
15
16
  retrieve_unmasked_config,
@@ -27,6 +28,7 @@ __all__ = [
27
28
  "ConnectionData",
28
29
  "ConnectorUnderTest",
29
30
  "ExecutionResult",
31
+ "SecretRetrievalError",
30
32
  "TargetOrControl",
31
33
  "enrich_config_with_secrets",
32
34
  "fetch_connection_data",
@@ -107,9 +107,18 @@ def retrieve_unmasked_config(
107
107
  return None
108
108
 
109
109
 
110
+ class SecretRetrievalError(Exception):
111
+ """Raised when secret retrieval fails.
112
+
113
+ This exception is raised when USE_CONNECTION_SECRET_RETRIEVER is enabled
114
+ but secrets cannot be retrieved (e.g., EU data residency restrictions).
115
+ """
116
+
117
+
110
118
  def enrich_config_with_secrets(
111
119
  connection_data: ConnectionData,
112
120
  retrieval_reason: str = "MCP live tests",
121
+ raise_on_failure: bool = True,
113
122
  ) -> ConnectionData:
114
123
  """Enrich connection data with unmasked secrets from internal retriever.
115
124
 
@@ -120,10 +129,16 @@ def enrich_config_with_secrets(
120
129
  Args:
121
130
  connection_data: The connection data to enrich.
122
131
  retrieval_reason: Reason for retrieval (for audit logging).
132
+ raise_on_failure: If True (default), raise SecretRetrievalError when
133
+ secrets cannot be retrieved. If False, return the original
134
+ connection_data with masked secrets (legacy behavior).
123
135
 
124
136
  Returns:
125
- A new ConnectionData with unmasked config, or the original if
126
- retrieval fails or is not available.
137
+ A new ConnectionData with unmasked config.
138
+
139
+ Raises:
140
+ SecretRetrievalError: If raise_on_failure is True and secrets cannot
141
+ be retrieved (e.g., due to EU data residency restrictions).
127
142
  """
128
143
  unmasked_config = retrieve_unmasked_config(
129
144
  connection_id=connection_data.connection_id,
@@ -131,10 +146,15 @@ def enrich_config_with_secrets(
131
146
  )
132
147
 
133
148
  if unmasked_config is None:
134
- logger.info(
135
- f"Could not retrieve unmasked config for {connection_data.connection_id}, "
136
- "using masked config from Cloud API"
149
+ error_msg = (
150
+ "Could not retrieve unmasked secrets for connection "
151
+ f"{connection_data.connection_id}. This may be due to EU data "
152
+ "residency restrictions or database connectivity issues. "
153
+ "The connection's credentials cannot be used for regression testing."
137
154
  )
155
+ logger.warning(error_msg)
156
+ if raise_on_failure:
157
+ raise SecretRetrievalError(error_msg)
138
158
  return connection_data
139
159
 
140
160
  logger.info(