diff --git a/CHANGELOG.md b/CHANGELOG.md index e0675bf9..8b8788de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ - **Deprecation:** The `backend` field is now deprecated in all relevant models. Use the new `protection` field instead - `iaas`: [v0.8.1](services/iaas/CHANGELOG.md#v081) - **Internal:** Add workaround to fix upstream OpenAPI generator issue where regex patterns include leading/trailing slashes that need to be removed for validation in `AllowedAddressesInner`, `AreaId`, and `CreateProtocol` models -- `observability`: [v0.9.0](services/observability/CHANGELOG.md#v090) +- `observability`: + - [v0.9.1](services/observability/CHANGELOG.md#v091) + - Introduce new model `UpdateAlertConfigsPayloadRouteRoutesInner` + - [v0.9.0](services/observability/CHANGELOG.md#v090) - **Feature:** Add new `GoogleChat` webhook ## Release (2025-08-13) diff --git a/services/observability/CHANGELOG.md b/services/observability/CHANGELOG.md index 52d781d8..75070e15 100644 --- a/services/observability/CHANGELOG.md +++ b/services/observability/CHANGELOG.md @@ -1,3 +1,6 @@ +## v0.9.1 +- Introduce new model `UpdateAlertConfigsPayloadRouteRoutesInner` + ## v0.9.0 - **Feature:** Add new `GoogleChat` webhook diff --git a/services/observability/pyproject.toml b/services/observability/pyproject.toml index cd35274d..59d95746 100644 --- a/services/observability/pyproject.toml +++ b/services/observability/pyproject.toml @@ -3,7 +3,7 @@ name = "stackit-observability" [tool.poetry] name = "stackit-observability" -version = "v0.9.0" +version = "v0.9.1" authors = [ "STACKIT Developer Tools ", ] diff --git a/services/observability/src/stackit/observability/__init__.py b/services/observability/src/stackit/observability/__init__.py index 92727d97..0be81cbb 100644 --- a/services/observability/src/stackit/observability/__init__.py +++ b/services/observability/src/stackit/observability/__init__.py @@ -112,6 +112,7 @@ "UpdateAlertConfigsPayloadInhibitRules", "UpdateAlertConfigsPayloadReceiversInner", "UpdateAlertConfigsPayloadRoute", + "UpdateAlertConfigsPayloadRouteRoutesInner", "UpdateAlertConfigsResponse", "UpdateAlertgroupPayload", "UpdateAlertgroupsRequestInner", @@ -343,6 +344,9 @@ from stackit.observability.models.update_alert_configs_payload_route import ( UpdateAlertConfigsPayloadRoute as UpdateAlertConfigsPayloadRoute, ) +from stackit.observability.models.update_alert_configs_payload_route_routes_inner import ( + UpdateAlertConfigsPayloadRouteRoutesInner as UpdateAlertConfigsPayloadRouteRoutesInner, +) from stackit.observability.models.update_alert_configs_response import ( UpdateAlertConfigsResponse as UpdateAlertConfigsResponse, ) diff --git a/services/observability/src/stackit/observability/models/__init__.py b/services/observability/src/stackit/observability/models/__init__.py index a0334928..3b086777 100644 --- a/services/observability/src/stackit/observability/models/__init__.py +++ b/services/observability/src/stackit/observability/models/__init__.py @@ -168,6 +168,9 @@ from stackit.observability.models.update_alert_configs_payload_route import ( UpdateAlertConfigsPayloadRoute, ) +from stackit.observability.models.update_alert_configs_payload_route_routes_inner import ( + UpdateAlertConfigsPayloadRouteRoutesInner, +) from stackit.observability.models.update_alert_configs_response import ( UpdateAlertConfigsResponse, ) diff --git a/services/observability/src/stackit/observability/models/update_alert_configs_payload_route.py b/services/observability/src/stackit/observability/models/update_alert_configs_payload_route.py index fa3616e2..7b693ad8 100644 --- a/services/observability/src/stackit/observability/models/update_alert_configs_payload_route.py +++ b/services/observability/src/stackit/observability/models/update_alert_configs_payload_route.py @@ -21,8 +21,8 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool from typing_extensions import Annotated, Self -from stackit.observability.models.create_alert_config_route_payload_routes_inner import ( - CreateAlertConfigRoutePayloadRoutesInner, +from stackit.observability.models.update_alert_configs_payload_route_routes_inner import ( + UpdateAlertConfigsPayloadRouteRoutesInner, ) @@ -60,10 +60,6 @@ class UpdateAlertConfigsPayloadRoute(BaseModel): description="map of key:value. A set of regex-matchers an alert has to fulfill to match the node. `Additional Validators:` * should not contain more than 5 keys * each key and value should not be longer than 200 characters", alias="matchRe", ) - matchers: Optional[List[Annotated[str, Field(min_length=1, strict=True, max_length=200)]]] = Field( - default=None, - description="A list of matchers that an alert has to fulfill to match the node. A matcher is a string with a syntax inspired by PromQL and OpenMetrics. The syntax of a matcher consists of three tokens: * A valid Prometheus label name. * One of =, !=, =~, or !~. = means equals, != means that the strings are not equal, =~ is used for equality of regex expressions and !~ is used for un-equality of regex expressions. They have the same meaning as known from PromQL selectors. * A UTF-8 string, which may be enclosed in double quotes. Before or after each token, there may be any amount of whitespace. `Additional Validators:` * should not contain more than 5 keys * each key and value should not be longer than 200 characters", - ) receiver: Annotated[str, Field(min_length=1, strict=True, max_length=200)] = Field( description="Receiver that should be one item of receivers `Additional Validators:` * must be a in name of receivers" ) @@ -72,7 +68,7 @@ class UpdateAlertConfigsPayloadRoute(BaseModel): description="How long to wait before sending a notification again if it has already been sent successfully for an alert. (Usually ~3h or more). `Additional Validators:` * must be a valid time format", alias="repeatInterval", ) - routes: Optional[List[CreateAlertConfigRoutePayloadRoutesInner]] = Field( + routes: Optional[List[UpdateAlertConfigsPayloadRouteRoutesInner]] = Field( default=None, description="Zero or more child routes." ) __properties: ClassVar[List[str]] = [ @@ -82,7 +78,6 @@ class UpdateAlertConfigsPayloadRoute(BaseModel): "groupWait", "match", "matchRe", - "matchers", "receiver", "repeatInterval", "routes", @@ -151,11 +146,10 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "groupWait": obj.get("groupWait") if obj.get("groupWait") is not None else "30s", "match": obj.get("match"), "matchRe": obj.get("matchRe"), - "matchers": obj.get("matchers"), "receiver": obj.get("receiver"), "repeatInterval": obj.get("repeatInterval") if obj.get("repeatInterval") is not None else "4h", "routes": ( - [CreateAlertConfigRoutePayloadRoutesInner.from_dict(_item) for _item in obj["routes"]] + [UpdateAlertConfigsPayloadRouteRoutesInner.from_dict(_item) for _item in obj["routes"]] if obj.get("routes") is not None else None ), diff --git a/services/observability/src/stackit/observability/models/update_alert_configs_payload_route_routes_inner.py b/services/observability/src/stackit/observability/models/update_alert_configs_payload_route_routes_inner.py new file mode 100644 index 00000000..0298bbef --- /dev/null +++ b/services/observability/src/stackit/observability/models/update_alert_configs_payload_route_routes_inner.py @@ -0,0 +1,128 @@ +# coding: utf-8 + +""" + STACKIT Observability API + + API endpoints for Observability on STACKIT + + The version of the OpenAPI document: 1.1.1 + Contact: stackit-argus@mail.schwarz + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + +from __future__ import annotations + +import json +import pprint +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict, Field, StrictBool +from typing_extensions import Annotated, Self + + +class UpdateAlertConfigsPayloadRouteRoutesInner(BaseModel): + """ + As in one level above + """ # noqa: E501 + + var_continue: Optional[StrictBool] = Field(default=False, description="As in one level above", alias="continue") + group_by: Optional[List[Annotated[str, Field(min_length=1, strict=True, max_length=200)]]] = Field( + default=None, alias="groupBy" + ) + group_interval: Optional[Annotated[str, Field(min_length=2, strict=True, max_length=8)]] = Field( + default=None, description="As in one level above", alias="groupInterval" + ) + group_wait: Optional[Annotated[str, Field(strict=True, max_length=8)]] = Field( + default=None, description="As in one level above", alias="groupWait" + ) + match: Optional[Dict[str, Any]] = Field(default=None, description="As in one level above") + match_re: Optional[Dict[str, Any]] = Field(default=None, description="As in one level above", alias="matchRe") + matchers: Optional[List[Annotated[str, Field(min_length=1, strict=True, max_length=200)]]] = Field( + default=None, + description="A list of matchers that an alert has to fulfill to match the node. A matcher is a string with a syntax inspired by PromQL and OpenMetrics. The syntax of a matcher consists of three tokens: * A valid Prometheus label name. * One of =, !=, =~, or !~. = means equals, != means that the strings are not equal, =~ is used for equality of regex expressions and !~ is used for un-equality of regex expressions. They have the same meaning as known from PromQL selectors. * A UTF-8 string, which may be enclosed in double quotes. Before or after each token, there may be any amount of whitespace. `Additional Validators:` * should not contain more than 5 keys * each key and value should not be longer than 200 characters", + ) + receiver: Optional[Annotated[str, Field(min_length=1, strict=True, max_length=100)]] = Field( + default=None, description="As in one level above" + ) + repeat_interval: Optional[Annotated[str, Field(min_length=2, strict=True, max_length=8)]] = Field( + default=None, description="As in one level above", alias="repeatInterval" + ) + routes: Optional[List[Dict[str, Any]]] = Field(default=None, description="Another child routes") + __properties: ClassVar[List[str]] = [ + "continue", + "groupBy", + "groupInterval", + "groupWait", + "match", + "matchRe", + "matchers", + "receiver", + "repeatInterval", + "routes", + ] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UpdateAlertConfigsPayloadRouteRoutesInner from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UpdateAlertConfigsPayloadRouteRoutesInner from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "continue": obj.get("continue") if obj.get("continue") is not None else False, + "groupBy": obj.get("groupBy"), + "groupInterval": obj.get("groupInterval"), + "groupWait": obj.get("groupWait"), + "match": obj.get("match"), + "matchRe": obj.get("matchRe"), + "matchers": obj.get("matchers"), + "receiver": obj.get("receiver"), + "repeatInterval": obj.get("repeatInterval"), + "routes": obj.get("routes"), + } + ) + return _obj