diff --git a/.github/release-please-manifest.json b/.github/release-please-manifest.json index b7c9dacc..ed492815 100644 --- a/.github/release-please-manifest.json +++ b/.github/release-please-manifest.json @@ -1 +1 @@ -{".":"2.0.0"} +{".":"2.0.1"} diff --git a/CHANGELOG.md b/CHANGELOG.md index 621f3e92..08e049c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [2.0.1](https://github.com/hetznercloud/hcloud-python/compare/v2.0.0...v2.0.1) (2024-07-03) + + +### Bug Fixes + +* `assignee_type` is required when creating a primary ip ([#409](https://github.com/hetznercloud/hcloud-python/issues/409)) ([bce5e94](https://github.com/hetznercloud/hcloud-python/commit/bce5e940e27f2c6d9d50016b5828c79aadfc4401)) +* clean unused arguments in the `Client.servers.rebuild` method ([#407](https://github.com/hetznercloud/hcloud-python/issues/407)) ([6d33c3c](https://github.com/hetznercloud/hcloud-python/commit/6d33c3cff5443686c7ed37eb8635e0461bb3b928)) +* details are optional in API errors ([#411](https://github.com/hetznercloud/hcloud-python/issues/411)) ([f1c6594](https://github.com/hetznercloud/hcloud-python/commit/f1c6594dee7088872f2375359ee259e4e93b31d2)) +* rename `trace_id` variable to `correlation_id` ([#408](https://github.com/hetznercloud/hcloud-python/issues/408)) ([66a0f54](https://github.com/hetznercloud/hcloud-python/commit/66a0f546998193f9078f70a4a2fb1fc11937c086)) + ## [2.0.0](https://github.com/hetznercloud/hcloud-python/compare/v1.35.0...v2.0.0) (2024-07-03) diff --git a/hcloud/_client.py b/hcloud/_client.py index 81aabe27..a0de13ae 100644 --- a/hcloud/_client.py +++ b/hcloud/_client.py @@ -215,7 +215,7 @@ def request( # type: ignore[no-untyped-def] **kwargs, ) - trace_id = response.headers.get("X-Correlation-Id") + correlation_id = response.headers.get("X-Correlation-Id") payload = {} try: if len(response.content) > 0: @@ -225,7 +225,7 @@ def request( # type: ignore[no-untyped-def] code=response.status_code, message=response.reason, details={"content": response.content}, - trace_id=trace_id, + correlation_id=correlation_id, ) from exc if not response.ok: @@ -234,7 +234,7 @@ def request( # type: ignore[no-untyped-def] code=response.status_code, message=response.reason, details={"content": response.content}, - trace_id=trace_id, + correlation_id=correlation_id, ) error: dict = payload["error"] @@ -247,8 +247,8 @@ def request( # type: ignore[no-untyped-def] raise APIException( code=error["code"], message=error["message"], - details=error["details"], - trace_id=trace_id, + details=error.get("details"), + correlation_id=correlation_id, ) return payload diff --git a/hcloud/_exceptions.py b/hcloud/_exceptions.py index cb6e60f0..c884a9a9 100644 --- a/hcloud/_exceptions.py +++ b/hcloud/_exceptions.py @@ -16,11 +16,11 @@ def __init__( message: str, details: Any, *, - trace_id: str | None = None, + correlation_id: str | None = None, ): extras = [str(code)] - if trace_id is not None: - extras.append(trace_id) + if correlation_id is not None: + extras.append(correlation_id) error = f"{message} ({', '.join(extras)})" @@ -28,4 +28,4 @@ def __init__( self.code = code self.message = message self.details = details - self.trace_id = trace_id + self.correlation_id = correlation_id diff --git a/hcloud/_version.py b/hcloud/_version.py index 03d534ca..bf6f1517 100644 --- a/hcloud/_version.py +++ b/hcloud/_version.py @@ -1,3 +1,3 @@ from __future__ import annotations -__version__ = "2.0.0" # x-release-please-version +__version__ = "2.0.1" # x-release-please-version diff --git a/hcloud/primary_ips/client.py b/hcloud/primary_ips/client.py index 40b47cb9..41ef3bfb 100644 --- a/hcloud/primary_ips/client.py +++ b/hcloud/primary_ips/client.py @@ -211,12 +211,12 @@ def create( data: dict[str, Any] = { "name": name, "type": type, + "assignee_type": assignee_type, "auto_delete": auto_delete, } if datacenter is not None: data["datacenter"] = datacenter.id_or_name if assignee_id is not None: - data["assignee_type"] = assignee_type data["assignee_id"] = assignee_id if labels is not None: data["labels"] = labels diff --git a/hcloud/servers/client.py b/hcloud/servers/client.py index 7eb66daf..ca741ebf 100644 --- a/hcloud/servers/client.py +++ b/hcloud/servers/client.py @@ -332,15 +332,14 @@ def create_image( def rebuild( self, image: Image | BoundImage, - *, - return_response: bool = False, - ) -> RebuildResponse | BoundAction: + # pylint: disable=unused-argument + **kwargs: Any, + ) -> RebuildResponse: """Rebuilds a server overwriting its disk with the content of an image, thereby destroying all data on the target server. :param image: Image to use for the rebuilt server - :param return_response: Whether to return the full response or only the action. """ - return self._client.rebuild(self, image, return_response=return_response) + return self._client.rebuild(self, image) def change_type( self, @@ -1012,7 +1011,6 @@ def rebuild( :param server: Server to rebuild :param image: Image to use for the rebuilt server - :param return_response: Whether to return the full response or only the action. """ data: dict[str, Any] = {"image": image.id_or_name} response = self._client.request( diff --git a/setup.py b/setup.py index 9947ae7a..29a73e13 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="hcloud", - version="2.0.0", + version="2.0.1", keywords="hcloud hetzner cloud", description="Official Hetzner Cloud python library", long_description=readme, diff --git a/tests/unit/primary_ips/test_client.py b/tests/unit/primary_ips/test_client.py index dd4b1aae..9db08fe4 100644 --- a/tests/unit/primary_ips/test_client.py +++ b/tests/unit/primary_ips/test_client.py @@ -158,6 +158,7 @@ def test_create_with_datacenter(self, primary_ips_client, primary_ip_response): json={ "name": "my-resource", "type": "ipv6", + "assignee_type": "server", "datacenter": "datacenter", "auto_delete": False, }, diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index b70c142a..e258a518 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -102,7 +102,7 @@ def test_request_fails(self, client, fail_response): assert error.message == "invalid input in field 'broken_field': is too long" assert error.details["fields"][0]["name"] == "broken_field" - def test_request_fails_trace_id(self, client, response): + def test_request_fails_correlation_id(self, client, response): response.headers["X-Correlation-Id"] = "67ed842dc8bc8673" response.status_code = 409 response._content = json.dumps( @@ -110,7 +110,6 @@ def test_request_fails_trace_id(self, client, response): "error": { "code": "conflict", "message": "some conflict", - "details": None, } } ).encode("utf-8") @@ -124,7 +123,7 @@ def test_request_fails_trace_id(self, client, response): assert error.code == "conflict" assert error.message == "some conflict" assert error.details is None - assert error.trace_id == "67ed842dc8bc8673" + assert error.correlation_id == "67ed842dc8bc8673" assert str(error) == "some conflict (conflict, 67ed842dc8bc8673)" def test_request_500(self, client, fail_response):