|
1 | 1 | from dataclasses import dataclass |
2 | 2 | from typing import Callable |
| 3 | +from uuid import UUID |
3 | 4 |
|
4 | 5 | from config.env import env |
5 | 6 |
|
|
17 | 18 | PROWLER_FINDING_LABEL = "ProwlerFinding" |
18 | 19 | PROVIDER_RESOURCE_LABEL = "_ProviderResource" |
19 | 20 |
|
| 21 | +# Dynamic isolation labels that contain entity UUIDs and are added to every synced node during sync |
| 22 | +# Format: _Tenant_{uuid_no_hyphens}, _Provider_{uuid_no_hyphens} |
| 23 | +TENANT_LABEL_PREFIX = "_Tenant_" |
| 24 | +PROVIDER_LABEL_PREFIX = "_Provider_" |
| 25 | +DYNAMIC_ISOLATION_PREFIXES = [TENANT_LABEL_PREFIX, PROVIDER_LABEL_PREFIX] |
| 26 | + |
20 | 27 |
|
21 | 28 | @dataclass(frozen=True) |
22 | 29 | class ProviderConfig: |
@@ -107,3 +114,27 @@ def get_provider_resource_label(provider_type: str) -> str: |
107 | 114 | """Get the resource label for a provider type (e.g., `_AWSResource`).""" |
108 | 115 | config = PROVIDER_CONFIGS.get(provider_type) |
109 | 116 | return config.resource_label if config else "_UnknownProviderResource" |
| 117 | + |
| 118 | + |
| 119 | +# Dynamic Isolation Label Helpers |
| 120 | +# -------------------------------- |
| 121 | + |
| 122 | + |
| 123 | +def _normalize_uuid(value: str | UUID) -> str: |
| 124 | + """Strip hyphens from a UUID string for use in Neo4j labels.""" |
| 125 | + return str(value).replace("-", "") |
| 126 | + |
| 127 | + |
| 128 | +def get_tenant_label(tenant_id: str | UUID) -> str: |
| 129 | + """Get the Neo4j label for a tenant (e.g., `_Tenant_019c41ee7df37deca684d839f95619f8`).""" |
| 130 | + return f"{TENANT_LABEL_PREFIX}{_normalize_uuid(tenant_id)}" |
| 131 | + |
| 132 | + |
| 133 | +def get_provider_label(provider_id: str | UUID) -> str: |
| 134 | + """Get the Neo4j label for a provider (e.g., `_Provider_019c41ee7df37deca684d839f95619f8`).""" |
| 135 | + return f"{PROVIDER_LABEL_PREFIX}{_normalize_uuid(provider_id)}" |
| 136 | + |
| 137 | + |
| 138 | +def is_dynamic_isolation_label(label: str) -> bool: |
| 139 | + """Check if a label is a dynamic tenant/provider isolation label.""" |
| 140 | + return any(label.startswith(prefix) for prefix in DYNAMIC_ISOLATION_PREFIXES) |
0 commit comments