Skip to content

Commit 12404aa

Browse files
committed
refactor: drop ProviderType enum, use str
ProviderType(str, Enum) carried hard-coded provider names (AWS, PROVIDER1, Provider2) in the domain layer, forcing an edit there for every new provider. All usages in the codebase already only needed the string value, so the enum added no safety benefit. - domain/base/provider_interfaces.py: remove ProviderType enum; ProviderResourceIdentifier.provider_type, ProviderAdapter.provider_type and ProviderAdapterFactory signatures now use plain str. - domain/base/events/provider_events.py: six event classes now carry provider_type: str; drop .value accesses in model_post_init bodies. - providers/aws/strategy/aws_provider_adapter.py: provider_type property returns "aws" string; ProviderResourceIdentifier constructed with provider_type="aws".
1 parent ae08236 commit 12404aa

3 files changed

Lines changed: 28 additions & 37 deletions

File tree

src/orb/domain/base/events/provider_events.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
from pydantic import Field
77

88
from orb.domain.base.events.base_events import DomainEvent
9-
from orb.domain.base.provider_interfaces import ProviderInstanceState, ProviderType
9+
from orb.domain.base.provider_interfaces import ProviderInstanceState
1010

1111

1212
class ProviderOperationEvent(DomainEvent):
1313
"""Event raised for provider operations."""
1414

15-
provider_type: ProviderType
15+
provider_type: str # e.g. "aws"
1616
operation_type: str # e.g., "create_instance", "terminate_instance"
1717
provider_resource_type: str # e.g., "instance", "volume"
1818
provider_resource_id: Optional[str] = Field(default=None)
@@ -23,7 +23,7 @@ def model_post_init(self, __context: Any) -> None:
2323
"""Initialize aggregate information after model creation."""
2424
# Set the base class fields
2525
object.__setattr__(self, "aggregate_id", self.provider_resource_id or str(uuid4()))
26-
object.__setattr__(self, "aggregate_type", f"{self.provider_type.value}_resource")
26+
object.__setattr__(self, "aggregate_type", f"{self.provider_type}_resource")
2727
super().model_post_init(__context)
2828
if not self.operation_type:
2929
raise ValueError("Operation type cannot be empty")
@@ -34,15 +34,15 @@ def model_post_init(self, __context: Any) -> None:
3434
class ProviderRateLimitEvent(DomainEvent):
3535
"""Event raised when provider rate limiting occurs."""
3636

37-
provider_type: ProviderType
37+
provider_type: str # e.g. "aws"
3838
service_name: str
3939
operation_name: str
4040
retry_after: Optional[int] = Field(default=None) # seconds
4141

4242
def model_post_init(self, __context: Any) -> None:
4343
"""Initialize aggregate information after model creation."""
44-
object.__setattr__(self, "aggregate_id", f"{self.provider_type.value}_{self.service_name}")
45-
object.__setattr__(self, "aggregate_type", f"{self.provider_type.value}_service")
44+
object.__setattr__(self, "aggregate_id", f"{self.provider_type}_{self.service_name}")
45+
object.__setattr__(self, "aggregate_type", f"{self.provider_type}_service")
4646
super().model_post_init(__context)
4747
if not self.service_name:
4848
raise ValueError("Service name cannot be empty")
@@ -53,16 +53,16 @@ def model_post_init(self, __context: Any) -> None:
5353
class ProviderCredentialsEvent(DomainEvent):
5454
"""Event raised for provider credentials operations."""
5555

56-
provider_type: ProviderType
56+
provider_type: str # e.g. "aws"
5757
credential_type: str # e.g., "access_key", "service_account", "managed_identity"
5858
operation: str # e.g., "refresh", "validate", "expire"
5959
status: str # success, failure, warning
6060
message: Optional[str] = Field(default=None)
6161

6262
def model_post_init(self, __context: Any) -> None:
6363
"""Initialize aggregate information after model creation."""
64-
object.__setattr__(self, "aggregate_id", f"{self.provider_type.value}_credentials")
65-
object.__setattr__(self, "aggregate_type", f"{self.provider_type.value}_auth")
64+
object.__setattr__(self, "aggregate_id", f"{self.provider_type}_credentials")
65+
object.__setattr__(self, "aggregate_type", f"{self.provider_type}_auth")
6666
super().model_post_init(__context)
6767
if not self.credential_type:
6868
raise ValueError("Credential type cannot be empty")
@@ -75,7 +75,7 @@ def model_post_init(self, __context: Any) -> None:
7575
class ProviderResourceStateChangedEvent(DomainEvent):
7676
"""Event raised when provider resource state changes."""
7777

78-
provider_type: ProviderType
78+
provider_type: str # e.g. "aws"
7979
resource_type: str
8080
resource_id: str
8181
previous_state: Optional[ProviderInstanceState] = Field(default=None)
@@ -86,7 +86,7 @@ def model_post_init(self, __context: Any) -> None:
8686
"""Initialize aggregate information after model creation."""
8787
object.__setattr__(self, "aggregate_id", self.resource_id)
8888
object.__setattr__(
89-
self, "aggregate_type", f"{self.provider_type.value}_{self.resource_type}"
89+
self, "aggregate_type", f"{self.provider_type}_{self.resource_type}"
9090
)
9191
super().model_post_init(__context)
9292
if not self.resource_type:
@@ -98,16 +98,16 @@ def model_post_init(self, __context: Any) -> None:
9898
class ProviderConfigurationEvent(DomainEvent):
9999
"""Event raised for provider configuration changes."""
100100

101-
provider_type: ProviderType
101+
provider_type: str # e.g. "aws"
102102
configuration_type: str # e.g., "region", "endpoint", "timeout"
103103
old_value: Optional[str] = Field(default=None)
104104
new_value: Optional[str] = Field(default=None)
105105
operation: str = Field(default="update") # update, validate, reset
106106

107107
def model_post_init(self, __context: Any) -> None:
108108
"""Initialize aggregate information after model creation."""
109-
object.__setattr__(self, "aggregate_id", f"{self.provider_type.value}_config")
110-
object.__setattr__(self, "aggregate_type", f"{self.provider_type.value}_configuration")
109+
object.__setattr__(self, "aggregate_id", f"{self.provider_type}_config")
110+
object.__setattr__(self, "aggregate_type", f"{self.provider_type}_configuration")
111111
super().model_post_init(__context)
112112
if not self.configuration_type:
113113
raise ValueError("Configuration type cannot be empty")
@@ -116,16 +116,16 @@ def model_post_init(self, __context: Any) -> None:
116116
class ProviderHealthCheckEvent(DomainEvent):
117117
"""Event raised for provider health checks."""
118118

119-
provider_type: ProviderType
119+
provider_type: str # e.g. "aws"
120120
service_name: str
121121
health_status: str # healthy, unhealthy, degraded
122122
response_time_ms: Optional[int] = Field(default=None)
123123
error_message: Optional[str] = Field(default=None)
124124

125125
def model_post_init(self, __context: Any) -> None:
126126
"""Initialize aggregate information after model creation."""
127-
object.__setattr__(self, "aggregate_id", f"{self.provider_type.value}_{self.service_name}")
128-
object.__setattr__(self, "aggregate_type", f"{self.provider_type.value}_health")
127+
object.__setattr__(self, "aggregate_id", f"{self.provider_type}_{self.service_name}")
128+
object.__setattr__(self, "aggregate_type", f"{self.provider_type}_health")
129129
super().model_post_init(__context)
130130
if not self.service_name:
131131
raise ValueError("Service name cannot be empty")

src/orb/domain/base/provider_interfaces.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
"""Provider interfaces for domain layer - comprehensive provider abstraction."""
22

33
from dataclasses import dataclass
4-
from enum import Enum
4+
from enum import Enum # retained for ProviderInstanceState
55
from typing import Optional, Protocol
66

77

8-
class ProviderType(str, Enum):
9-
"""Supported provider types."""
10-
11-
AWS = "aws"
12-
PROVIDER1 = "provider1"
13-
Provider2 = "provider2"
14-
15-
168
class ProviderInstanceState(str, Enum):
179
"""Provider-agnostic instance states."""
1810

@@ -51,7 +43,7 @@ def __post_init__(self) -> None:
5143
class ProviderResourceIdentifier:
5244
"""Provider-agnostic resource identifier."""
5345

54-
provider_type: ProviderType
46+
provider_type: str # e.g. "aws"
5547
resource_type: str # e.g., "instance", "volume", "network"
5648
identifier: str # Provider-specific ID
5749
region: Optional[str] = None
@@ -109,8 +101,8 @@ class ProviderAdapter(Protocol):
109101
"""Main provider adapter interface."""
110102

111103
@property
112-
def provider_type(self) -> ProviderType:
113-
"""Get the provider type."""
104+
def provider_type(self) -> str:
105+
"""Get the provider type (e.g. ``"aws"``)."""
114106
...
115107

116108
@property
@@ -140,10 +132,10 @@ def create_launch_template(
140132
class ProviderAdapterFactory(Protocol):
141133
"""Factory for creating provider adapters."""
142134

143-
def create_adapter(self, provider_type: ProviderType) -> ProviderAdapter:
144-
"""Create a provider adapter for the specified type."""
135+
def create_adapter(self, provider_type: str) -> ProviderAdapter:
136+
"""Create a provider adapter for the specified type (e.g. ``"aws"``)."""
145137
...
146138

147-
def get_supported_providers(self) -> list[ProviderType]:
148-
"""Get list of supported provider types."""
139+
def get_supported_providers(self) -> list[str]:
140+
"""Get list of supported provider type names."""
149141
...

src/orb/providers/aws/strategy/aws_provider_adapter.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
ProviderResourceTag,
1313
ProviderResourceValidator,
1414
ProviderStateMapper,
15-
ProviderType,
1615
)
1716

1817

@@ -120,9 +119,9 @@ def __init__(self, logger: LoggingPort) -> None:
120119
self._logger = logger
121120

122121
@property
123-
def provider_type(self) -> ProviderType:
122+
def provider_type(self) -> str:
124123
"""Get the provider type."""
125-
return ProviderType.AWS
124+
return "aws"
126125

127126
@property
128127
def state_mapper(self) -> ProviderStateMapper:
@@ -143,7 +142,7 @@ def create_resource_identifier(
143142
raise ValueError(f"Invalid AWS {resource_type} identifier: {identifier}")
144143

145144
return ProviderResourceIdentifier(
146-
provider_type=ProviderType.AWS,
145+
provider_type="aws",
147146
resource_type=resource_type,
148147
identifier=identifier,
149148
region=region,

0 commit comments

Comments
 (0)