Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion linode_api4/objects/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,19 @@ class DashboardType(StrEnum):
custom = "custom"


class AlertStatus(StrEnum):
"""
Enum for supported alert status values.
"""

AlertDefinitionStatusProvisioning = "provisioning"
AlertDefinitionStatusEnabling = "enabling"
AlertDefinitionStatusDisabling = "disabling"
AlertDefinitionStatusEnabled = "enabled"
AlertDefinitionStatusDisabled = "disabled"
AlertDefinitionStatusFailed = "failed"


@dataclass
class Filter(JSONObject):
"""
Expand Down Expand Up @@ -428,6 +441,40 @@ class ChannelContent(JSONObject):
# Other channel types like 'webhook', 'slack' could be added here as Optional fields.


@dataclass
class EmailDetails(JSONObject):
"""
Represents email-specific details for an alert channel.
"""

usernames: Optional[List[str]] = None
recipient_type: Optional[str] = None


@dataclass
class ChannelDetails(JSONObject):
"""
Represents the details block for an AlertChannel, which varies by channel type.
"""

email: Optional[EmailDetails] = None


@dataclass
class AlertInfo(JSONObject):
"""
Represents a reference to alerts associated with an alert channel.
Fields:
- url: str - API URL to fetch the alerts for this channel
- type: str - Type identifier (e.g., 'alerts-definitions')
- alert_count: int - Number of alerts associated with this channel
"""

url: str = ""
_type: str = field(default="", metadata={"json_key": "type"})
alert_count: int = 0


class AlertChannel(Base):
"""
Represents an alert channel used to deliver notifications when alerts
Expand All @@ -450,7 +497,8 @@ class AlertChannel(Base):
"label": Property(),
"type": Property(),
"channel_type": Property(),
"alerts": Property(mutable=False, json_object=Alerts),
"details": Property(mutable=False, json_object=ChannelDetails),
"alerts": Property(mutable=False, json_object=AlertInfo),
"content": Property(mutable=False, json_object=ChannelContent),
"created": Property(is_datetime=True),
"updated": Property(is_datetime=True),
Expand Down
4 changes: 3 additions & 1 deletion test/integration/models/monitor/test_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
MonitorService,
MonitorServiceToken,
)
from linode_api4.objects.monitor import AlertStatus


# List all dashboards
Expand Down Expand Up @@ -227,7 +228,8 @@ def wait_for_alert_ready(alert_id, service_type: str):
interval = initial_timeout
alert = client.load(AlertDefinition, alert_id, service_type)
while (
getattr(alert, "status", None) == "in progress"
getattr(alert, "status", None)
== AlertStatus.AlertDefinitionStatusEnabling
Comment on lines +231 to +232
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit concern here. Since the in progress status is replaced by three different status, I wonder if it's safer to consider the two more status disabling, provisioning here as well?

and (time.time() - start) < timeout
):
time.sleep(interval)
Expand Down