diff --git a/services/iaas/pyproject.toml b/services/iaas/pyproject.toml index be212214..b39c6438 100644 --- a/services/iaas/pyproject.toml +++ b/services/iaas/pyproject.toml @@ -37,8 +37,8 @@ dev = [ ] [project.urls] -Homepage = "https://github.com/stackitcloud/stackit-sdk-python-beta" -Issues = "https://github.com/stackitcloud/stackit-sdk-python-beta/issues" +Homepage = "https://github.com/stackitcloud/stackit-sdk-python" +Issues = "https://github.com/stackitcloud/stackit-sdk-python/issues" [build-system] requires = ["setuptools"] diff --git a/services/iaas/stackit/iaas/__init__.py b/services/iaas/stackit/iaas/__init__.py index 13c18815..79819f0a 100644 --- a/services/iaas/stackit/iaas/__init__.py +++ b/services/iaas/stackit/iaas/__init__.py @@ -35,6 +35,7 @@ # import models into sdk package from stackit.iaas.models.add_volume_to_server_payload import AddVolumeToServerPayload +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner from stackit.iaas.models.area import Area from stackit.iaas.models.area_config import AreaConfig from stackit.iaas.models.area_prefix_config_ipv4 import AreaPrefixConfigIPv4 diff --git a/services/iaas/stackit/iaas/models/__init__.py b/services/iaas/stackit/iaas/models/__init__.py index f50cdf91..7483e8f1 100644 --- a/services/iaas/stackit/iaas/models/__init__.py +++ b/services/iaas/stackit/iaas/models/__init__.py @@ -16,6 +16,7 @@ # import models into model package from stackit.iaas.models.add_volume_to_server_payload import AddVolumeToServerPayload +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner from stackit.iaas.models.area import Area from stackit.iaas.models.area_config import AreaConfig from stackit.iaas.models.area_prefix_config_ipv4 import AreaPrefixConfigIPv4 diff --git a/services/iaas/stackit/iaas/models/allowed_addresses_inner.py b/services/iaas/stackit/iaas/models/allowed_addresses_inner.py new file mode 100644 index 00000000..83ca3f0b --- /dev/null +++ b/services/iaas/stackit/iaas/models/allowed_addresses_inner.py @@ -0,0 +1,165 @@ +# coding: utf-8 + +""" + IaaS-API + + This API allows you to create and modify IaaS resources. + + The version of the OpenAPI document: 1beta1 + Contact: stackit-iaas@mail.schwarz + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 docstring might be too long + +from __future__ import annotations + +import json +import pprint +from typing import Any, Dict, Optional, Set, Union + +from pydantic import ( + BaseModel, + ConfigDict, + Field, + ValidationError, + field_validator, +) +from typing_extensions import Annotated, Self + + +ALLOWEDADDRESSESINNER_ONE_OF_SCHEMAS = ["str"] + + +class AllowedAddressesInner(BaseModel): + """ + AllowedAddressesInner + """ + + # data type: str + oneof_schema_1_validator: Optional[Annotated[str, Field(strict=True)]] = Field( + default=None, description="Object that represents an IP address." + ) + # data type: str + oneof_schema_2_validator: Optional[Annotated[str, Field(strict=True)]] = Field( + default=None, description="Classless Inter-Domain Routing (CIDR)." + ) + actual_instance: Optional[Union[str]] = None + one_of_schemas: Set[str] = {"str"} + + model_config = ConfigDict( + validate_assignment=True, + protected_namespaces=(), + ) + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator("actual_instance") + def actual_instance_must_validate_oneof(cls, v): + instance = AllowedAddressesInner.model_construct() + error_messages = [] + match = 0 + # validate data type: str + try: + instance.oneof_schema_1_validator = v + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # validate data type: str + try: + instance.oneof_schema_2_validator = v + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + if match > 1: + # more than 1 match + raise ValueError( + "Multiple matches found when setting `actual_instance` in AllowedAddressesInner with oneOf schemas: str. Details: " + + ", ".join(error_messages) + ) + elif match == 0: + # no match + raise ValueError( + "No match found when setting `actual_instance` in AllowedAddressesInner with oneOf schemas: str. Details: " + + ", ".join(error_messages) + ) + else: + return v + + @classmethod + def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + match = 0 + + # deserialize data into str + try: + # validation + instance.oneof_schema_1_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.oneof_schema_1_validator + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into str + try: + # validation + instance.oneof_schema_2_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.oneof_schema_2_validator + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if match > 1: + # more than 1 match + raise ValueError( + "Multiple matches found when deserializing the JSON string into AllowedAddressesInner with oneOf schemas: str. Details: " + + ", ".join(error_messages) + ) + elif match == 0: + # no match + raise ValueError( + "No match found when deserializing the JSON string into AllowedAddressesInner with oneOf schemas: str. Details: " + + ", ".join(error_messages) + ) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], str]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + # primitive type + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) diff --git a/services/iaas/stackit/iaas/models/create_nic_payload.py b/services/iaas/stackit/iaas/models/create_nic_payload.py index 5922ef1f..4b4779cf 100644 --- a/services/iaas/stackit/iaas/models/create_nic_payload.py +++ b/services/iaas/stackit/iaas/models/create_nic_payload.py @@ -29,13 +29,15 @@ ) from typing_extensions import Annotated, Self +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner + class CreateNICPayload(BaseModel): """ Object that represents a network interface. """ - allowed_addresses: Optional[List[StrictStr]] = Field( + allowed_addresses: Optional[List[AllowedAddressesInner]] = Field( default=None, description="A list of IPs or CIDR notations.", alias="allowedAddresses" ) device: Optional[Annotated[str, Field(min_length=36, strict=True, max_length=36)]] = Field( @@ -226,6 +228,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of each item in allowed_addresses (list) + _items = [] + if self.allowed_addresses: + for _item in self.allowed_addresses: + if _item: + _items.append(_item.to_dict()) + _dict["allowedAddresses"] = _items return _dict @classmethod @@ -239,7 +248,11 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { - "allowedAddresses": obj.get("allowedAddresses"), + "allowedAddresses": ( + [AllowedAddressesInner.from_dict(_item) for _item in obj["allowedAddresses"]] + if obj.get("allowedAddresses") is not None + else None + ), "device": obj.get("device"), "id": obj.get("id"), "ipv4": obj.get("ipv4"), diff --git a/services/iaas/stackit/iaas/models/nic.py b/services/iaas/stackit/iaas/models/nic.py index 5bcd8096..96ba52b1 100644 --- a/services/iaas/stackit/iaas/models/nic.py +++ b/services/iaas/stackit/iaas/models/nic.py @@ -29,13 +29,15 @@ ) from typing_extensions import Annotated, Self +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner + class NIC(BaseModel): """ Object that represents a network interface. """ - allowed_addresses: Optional[List[StrictStr]] = Field( + allowed_addresses: Optional[List[AllowedAddressesInner]] = Field( default=None, description="A list of IPs or CIDR notations.", alias="allowedAddresses" ) device: Optional[Annotated[str, Field(min_length=36, strict=True, max_length=36)]] = Field( @@ -226,6 +228,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of each item in allowed_addresses (list) + _items = [] + if self.allowed_addresses: + for _item in self.allowed_addresses: + if _item: + _items.append(_item.to_dict()) + _dict["allowedAddresses"] = _items return _dict @classmethod @@ -239,7 +248,11 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { - "allowedAddresses": obj.get("allowedAddresses"), + "allowedAddresses": ( + [AllowedAddressesInner.from_dict(_item) for _item in obj["allowedAddresses"]] + if obj.get("allowedAddresses") is not None + else None + ), "device": obj.get("device"), "id": obj.get("id"), "ipv4": obj.get("ipv4"), diff --git a/services/iaas/stackit/iaas/models/server_network.py b/services/iaas/stackit/iaas/models/server_network.py index 5696f887..a72b8dd6 100644 --- a/services/iaas/stackit/iaas/models/server_network.py +++ b/services/iaas/stackit/iaas/models/server_network.py @@ -19,23 +19,18 @@ import re from typing import Any, ClassVar, Dict, List, Optional, Set -from pydantic import ( - BaseModel, - ConfigDict, - Field, - StrictBool, - StrictStr, - field_validator, -) +from pydantic import BaseModel, ConfigDict, Field, StrictBool, field_validator from typing_extensions import Annotated, Self +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner + class ServerNetwork(BaseModel): """ Describes the object that matches servers to its networks. """ - allowed_addresses: Optional[List[StrictStr]] = Field( + allowed_addresses: Optional[List[AllowedAddressesInner]] = Field( default=None, description="A list of IPs or CIDR notations.", alias="allowedAddresses" ) ipv4: Optional[Annotated[str, Field(strict=True)]] = Field( @@ -191,6 +186,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of each item in allowed_addresses (list) + _items = [] + if self.allowed_addresses: + for _item in self.allowed_addresses: + if _item: + _items.append(_item.to_dict()) + _dict["allowedAddresses"] = _items return _dict @classmethod @@ -204,7 +206,11 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { - "allowedAddresses": obj.get("allowedAddresses"), + "allowedAddresses": ( + [AllowedAddressesInner.from_dict(_item) for _item in obj["allowedAddresses"]] + if obj.get("allowedAddresses") is not None + else None + ), "ipv4": obj.get("ipv4"), "ipv6": obj.get("ipv6"), "mac": obj.get("mac"), diff --git a/services/iaas/stackit/iaas/models/update_nic_payload.py b/services/iaas/stackit/iaas/models/update_nic_payload.py index 2a8a0021..18faa8bc 100644 --- a/services/iaas/stackit/iaas/models/update_nic_payload.py +++ b/services/iaas/stackit/iaas/models/update_nic_payload.py @@ -19,23 +19,18 @@ import re from typing import Any, ClassVar, Dict, List, Optional, Set -from pydantic import ( - BaseModel, - ConfigDict, - Field, - StrictBool, - StrictStr, - field_validator, -) +from pydantic import BaseModel, ConfigDict, Field, StrictBool, field_validator from typing_extensions import Annotated, Self +from stackit.iaas.models.allowed_addresses_inner import AllowedAddressesInner + class UpdateNICPayload(BaseModel): """ Object that represents a network interface update. """ - allowed_addresses: Optional[List[StrictStr]] = Field( + allowed_addresses: Optional[List[AllowedAddressesInner]] = Field( default=None, description="A list of IPs or CIDR notations.", alias="allowedAddresses" ) labels: Optional[Dict[str, Any]] = Field( @@ -101,6 +96,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of each item in allowed_addresses (list) + _items = [] + if self.allowed_addresses: + for _item in self.allowed_addresses: + if _item: + _items.append(_item.to_dict()) + _dict["allowedAddresses"] = _items return _dict @classmethod @@ -114,7 +116,11 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { - "allowedAddresses": obj.get("allowedAddresses"), + "allowedAddresses": ( + [AllowedAddressesInner.from_dict(_item) for _item in obj["allowedAddresses"]] + if obj.get("allowedAddresses") is not None + else None + ), "labels": obj.get("labels"), "name": obj.get("name"), "nicSecurity": obj.get("nicSecurity"),