diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b07bc53..0f3069ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - **Feature:** Add `CreateIsolatedNetwork` functionality - **Feature:** Add `ImageFromVolumePayload` functionality - **Feature:** Add `SystemRoutes` to `UpdateRoutingTableOfAreaPayload` +- `kms`: [v0.5.0](services/kms/CHANGELOG.md#v050) + - **Feature:** Add regex field validator for `display_name` attribute in model classes `CreateKeyPayload`, `CreateKeyRingPayload`, `CreateWrappingKeyPayload` ## Release (2025-12-08) - `scf`: [v0.3.0](services/scf/CHANGELOG.md#v030) diff --git a/services/kms/CHANGELOG.md b/services/kms/CHANGELOG.md index 7388e0ed..7e880f8b 100644 --- a/services/kms/CHANGELOG.md +++ b/services/kms/CHANGELOG.md @@ -1,3 +1,6 @@ +## v0.5.0 +- **Feature:** Add regex field validator for `display_name` attribute in model classes `CreateKeyPayload`, `CreateKeyRingPayload`, `CreateWrappingKeyPayload` + ## v0.4.1 - **Bugfix:** Prevent year 0 timestamp issue diff --git a/services/kms/pyproject.toml b/services/kms/pyproject.toml index 6bd382c6..05e0dc30 100644 --- a/services/kms/pyproject.toml +++ b/services/kms/pyproject.toml @@ -3,7 +3,7 @@ name = "stackit-kms" [tool.poetry] name = "stackit-kms" -version = "v0.4.1" +version = "v0.5.0" authors = [ "STACKIT Developer Tools ", ] diff --git a/services/kms/src/stackit/kms/models/create_key_payload.py b/services/kms/src/stackit/kms/models/create_key_payload.py index 25981ef1..4b37d2c2 100644 --- a/services/kms/src/stackit/kms/models/create_key_payload.py +++ b/services/kms/src/stackit/kms/models/create_key_payload.py @@ -15,6 +15,7 @@ import json import pprint +import re # noqa: F401 from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import ( @@ -23,6 +24,7 @@ Field, StrictBool, StrictStr, + field_validator, ) from typing_extensions import Annotated, Self @@ -43,7 +45,8 @@ class CreateKeyPayload(BaseModel): default=None, description="A user chosen description to distinguish multiple keys." ) display_name: Annotated[str, Field(strict=True, max_length=64)] = Field( - description="The display name to distinguish multiple keys.", alias="displayName" + description="The display name to distinguish multiple keys. Valid characters: letters, digits, underscores and hyphens.", + alias="displayName", ) import_only: Optional[StrictBool] = Field( default=False, description="States whether versions can be created or only imported.", alias="importOnly" @@ -60,6 +63,13 @@ class CreateKeyPayload(BaseModel): "purpose", ] + @field_validator("display_name") + def display_name_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9_-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9_-]+$/") + return value + model_config = ConfigDict( populate_by_name=True, validate_assignment=True, diff --git a/services/kms/src/stackit/kms/models/create_key_ring_payload.py b/services/kms/src/stackit/kms/models/create_key_ring_payload.py index b80db9a5..b9f8f395 100644 --- a/services/kms/src/stackit/kms/models/create_key_ring_payload.py +++ b/services/kms/src/stackit/kms/models/create_key_ring_payload.py @@ -15,9 +15,10 @@ import json import pprint +import re # noqa: F401 from typing import Any, ClassVar, Dict, List, Optional, Set -from pydantic import BaseModel, ConfigDict, Field, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator from typing_extensions import Annotated, Self @@ -30,10 +31,18 @@ class CreateKeyRingPayload(BaseModel): default=None, description="A user chosen description to distinguish multiple key rings." ) display_name: Annotated[str, Field(strict=True, max_length=64)] = Field( - description="The display name to distinguish multiple key rings.", alias="displayName" + description="The display name to distinguish multiple key rings. Valid characters: letters, digits, underscores and hyphens.", + alias="displayName", ) __properties: ClassVar[List[str]] = ["description", "displayName"] + @field_validator("display_name") + def display_name_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9_-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9_-]+$/") + return value + model_config = ConfigDict( populate_by_name=True, validate_assignment=True, diff --git a/services/kms/src/stackit/kms/models/create_wrapping_key_payload.py b/services/kms/src/stackit/kms/models/create_wrapping_key_payload.py index d0e7a04e..cbb42ce0 100644 --- a/services/kms/src/stackit/kms/models/create_wrapping_key_payload.py +++ b/services/kms/src/stackit/kms/models/create_wrapping_key_payload.py @@ -15,9 +15,10 @@ import json import pprint +import re # noqa: F401 from typing import Any, ClassVar, Dict, List, Optional, Set -from pydantic import BaseModel, ConfigDict, Field, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator from typing_extensions import Annotated, Self from stackit.kms.models.access_scope import AccessScope @@ -37,7 +38,8 @@ class CreateWrappingKeyPayload(BaseModel): default=None, description="A user chosen description to distinguish multiple wrapping keys." ) display_name: Annotated[str, Field(strict=True, max_length=64)] = Field( - description="The display name to distinguish multiple wrapping keys.", alias="displayName" + description="The display name to distinguish multiple wrapping keys. Valid characters: letters, digits, underscores and hyphens.", + alias="displayName", ) protection: Protection purpose: WrappingPurpose @@ -50,6 +52,13 @@ class CreateWrappingKeyPayload(BaseModel): "purpose", ] + @field_validator("display_name") + def display_name_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9_-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9_-]+$/") + return value + model_config = ConfigDict( populate_by_name=True, validate_assignment=True,