diff --git a/hcloud/certificates/client.py b/hcloud/certificates/client.py index 72856ba8..9b75d9f3 100644 --- a/hcloud/certificates/client.py +++ b/hcloud/certificates/client.py @@ -104,6 +104,7 @@ class CertificatesPageResult(NamedTuple): class CertificatesClient(ResourceClientBase): + _base_url = "/certificates" actions: ResourceActionsClient """Certificates scoped actions client @@ -113,7 +114,7 @@ class CertificatesClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/certificates") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundCertificate: """Get a specific certificate by its ID. @@ -121,7 +122,7 @@ def get_by_id(self, id: int) -> BoundCertificate: :param id: int :return: :class:`BoundCertificate ` """ - response = self._client.request(url=f"/certificates/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundCertificate(self, response["certificate"]) def get_list( @@ -156,9 +157,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request( - url="/certificates", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) certificates = [ BoundCertificate(self, certificate_data) @@ -218,7 +217,7 @@ def create( } if labels is not None: data["labels"] = labels - response = self._client.request(url="/certificates", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) return BoundCertificate(self, response["certificate"]) def create_managed( @@ -244,7 +243,7 @@ def create_managed( } if labels is not None: data["labels"] = labels - response = self._client.request(url="/certificates", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) return CreateManagedCertificateResponse( certificate=BoundCertificate(self, response["certificate"]), action=BoundAction(self._parent.actions, response["action"]), @@ -271,7 +270,7 @@ def update( if labels is not None: data["labels"] = labels response = self._client.request( - url=f"/certificates/{certificate.id}", + url=f"{self._base_url}/{certificate.id}", method="PUT", json=data, ) @@ -284,7 +283,7 @@ def delete(self, certificate: Certificate | BoundCertificate) -> bool: :return: True """ self._client.request( - url=f"/certificates/{certificate.id}", + url=f"{self._base_url}/{certificate.id}", method="DELETE", ) # Return always true, because the API does not return an action for it. When an error occurs a HcloudAPIException will be raised @@ -322,7 +321,7 @@ def get_actions_list( params["per_page"] = per_page response = self._client.request( - url=f"/certificates/{certificate.id}/actions", + url=f"{self._base_url}/{certificate.id}/actions", method="GET", params=params, ) @@ -364,7 +363,7 @@ def retry_issuance( :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/certificates/{certificate.id}/actions/retry", + url=f"{self._base_url}/{certificate.id}/actions/retry", method="POST", ) return BoundAction(self._parent.actions, response["action"]) diff --git a/hcloud/core/client.py b/hcloud/core/client.py index ab91611e..07dfaf48 100644 --- a/hcloud/core/client.py +++ b/hcloud/core/client.py @@ -1,7 +1,7 @@ from __future__ import annotations import warnings -from typing import TYPE_CHECKING, Any, Callable +from typing import TYPE_CHECKING, Any, Callable, ClassVar if TYPE_CHECKING: from .._client import Client, ClientBase @@ -9,6 +9,7 @@ class ResourceClientBase: + _base_url: ClassVar[str] _parent: Client _client: ClientBase diff --git a/hcloud/datacenters/client.py b/hcloud/datacenters/client.py index 0d793cf3..880e1c24 100644 --- a/hcloud/datacenters/client.py +++ b/hcloud/datacenters/client.py @@ -53,6 +53,7 @@ class DatacentersPageResult(NamedTuple): class DatacentersClient(ResourceClientBase): + _base_url = "/datacenters" def get_by_id(self, id: int) -> BoundDatacenter: """Get a specific datacenter by its ID. @@ -60,7 +61,7 @@ def get_by_id(self, id: int) -> BoundDatacenter: :param id: int :return: :class:`BoundDatacenter ` """ - response = self._client.request(url=f"/datacenters/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundDatacenter(self, response["datacenter"]) def get_list( @@ -89,7 +90,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/datacenters", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) datacenters = [ BoundDatacenter(self, datacenter_data) diff --git a/hcloud/firewalls/client.py b/hcloud/firewalls/client.py index 94b4cbd6..84535184 100644 --- a/hcloud/firewalls/client.py +++ b/hcloud/firewalls/client.py @@ -184,6 +184,7 @@ class FirewallsPageResult(NamedTuple): class FirewallsClient(ResourceClientBase): + _base_url = "/firewalls" actions: ResourceActionsClient """Firewalls scoped actions client @@ -193,7 +194,7 @@ class FirewallsClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/firewalls") + self.actions = ResourceActionsClient(client, self._base_url) def get_actions_list( self, @@ -226,7 +227,7 @@ def get_actions_list( if per_page is not None: params["per_page"] = per_page response = self._client.request( - url=f"/firewalls/{firewall.id}/actions", + url=f"{self._base_url}/{firewall.id}/actions", method="GET", params=params, ) @@ -265,7 +266,7 @@ def get_by_id(self, id: int) -> BoundFirewall: :param id: int :return: :class:`BoundFirewall ` """ - response = self._client.request(url=f"/firewalls/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundFirewall(self, response["firewall"]) def get_list( @@ -302,7 +303,7 @@ def get_list( params["name"] = name if sort is not None: params["sort"] = sort - response = self._client.request(url="/firewalls", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) firewalls = [ BoundFirewall(self, firewall_data) for firewall_data in response["firewalls"] @@ -372,7 +373,7 @@ def create( data.update({"apply_to": []}) for resource in resources: data["apply_to"].append(resource.to_payload()) - response = self._client.request(url="/firewalls", json=data, method="POST") + response = self._client.request(url=self._base_url, json=data, method="POST") actions = [] if response.get("actions") is not None: @@ -408,7 +409,7 @@ def update( data["name"] = name response = self._client.request( - url=f"/firewalls/{firewall.id}", + url=f"{self._base_url}/{firewall.id}", method="PUT", json=data, ) @@ -421,7 +422,7 @@ def delete(self, firewall: Firewall | BoundFirewall) -> bool: :return: boolean """ self._client.request( - url=f"/firewalls/{firewall.id}", + url=f"{self._base_url}/{firewall.id}", method="DELETE", ) # Return always true, because the API does not return an action for it. When an error occurs a HcloudAPIException will be raised @@ -442,7 +443,7 @@ def set_rules( for rule in rules: data["rules"].append(rule.to_payload()) response = self._client.request( - url=f"/firewalls/{firewall.id}/actions/set_rules", + url=f"{self._base_url}/{firewall.id}/actions/set_rules", method="POST", json=data, ) @@ -466,7 +467,7 @@ def apply_to_resources( for resource in resources: data["apply_to"].append(resource.to_payload()) response = self._client.request( - url=f"/firewalls/{firewall.id}/actions/apply_to_resources", + url=f"{self._base_url}/{firewall.id}/actions/apply_to_resources", method="POST", json=data, ) @@ -490,7 +491,7 @@ def remove_from_resources( for resource in resources: data["remove_from"].append(resource.to_payload()) response = self._client.request( - url=f"/firewalls/{firewall.id}/actions/remove_from_resources", + url=f"{self._base_url}/{firewall.id}/actions/remove_from_resources", method="POST", json=data, ) diff --git a/hcloud/floating_ips/client.py b/hcloud/floating_ips/client.py index c1ce8403..cc876803 100644 --- a/hcloud/floating_ips/client.py +++ b/hcloud/floating_ips/client.py @@ -140,6 +140,7 @@ class FloatingIPsPageResult(NamedTuple): class FloatingIPsClient(ResourceClientBase): + _base_url = "/floating_ips" actions: ResourceActionsClient """Floating IPs scoped actions client @@ -149,7 +150,7 @@ class FloatingIPsClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/floating_ips") + self.actions = ResourceActionsClient(client, self._base_url) def get_actions_list( self, @@ -182,7 +183,7 @@ def get_actions_list( if per_page is not None: params["per_page"] = per_page response = self._client.request( - url=f"/floating_ips/{floating_ip.id}/actions", + url=f"{self._base_url}/{floating_ip.id}/actions", method="GET", params=params, ) @@ -221,7 +222,7 @@ def get_by_id(self, id: int) -> BoundFloatingIP: :param id: int :return: :class:`BoundFloatingIP ` """ - response = self._client.request(url=f"/floating_ips/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundFloatingIP(self, response["floating_ip"]) def get_list( @@ -254,9 +255,7 @@ def get_list( if name is not None: params["name"] = name - response = self._client.request( - url="/floating_ips", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) floating_ips = [ BoundFloatingIP(self, floating_ip_data) for floating_ip_data in response["floating_ips"] @@ -324,7 +323,7 @@ def create( if name is not None: data["name"] = name - response = self._client.request(url="/floating_ips", json=data, method="POST") + response = self._client.request(url=self._base_url, json=data, method="POST") action = None if response.get("action") is not None: @@ -362,7 +361,7 @@ def update( data["name"] = name response = self._client.request( - url=f"/floating_ips/{floating_ip.id}", + url=f"{self._base_url}/{floating_ip.id}", method="PUT", json=data, ) @@ -375,7 +374,7 @@ def delete(self, floating_ip: FloatingIP | BoundFloatingIP) -> bool: :return: boolean """ self._client.request( - url=f"/floating_ips/{floating_ip.id}", + url=f"{self._base_url}/{floating_ip.id}", method="DELETE", ) # Return always true, because the API does not return an action for it. When an error occurs a HcloudAPIException will be raised @@ -398,7 +397,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/floating_ips/{floating_ip.id}/actions/change_protection", + url=f"{self._base_url}/{floating_ip.id}/actions/change_protection", method="POST", json=data, ) @@ -417,7 +416,7 @@ def assign( :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/floating_ips/{floating_ip.id}/actions/assign", + url=f"{self._base_url}/{floating_ip.id}/actions/assign", method="POST", json={"server": server.id}, ) @@ -430,7 +429,7 @@ def unassign(self, floating_ip: FloatingIP | BoundFloatingIP) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/floating_ips/{floating_ip.id}/actions/unassign", + url=f"{self._base_url}/{floating_ip.id}/actions/unassign", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -451,7 +450,7 @@ def change_dns_ptr( :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/floating_ips/{floating_ip.id}/actions/change_dns_ptr", + url=f"{self._base_url}/{floating_ip.id}/actions/change_dns_ptr", method="POST", json={"ip": ip, "dns_ptr": dns_ptr}, ) diff --git a/hcloud/images/client.py b/hcloud/images/client.py index ea4e66dd..5d993336 100644 --- a/hcloud/images/client.py +++ b/hcloud/images/client.py @@ -113,6 +113,7 @@ class ImagesPageResult(NamedTuple): class ImagesClient(ResourceClientBase): + _base_url = "/images" actions: ResourceActionsClient """Images scoped actions client @@ -122,7 +123,7 @@ class ImagesClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/images") + self.actions = ResourceActionsClient(client, self._base_url) def get_actions_list( self, @@ -155,7 +156,7 @@ def get_actions_list( if per_page is not None: params["per_page"] = per_page response = self._client.request( - url=f"/images/{image.id}/actions", + url=f"{self._base_url}/{image.id}/actions", method="GET", params=params, ) @@ -193,7 +194,7 @@ def get_by_id(self, id: int) -> BoundImage: :param id: int :return: :class:`BoundImage bool: :param :class:`BoundImage ` or :class:`Image ` :return: bool """ - self._client.request(url=f"/images/{image.id}", method="DELETE") + self._client.request(url=f"{self._base_url}/{image.id}", method="DELETE") # Return allays true, because the API does not return an action for it. When an error occurs a APIException will be raised return True @@ -401,7 +402,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/images/{image.id}/actions/change_protection", + url=f"{self._base_url}/{image.id}/actions/change_protection", method="POST", json=data, ) diff --git a/hcloud/isos/client.py b/hcloud/isos/client.py index 25c20c34..f3e86896 100644 --- a/hcloud/isos/client.py +++ b/hcloud/isos/client.py @@ -18,6 +18,7 @@ class IsosPageResult(NamedTuple): class IsosClient(ResourceClientBase): + _base_url = "/isos" def get_by_id(self, id: int) -> BoundIso: """Get a specific ISO by its id @@ -25,7 +26,7 @@ def get_by_id(self, id: int) -> BoundIso: :param id: int :return: :class:`BoundIso ` """ - response = self._client.request(url=f"/isos/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundIso(self, response["iso"]) def get_list( @@ -63,7 +64,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/isos", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) isos = [BoundIso(self, iso_data) for iso_data in response["isos"]] return IsosPageResult(isos, Meta.parse_meta(response)) diff --git a/hcloud/load_balancer_types/client.py b/hcloud/load_balancer_types/client.py index a237cb11..12d0f03e 100644 --- a/hcloud/load_balancer_types/client.py +++ b/hcloud/load_balancer_types/client.py @@ -18,6 +18,7 @@ class LoadBalancerTypesPageResult(NamedTuple): class LoadBalancerTypesClient(ResourceClientBase): + _base_url = "/load_balancer_types" def get_by_id(self, id: int) -> BoundLoadBalancerType: """Returns a specific Load Balancer Type. @@ -26,7 +27,7 @@ def get_by_id(self, id: int) -> BoundLoadBalancerType: :return: :class:`BoundLoadBalancerType ` """ response = self._client.request( - url=f"/load_balancer_types/{id}", + url=f"{self._base_url}/{id}", method="GET", ) return BoundLoadBalancerType(self, response["load_balancer_type"]) @@ -55,9 +56,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request( - url="/load_balancer_types", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) load_balancer_types = [ BoundLoadBalancerType(self, load_balancer_type_data) for load_balancer_type_data in response["load_balancer_types"] diff --git a/hcloud/load_balancers/client.py b/hcloud/load_balancers/client.py index 7e42a325..06625f27 100644 --- a/hcloud/load_balancers/client.py +++ b/hcloud/load_balancers/client.py @@ -370,6 +370,7 @@ class LoadBalancersPageResult(NamedTuple): class LoadBalancersClient(ResourceClientBase): + _base_url = "/load_balancers" actions: ResourceActionsClient """Load Balancers scoped actions client @@ -379,7 +380,7 @@ class LoadBalancersClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/load_balancers") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundLoadBalancer: """Get a specific Load Balancer @@ -388,7 +389,7 @@ def get_by_id(self, id: int) -> BoundLoadBalancer: :return: :class:`BoundLoadBalancer ` """ response = self._client.request( - url=f"/load_balancers/{id}", + url=f"{self._base_url}/{id}", method="GET", ) return BoundLoadBalancer(self, response["load_balancer"]) @@ -422,9 +423,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request( - url="/load_balancers", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) load_balancers = [ BoundLoadBalancer(self, load_balancer_data) @@ -514,7 +513,7 @@ def create( if location is not None: data["location"] = location.id_or_name - response = self._client.request(url="/load_balancers", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) return CreateLoadBalancerResponse( load_balancer=BoundLoadBalancer(self, response["load_balancer"]), @@ -542,7 +541,7 @@ def update( if labels is not None: data.update({"labels": labels}) response = self._client.request( - url=f"/load_balancers/{load_balancer.id}", + url=f"{self._base_url}/{load_balancer.id}", method="PUT", json=data, ) @@ -555,7 +554,7 @@ def delete(self, load_balancer: LoadBalancer | BoundLoadBalancer) -> bool: :return: boolean """ self._client.request( - url=f"/load_balancers/{load_balancer.id}", + url=f"{self._base_url}/{load_balancer.id}", method="DELETE", ) return True @@ -592,7 +591,7 @@ def get_metrics( params["step"] = step response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/metrics", + url=f"{self._base_url}/{load_balancer.id}/metrics", method="GET", params=params, ) @@ -632,7 +631,7 @@ def get_actions_list( params["per_page"] = per_page response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions", + url=f"{self._base_url}/{load_balancer.id}/actions", method="GET", params=params, ) @@ -679,7 +678,7 @@ def add_service( data: dict[str, Any] = service.to_payload() response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/add_service", + url=f"{self._base_url}/{load_balancer.id}/actions/add_service", method="POST", json=data, ) @@ -699,7 +698,7 @@ def update_service( """ data: dict[str, Any] = service.to_payload() response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/update_service", + url=f"{self._base_url}/{load_balancer.id}/actions/update_service", method="POST", json=data, ) @@ -720,7 +719,7 @@ def delete_service( data: dict[str, Any] = {"listen_port": service.listen_port} response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/delete_service", + url=f"{self._base_url}/{load_balancer.id}/actions/delete_service", method="POST", json=data, ) @@ -741,7 +740,7 @@ def add_target( data: dict[str, Any] = target.to_payload() response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/add_target", + url=f"{self._base_url}/{load_balancer.id}/actions/add_target", method="POST", json=data, ) @@ -764,7 +763,7 @@ def remove_target( data.pop("use_private_ip", None) response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/remove_target", + url=f"{self._base_url}/{load_balancer.id}/actions/remove_target", method="POST", json=data, ) @@ -785,7 +784,7 @@ def change_algorithm( data: dict[str, Any] = {"type": algorithm.type} response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/change_algorithm", + url=f"{self._base_url}/{load_balancer.id}/actions/change_algorithm", method="POST", json=data, ) @@ -807,7 +806,7 @@ def change_dns_ptr( """ response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/change_dns_ptr", + url=f"{self._base_url}/{load_balancer.id}/actions/change_dns_ptr", method="POST", json={"ip": ip, "dns_ptr": dns_ptr}, ) @@ -830,7 +829,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/change_protection", + url=f"{self._base_url}/{load_balancer.id}/actions/change_protection", method="POST", json=data, ) @@ -855,7 +854,7 @@ def attach_to_network( data.update({"ip": ip}) response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/attach_to_network", + url=f"{self._base_url}/{load_balancer.id}/actions/attach_to_network", method="POST", json=data, ) @@ -874,7 +873,7 @@ def detach_from_network( """ data: dict[str, Any] = {"network": network.id} response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/detach_from_network", + url=f"{self._base_url}/{load_balancer.id}/actions/detach_from_network", method="POST", json=data, ) @@ -892,7 +891,7 @@ def enable_public_interface( """ response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/enable_public_interface", + url=f"{self._base_url}/{load_balancer.id}/actions/enable_public_interface", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -909,7 +908,7 @@ def disable_public_interface( """ response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/disable_public_interface", + url=f"{self._base_url}/{load_balancer.id}/actions/disable_public_interface", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -928,7 +927,7 @@ def change_type( """ data: dict[str, Any] = {"load_balancer_type": load_balancer_type.id_or_name} response = self._client.request( - url=f"/load_balancers/{load_balancer.id}/actions/change_type", + url=f"{self._base_url}/{load_balancer.id}/actions/change_type", method="POST", json=data, ) diff --git a/hcloud/locations/client.py b/hcloud/locations/client.py index 11d83ca6..154ba843 100644 --- a/hcloud/locations/client.py +++ b/hcloud/locations/client.py @@ -18,6 +18,7 @@ class LocationsPageResult(NamedTuple): class LocationsClient(ResourceClientBase): + _base_url = "/locations" def get_by_id(self, id: int) -> BoundLocation: """Get a specific location by its ID. @@ -25,7 +26,7 @@ def get_by_id(self, id: int) -> BoundLocation: :param id: int :return: :class:`BoundLocation ` """ - response = self._client.request(url=f"/locations/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundLocation(self, response["location"]) def get_list( @@ -52,7 +53,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/locations", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) locations = [ BoundLocation(self, location_data) for location_data in response["locations"] diff --git a/hcloud/networks/client.py b/hcloud/networks/client.py index 23059b89..5ac1b9d0 100644 --- a/hcloud/networks/client.py +++ b/hcloud/networks/client.py @@ -167,6 +167,7 @@ class NetworksPageResult(NamedTuple): class NetworksClient(ResourceClientBase): + _base_url = "/networks" actions: ResourceActionsClient """Networks scoped actions client @@ -176,7 +177,7 @@ class NetworksClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/networks") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundNetwork: """Get a specific network @@ -184,7 +185,7 @@ def get_by_id(self, id: int) -> BoundNetwork: :param id: int :return: :class:`BoundNetwork ` """ - response = self._client.request(url=f"/networks/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundNetwork(self, response["network"]) def get_list( @@ -216,7 +217,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/networks", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) networks = [ BoundNetwork(self, network_data) for network_data in response["networks"] @@ -300,7 +301,7 @@ def create( if labels is not None: data["labels"] = labels - response = self._client.request(url="/networks", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) return BoundNetwork(self, response["network"]) @@ -334,7 +335,7 @@ def update( data.update({"labels": labels}) response = self._client.request( - url=f"/networks/{network.id}", + url=f"{self._base_url}/{network.id}", method="PUT", json=data, ) @@ -346,7 +347,7 @@ def delete(self, network: Network | BoundNetwork) -> bool: :param network: :class:`BoundNetwork ` or :class:`Network ` :return: boolean """ - self._client.request(url=f"/networks/{network.id}", method="DELETE") + self._client.request(url=f"{self._base_url}/{network.id}", method="DELETE") return True def get_actions_list( @@ -381,7 +382,7 @@ def get_actions_list( params["per_page"] = per_page response = self._client.request( - url=f"/networks/{network.id}/actions", + url=f"{self._base_url}/{network.id}/actions", method="GET", params=params, ) @@ -435,7 +436,7 @@ def add_subnet( data["vswitch_id"] = subnet.vswitch_id response = self._client.request( - url=f"/networks/{network.id}/actions/add_subnet", + url=f"{self._base_url}/{network.id}/actions/add_subnet", method="POST", json=data, ) @@ -456,7 +457,7 @@ def delete_subnet( data: dict[str, Any] = {"ip_range": subnet.ip_range} response = self._client.request( - url=f"/networks/{network.id}/actions/delete_subnet", + url=f"{self._base_url}/{network.id}/actions/delete_subnet", method="POST", json=data, ) @@ -480,7 +481,7 @@ def add_route( } response = self._client.request( - url=f"/networks/{network.id}/actions/add_route", + url=f"{self._base_url}/{network.id}/actions/add_route", method="POST", json=data, ) @@ -504,7 +505,7 @@ def delete_route( } response = self._client.request( - url=f"/networks/{network.id}/actions/delete_route", + url=f"{self._base_url}/{network.id}/actions/delete_route", method="POST", json=data, ) @@ -525,7 +526,7 @@ def change_ip_range( data: dict[str, Any] = {"ip_range": ip_range} response = self._client.request( - url=f"/networks/{network.id}/actions/change_ip_range", + url=f"{self._base_url}/{network.id}/actions/change_ip_range", method="POST", json=data, ) @@ -548,7 +549,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/networks/{network.id}/actions/change_protection", + url=f"{self._base_url}/{network.id}/actions/change_protection", method="POST", json=data, ) diff --git a/hcloud/placement_groups/client.py b/hcloud/placement_groups/client.py index 48894326..dbae26df 100644 --- a/hcloud/placement_groups/client.py +++ b/hcloud/placement_groups/client.py @@ -41,6 +41,7 @@ class PlacementGroupsPageResult(NamedTuple): class PlacementGroupsClient(ResourceClientBase): + _base_url = "/placement_groups" def get_by_id(self, id: int) -> BoundPlacementGroup: """Returns a specific Placement Group object @@ -49,7 +50,7 @@ def get_by_id(self, id: int) -> BoundPlacementGroup: :return: :class:`BoundPlacementGroup ` """ response = self._client.request( - url=f"/placement_groups/{id}", + url=f"{self._base_url}/{id}", method="GET", ) return BoundPlacementGroup(self, response["placement_group"]) @@ -92,9 +93,7 @@ def get_list( params["sort"] = sort if type is not None: params["type"] = type - response = self._client.request( - url="/placement_groups", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) placement_groups = [ BoundPlacementGroup(self, placement_group_data) for placement_group_data in response["placement_groups"] @@ -154,9 +153,7 @@ def create( data: dict[str, Any] = {"name": name, "type": type} if labels is not None: data["labels"] = labels - response = self._client.request( - url="/placement_groups", json=data, method="POST" - ) + response = self._client.request(url=self._base_url, json=data, method="POST") action = None if response.get("action") is not None: @@ -191,7 +188,7 @@ def update( data["name"] = name response = self._client.request( - url=f"/placement_groups/{placement_group.id}", + url=f"{self._base_url}/{placement_group.id}", method="PUT", json=data, ) @@ -204,7 +201,7 @@ def delete(self, placement_group: PlacementGroup | BoundPlacementGroup) -> bool: :return: boolean """ self._client.request( - url=f"/placement_groups/{placement_group.id}", + url=f"{self._base_url}/{placement_group.id}", method="DELETE", ) return True diff --git a/hcloud/primary_ips/client.py b/hcloud/primary_ips/client.py index 7bf4f4cc..497e8a5b 100644 --- a/hcloud/primary_ips/client.py +++ b/hcloud/primary_ips/client.py @@ -98,6 +98,7 @@ class PrimaryIPsPageResult(NamedTuple): class PrimaryIPsClient(ResourceClientBase): + _base_url = "/primary_ips" actions: ResourceActionsClient """Primary IPs scoped actions client @@ -107,7 +108,7 @@ class PrimaryIPsClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/primary_ips") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundPrimaryIP: """Returns a specific Primary IP object. @@ -115,7 +116,7 @@ def get_by_id(self, id: int) -> BoundPrimaryIP: :param id: int :return: :class:`BoundPrimaryIP ` """ - response = self._client.request(url=f"/primary_ips/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundPrimaryIP(self, response["primary_ip"]) def get_list( @@ -153,7 +154,7 @@ def get_list( if ip is not None: params["ip"] = ip - response = self._client.request(url="/primary_ips", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) primary_ips = [ BoundPrimaryIP(self, primary_ip_data) for primary_ip_data in response["primary_ips"] @@ -220,7 +221,7 @@ def create( if labels is not None: data["labels"] = labels - response = self._client.request(url="/primary_ips", json=data, method="POST") + response = self._client.request(url=self._base_url, json=data, method="POST") action = None if response.get("action") is not None: @@ -258,7 +259,7 @@ def update( data["name"] = name response = self._client.request( - url=f"/primary_ips/{primary_ip.id}", + url=f"{self._base_url}/{primary_ip.id}", method="PUT", json=data, ) @@ -271,7 +272,7 @@ def delete(self, primary_ip: PrimaryIP | BoundPrimaryIP) -> bool: :return: boolean """ self._client.request( - url=f"/primary_ips/{primary_ip.id}", + url=f"{self._base_url}/{primary_ip.id}", method="DELETE", ) # Return always true, because the API does not return an action for it. When an error occurs a HcloudAPIException will be raised @@ -294,7 +295,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/primary_ips/{primary_ip.id}/actions/change_protection", + url=f"{self._base_url}/{primary_ip.id}/actions/change_protection", method="POST", json=data, ) @@ -316,7 +317,7 @@ def assign( :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/primary_ips/{primary_ip.id}/actions/assign", + url=f"{self._base_url}/{primary_ip.id}/actions/assign", method="POST", json={"assignee_id": assignee_id, "assignee_type": assignee_type}, ) @@ -329,7 +330,7 @@ def unassign(self, primary_ip: PrimaryIP | BoundPrimaryIP) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/primary_ips/{primary_ip.id}/actions/unassign", + url=f"{self._base_url}/{primary_ip.id}/actions/unassign", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -350,7 +351,7 @@ def change_dns_ptr( :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/primary_ips/{primary_ip.id}/actions/change_dns_ptr", + url=f"{self._base_url}/{primary_ip.id}/actions/change_dns_ptr", method="POST", json={"ip": ip, "dns_ptr": dns_ptr}, ) diff --git a/hcloud/server_types/client.py b/hcloud/server_types/client.py index 3f9df22c..085b66f8 100644 --- a/hcloud/server_types/client.py +++ b/hcloud/server_types/client.py @@ -18,6 +18,7 @@ class ServerTypesPageResult(NamedTuple): class ServerTypesClient(ResourceClientBase): + _base_url = "/server_types" def get_by_id(self, id: int) -> BoundServerType: """Returns a specific Server Type. @@ -25,7 +26,7 @@ def get_by_id(self, id: int) -> BoundServerType: :param id: int :return: :class:`BoundServerType ` """ - response = self._client.request(url=f"/server_types/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundServerType(self, response["server_type"]) def get_list( @@ -52,9 +53,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request( - url="/server_types", method="GET", params=params - ) + response = self._client.request(url=self._base_url, method="GET", params=params) server_types = [ BoundServerType(self, server_type_data) for server_type_data in response["server_types"] diff --git a/hcloud/servers/client.py b/hcloud/servers/client.py index b4f7e050..55347d5e 100644 --- a/hcloud/servers/client.py +++ b/hcloud/servers/client.py @@ -483,6 +483,7 @@ class ServersPageResult(NamedTuple): class ServersClient(ResourceClientBase): + _base_url = "/servers" actions: ResourceActionsClient """Servers scoped actions client @@ -492,7 +493,7 @@ class ServersClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/servers") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundServer: """Get a specific server @@ -500,7 +501,7 @@ def get_by_id(self, id: int) -> BoundServer: :param id: int :return: :class:`BoundServer ` """ - response = self._client.request(url=f"/servers/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundServer(self, response["server"]) def get_list( @@ -537,7 +538,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/servers", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) ass_servers = [ BoundServer(self, server_data) for server_data in response["servers"] @@ -664,7 +665,7 @@ def create( data_public_net["ipv6"] = public_net.ipv6.id data["public_net"] = data_public_net - response = self._client.request(url="/servers", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) result = CreateServerResponse( server=BoundServer(self, response["server"]), @@ -709,7 +710,7 @@ def get_actions_list( params["per_page"] = per_page response = self._client.request( - url=f"/servers/{server.id}/actions", + url=f"{self._base_url}/{server.id}/actions", method="GET", params=params, ) @@ -762,7 +763,7 @@ def update( if labels is not None: data.update({"labels": labels}) response = self._client.request( - url=f"/servers/{server.id}", + url=f"{self._base_url}/{server.id}", method="PUT", json=data, ) @@ -800,7 +801,7 @@ def get_metrics( params["step"] = step response = self._client.request( - url=f"/servers/{server.id}/metrics", + url=f"{self._base_url}/{server.id}/metrics", method="GET", params=params, ) @@ -814,7 +815,9 @@ def delete(self, server: Server | BoundServer) -> BoundAction: :param server: :class:`BoundServer ` or :class:`Server ` :return: :class:`BoundAction ` """ - response = self._client.request(url=f"/servers/{server.id}", method="DELETE") + response = self._client.request( + url=f"{self._base_url}/{server.id}", method="DELETE" + ) return BoundAction(self._parent.actions, response["action"]) def power_off(self, server: Server | BoundServer) -> BoundAction: @@ -824,7 +827,7 @@ def power_off(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/poweroff", + url=f"{self._base_url}/{server.id}/actions/poweroff", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -836,7 +839,7 @@ def power_on(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/poweron", + url=f"{self._base_url}/{server.id}/actions/poweron", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -848,7 +851,7 @@ def reboot(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/reboot", + url=f"{self._base_url}/{server.id}/actions/reboot", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -860,7 +863,7 @@ def reset(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/reset", + url=f"{self._base_url}/{server.id}/actions/reset", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -872,7 +875,7 @@ def shutdown(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/shutdown", + url=f"{self._base_url}/{server.id}/actions/shutdown", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -884,7 +887,7 @@ def reset_password(self, server: Server | BoundServer) -> ResetPasswordResponse: :return: :class:`ResetPasswordResponse ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/reset_password", + url=f"{self._base_url}/{server.id}/actions/reset_password", method="POST", ) return ResetPasswordResponse( @@ -912,7 +915,7 @@ def change_type( "upgrade_disk": upgrade_disk, } response = self._client.request( - url=f"/servers/{server.id}/actions/change_type", + url=f"{self._base_url}/{server.id}/actions/change_type", method="POST", json=data, ) @@ -939,7 +942,7 @@ def enable_rescue( data.update({"ssh_keys": ssh_keys}) response = self._client.request( - url=f"/servers/{server.id}/actions/enable_rescue", + url=f"{self._base_url}/{server.id}/actions/enable_rescue", method="POST", json=data, ) @@ -955,7 +958,7 @@ def disable_rescue(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/disable_rescue", + url=f"{self._base_url}/{server.id}/actions/disable_rescue", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -990,7 +993,7 @@ def create_image( data.update({"labels": labels}) response = self._client.request( - url=f"/servers/{server.id}/actions/create_image", + url=f"{self._base_url}/{server.id}/actions/create_image", method="POST", json=data, ) @@ -1013,7 +1016,7 @@ def rebuild( """ data: dict[str, Any] = {"image": image.id_or_name} response = self._client.request( - url=f"/servers/{server.id}/actions/rebuild", + url=f"{self._base_url}/{server.id}/actions/rebuild", method="POST", json=data, ) @@ -1030,7 +1033,7 @@ def enable_backup(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/enable_backup", + url=f"{self._base_url}/{server.id}/actions/enable_backup", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -1042,7 +1045,7 @@ def disable_backup(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/disable_backup", + url=f"{self._base_url}/{server.id}/actions/disable_backup", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -1060,7 +1063,7 @@ def attach_iso( """ data: dict[str, Any] = {"iso": iso.id_or_name} response = self._client.request( - url=f"/servers/{server.id}/actions/attach_iso", + url=f"{self._base_url}/{server.id}/actions/attach_iso", method="POST", json=data, ) @@ -1073,7 +1076,7 @@ def detach_iso(self, server: Server | BoundServer) -> BoundAction: :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/detach_iso", + url=f"{self._base_url}/{server.id}/actions/detach_iso", method="POST", ) return BoundAction(self._parent.actions, response["action"]) @@ -1095,7 +1098,7 @@ def change_dns_ptr( """ data: dict[str, Any] = {"ip": ip, "dns_ptr": dns_ptr} response = self._client.request( - url=f"/servers/{server.id}/actions/change_dns_ptr", + url=f"{self._base_url}/{server.id}/actions/change_dns_ptr", method="POST", json=data, ) @@ -1123,7 +1126,7 @@ def change_protection( data.update({"rebuild": rebuild}) response = self._client.request( - url=f"/servers/{server.id}/actions/change_protection", + url=f"{self._base_url}/{server.id}/actions/change_protection", method="POST", json=data, ) @@ -1136,7 +1139,7 @@ def request_console(self, server: Server | BoundServer) -> RequestConsoleRespons :return: :class:`RequestConsoleResponse ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/request_console", + url=f"{self._base_url}/{server.id}/actions/request_console", method="POST", ) return RequestConsoleResponse( @@ -1168,7 +1171,7 @@ def attach_to_network( if alias_ips is not None: data.update({"alias_ips": alias_ips}) response = self._client.request( - url=f"/servers/{server.id}/actions/attach_to_network", + url=f"{self._base_url}/{server.id}/actions/attach_to_network", method="POST", json=data, ) @@ -1187,7 +1190,7 @@ def detach_from_network( """ data: dict[str, Any] = {"network": network.id} response = self._client.request( - url=f"/servers/{server.id}/actions/detach_from_network", + url=f"{self._base_url}/{server.id}/actions/detach_from_network", method="POST", json=data, ) @@ -1209,7 +1212,7 @@ def change_alias_ips( """ data: dict[str, Any] = {"network": network.id, "alias_ips": alias_ips} response = self._client.request( - url=f"/servers/{server.id}/actions/change_alias_ips", + url=f"{self._base_url}/{server.id}/actions/change_alias_ips", method="POST", json=data, ) @@ -1228,7 +1231,7 @@ def add_to_placement_group( """ data: dict[str, Any] = {"placement_group": placement_group.id} response = self._client.request( - url=f"/servers/{server.id}/actions/add_to_placement_group", + url=f"{self._base_url}/{server.id}/actions/add_to_placement_group", method="POST", json=data, ) @@ -1241,7 +1244,7 @@ def remove_from_placement_group(self, server: Server | BoundServer) -> BoundActi :return: :class:`BoundAction ` """ response = self._client.request( - url=f"/servers/{server.id}/actions/remove_from_placement_group", + url=f"{self._base_url}/{server.id}/actions/remove_from_placement_group", method="POST", ) return BoundAction(self._parent.actions, response["action"]) diff --git a/hcloud/ssh_keys/client.py b/hcloud/ssh_keys/client.py index 5fe355c1..d992c2f5 100644 --- a/hcloud/ssh_keys/client.py +++ b/hcloud/ssh_keys/client.py @@ -39,6 +39,7 @@ class SSHKeysPageResult(NamedTuple): class SSHKeysClient(ResourceClientBase): + _base_url = "/ssh_keys" def get_by_id(self, id: int) -> BoundSSHKey: """Get a specific SSH Key by its ID @@ -46,7 +47,7 @@ def get_by_id(self, id: int) -> BoundSSHKey: :param id: int :return: :class:`BoundSSHKey ` """ - response = self._client.request(url=f"/ssh_keys/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundSSHKey(self, response["ssh_key"]) def get_list( @@ -83,7 +84,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/ssh_keys", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) ssh_keys = [ BoundSSHKey(self, server_data) for server_data in response["ssh_keys"] @@ -149,7 +150,7 @@ def create( data: dict[str, Any] = {"name": name, "public_key": public_key} if labels is not None: data["labels"] = labels - response = self._client.request(url="/ssh_keys", method="POST", json=data) + response = self._client.request(url=self._base_url, method="POST", json=data) return BoundSSHKey(self, response["ssh_key"]) def update( @@ -173,7 +174,7 @@ def update( if labels is not None: data["labels"] = labels response = self._client.request( - url=f"/ssh_keys/{ssh_key.id}", + url=f"{self._base_url}/{ssh_key.id}", method="PUT", json=data, ) @@ -185,6 +186,6 @@ def delete(self, ssh_key: SSHKey | BoundSSHKey) -> bool: :param ssh_key: :class:`BoundSSHKey ` or :class:`SSHKey ` :return: True """ - self._client.request(url=f"/ssh_keys/{ssh_key.id}", method="DELETE") + self._client.request(url=f"{self._base_url}/{ssh_key.id}", method="DELETE") # Return always true, because the API does not return an action for it. When an error occurs a HcloudAPIException will be raised return True diff --git a/hcloud/volumes/client.py b/hcloud/volumes/client.py index 2420d7d2..dd5b7458 100644 --- a/hcloud/volumes/client.py +++ b/hcloud/volumes/client.py @@ -136,6 +136,7 @@ class VolumesPageResult(NamedTuple): class VolumesClient(ResourceClientBase): + _base_url = "/volumes" actions: ResourceActionsClient """Volumes scoped actions client @@ -145,7 +146,7 @@ class VolumesClient(ResourceClientBase): def __init__(self, client: Client): super().__init__(client) - self.actions = ResourceActionsClient(client, "/volumes") + self.actions = ResourceActionsClient(client, self._base_url) def get_by_id(self, id: int) -> BoundVolume: """Get a specific volume by its id @@ -153,7 +154,7 @@ def get_by_id(self, id: int) -> BoundVolume: :param id: int :return: :class:`BoundVolume ` """ - response = self._client.request(url=f"/volumes/{id}", method="GET") + response = self._client.request(url=f"{self._base_url}/{id}", method="GET") return BoundVolume(self, response["volume"]) def get_list( @@ -190,7 +191,7 @@ def get_list( if per_page is not None: params["per_page"] = per_page - response = self._client.request(url="/volumes", method="GET", params=params) + response = self._client.request(url=self._base_url, method="GET", params=params) volumes = [ BoundVolume(self, volume_data) for volume_data in response["volumes"] ] @@ -270,7 +271,7 @@ def create( if format is not None: data["format"] = format - response = self._client.request(url="/volumes", json=data, method="POST") + response = self._client.request(url=self._base_url, json=data, method="POST") result = CreateVolumeResponse( volume=BoundVolume(self, response["volume"]), @@ -314,7 +315,7 @@ def get_actions_list( params["per_page"] = per_page response = self._client.request( - url=f"/volumes/{volume.id}/actions", + url=f"{self._base_url}/{volume.id}/actions", method="GET", params=params, ) @@ -367,7 +368,7 @@ def update( if labels is not None: data.update({"labels": labels}) response = self._client.request( - url=f"/volumes/{volume.id}", + url=f"{self._base_url}/{volume.id}", method="PUT", json=data, ) @@ -379,7 +380,7 @@ def delete(self, volume: Volume | BoundVolume) -> bool: :param volume: :class:`BoundVolume ` or :class:`Volume ` :return: boolean """ - self._client.request(url=f"/volumes/{volume.id}", method="DELETE") + self._client.request(url=f"{self._base_url}/{volume.id}", method="DELETE") return True def resize(self, volume: Volume | BoundVolume, size: int) -> BoundAction: @@ -391,7 +392,7 @@ def resize(self, volume: Volume | BoundVolume, size: int) -> BoundAction: :return: :class:`BoundAction ` """ data = self._client.request( - url=f"/volumes/{volume.id}/actions/resize", + url=f"{self._base_url}/{volume.id}/actions/resize", json={"size": size}, method="POST", ) @@ -415,7 +416,7 @@ def attach( data["automount"] = automount data = self._client.request( - url=f"/volumes/{volume.id}/actions/attach", + url=f"{self._base_url}/{volume.id}/actions/attach", json=data, method="POST", ) @@ -428,7 +429,7 @@ def detach(self, volume: Volume | BoundVolume) -> BoundAction: :return: :class:`BoundAction ` """ data = self._client.request( - url=f"/volumes/{volume.id}/actions/detach", + url=f"{self._base_url}/{volume.id}/actions/detach", method="POST", ) return BoundAction(self._parent.actions, data["action"]) @@ -450,7 +451,7 @@ def change_protection( data.update({"delete": delete}) response = self._client.request( - url=f"/volumes/{volume.id}/actions/change_protection", + url=f"{self._base_url}/{volume.id}/actions/change_protection", method="POST", json=data, )