Skip to content
Merged
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
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions services/observability/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## v0.9.1
- Introduce new model `UpdateAlertConfigsPayloadRouteRoutesInner`

## v0.9.0
- **Feature:** Add new `GoogleChat` webhook

Expand Down
2 changes: 1 addition & 1 deletion services/observability/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = "stackit-observability"

[tool.poetry]
name = "stackit-observability"
version = "v0.9.0"
version = "v0.9.1"
authors = [
"STACKIT Developer Tools <developer-tools@stackit.cloud>",
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@
"UpdateAlertConfigsPayloadInhibitRules",
"UpdateAlertConfigsPayloadReceiversInner",
"UpdateAlertConfigsPayloadRoute",
"UpdateAlertConfigsPayloadRouteRoutesInner",
"UpdateAlertConfigsResponse",
"UpdateAlertgroupPayload",
"UpdateAlertgroupsRequestInner",
Expand Down Expand Up @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)


Expand Down Expand Up @@ -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"
)
Expand All @@ -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]] = [
Expand All @@ -82,7 +78,6 @@ class UpdateAlertConfigsPayloadRoute(BaseModel):
"groupWait",
"match",
"matchRe",
"matchers",
"receiver",
"repeatInterval",
"routes",
Expand Down Expand Up @@ -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
),
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Loading