Files
wehub-resource-sync 4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:10:45 +08:00

103 lines
3.4 KiB
Python

"""Shared AWS RDS integration helpers.
Provides configuration normalization, source detection, and parameter
extraction for the RDS investigation tools. All AWS API calls are
read-only and routed through the shared aws_sdk_client allowlist.
"""
from __future__ import annotations
import logging
from typing import Any
from config.strict_config import StrictConfigModel
from integrations._relational import env_str
from integrations._validation_helpers import report_classify_failure
logger = logging.getLogger(__name__)
DEFAULT_RDS_REGION = "us-east-1"
class RDSConfig(StrictConfigModel):
"""Normalized RDS connection settings."""
db_instance_identifier: str = ""
region: str = DEFAULT_RDS_REGION
integration_id: str = ""
@property
def is_configured(self) -> bool:
return bool(self.db_instance_identifier and self.region)
def build_rds_config(raw: dict[str, Any] | None) -> RDSConfig:
"""Build a normalized RDS config object from env/store data."""
return RDSConfig.model_validate(raw or {})
def rds_config_from_env() -> RDSConfig | None:
"""Load an RDS config from env vars."""
db_id = env_str("RDS_DB_INSTANCE_IDENTIFIER")
if not db_id:
return None
return build_rds_config(
{
"db_instance_identifier": db_id,
"region": env_str("AWS_REGION") or env_str("RDS_REGION") or DEFAULT_RDS_REGION,
}
)
def rds_is_available(sources: dict[str, dict]) -> bool:
"""Check if RDS integration identifying params are present.
A scenario-injected ``_backend`` (FixtureAWSBackend in synthetic tests)
counts on its own — synthetic scenarios always carry the DB identifier
in scenario metadata, and we want the RDS tools to be selectable in
synthetic mode regardless of whether the alert annotations also surfaced
the identifier.
"""
rds = sources.get("rds", {})
return bool(rds.get("db_instance_identifier") or rds.get("_backend"))
def rds_extract_params(sources: dict[str, dict]) -> dict[str, Any]:
"""Extract RDS identifying params (db_instance_identifier, region).
Forwards the optional synthetic ``_backend`` handle as ``aws_backend`` so
the RDS tools can short-circuit to fixture data instead of hitting real
boto3. Without this hop, ``execute_aws_sdk_call`` would silently leak to
whatever AWS account the developer happens to be authenticated against
during a synthetic test run.
"""
rds = sources.get("rds", {})
region = (
str(rds.get("region") or "").strip()
or env_str("AWS_REGION")
or env_str("RDS_REGION")
or DEFAULT_RDS_REGION
)
return {
"db_instance_identifier": str(rds.get("db_instance_identifier", "")).strip(),
"region": region,
"aws_backend": rds.get("_backend"),
}
def classify(credentials: dict[str, Any], record_id: str) -> tuple[RDSConfig | None, str | None]:
try:
cfg = build_rds_config(
{
"db_instance_identifier": credentials.get("db_instance_identifier", ""),
"region": credentials.get("region", DEFAULT_RDS_REGION),
"integration_id": record_id,
}
)
except Exception as exc:
report_classify_failure(exc, logger=logger, integration="rds", record_id=record_id)
return None, None
if cfg.is_configured:
return cfg, "rds"
return None, None