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
79 changes: 79 additions & 0 deletions hcloud/storage_boxes/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1046,3 +1046,82 @@ def delete_subaccount(
return DeleteStorageBoxSubaccountResponse(
action=BoundAction(self._parent.actions, response["action"]),
)

def change_subaccount_home_directory(
self,
subaccount: StorageBoxSubaccount | BoundStorageBoxSubaccount,
home_directory: str,
) -> BoundAction:
"""
Change the home directory of a Storage Box Subaccount.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccount-actions-change-home-directory

:param subaccount: Storage Box Subaccount to update.
:param home_directory: Home directory for the Subaccount.
"""
if subaccount.storage_box is None:
raise ValueError("subaccount storage_box property is none")

data: dict[str, Any] = {
"home_directory": home_directory,
}

response = self._client.request(
method="POST",
url=f"{self._base_url}/{subaccount.storage_box.id}/subaccounts/{subaccount.id}/actions/change_home_directory",
json=data,
)
return BoundAction(self._parent.actions, response["action"])

def reset_subaccount_password(
self,
subaccount: StorageBoxSubaccount | BoundStorageBoxSubaccount,
password: str,
) -> BoundAction:
"""
Reset the password of a Storage Box Subaccount.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccount-actions-reset-password

:param subaccount: Storage Box Subaccount to update.
:param password: Password for the Subaccount.
"""
if subaccount.storage_box is None:
raise ValueError("subaccount storage_box property is none")

data: dict[str, Any] = {
"password": password,
}

response = self._client.request(
method="POST",
url=f"{self._base_url}/{subaccount.storage_box.id}/subaccounts/{subaccount.id}/actions/reset_subaccount_password",
json=data,
)
return BoundAction(self._parent.actions, response["action"])

def update_subaccount_access_settings(
self,
subaccount: StorageBoxSubaccount | BoundStorageBoxSubaccount,
access_settings: StorageBoxSubaccountAccessSettings,
) -> BoundAction:
"""
Update the access settings of a Storage Box Subaccount.

See https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccount-actions-update-access-settings

:param subaccount: Storage Box Subaccount to update.
:param access_settings: Access settings for the Subaccount.
"""
if subaccount.storage_box is None:
raise ValueError("subaccount storage_box property is none")

data: dict[str, Any] = access_settings.to_payload()

response = self._client.request(
method="POST",
url=f"{self._base_url}/{subaccount.storage_box.id}/subaccounts/{subaccount.id}/actions/update_access_settings",
json=data,
)
return BoundAction(self._parent.actions, response["action"])
75 changes: 75 additions & 0 deletions tests/unit/storage_boxes/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1045,3 +1045,78 @@ def test_delete_subaccount(
)

assert_bound_action1(result.action, resource_client._parent.actions)

def test_change_subaccount_home_directory(
self,
request_mock: mock.MagicMock,
resource_client: StorageBoxesClient,
action_response,
):
request_mock.return_value = action_response

action = resource_client.change_subaccount_home_directory(
StorageBoxSubaccount(id=45, storage_box=StorageBox(42)),
home_directory="path",
)

request_mock.assert_called_with(
method="POST",
url="/storage_boxes/42/subaccounts/45/actions/change_home_directory",
json={
"home_directory": "path",
},
)

assert_bound_action1(action, resource_client._parent.actions)

def test_reset_subaccount_password(
self,
request_mock: mock.MagicMock,
resource_client: StorageBoxesClient,
action_response,
):
request_mock.return_value = action_response

action = resource_client.reset_subaccount_password(
StorageBoxSubaccount(id=45, storage_box=StorageBox(42)),
password="password",
)

request_mock.assert_called_with(
method="POST",
url="/storage_boxes/42/subaccounts/45/actions/reset_subaccount_password",
json={
"password": "password",
},
)

assert_bound_action1(action, resource_client._parent.actions)

def test_update_subaccount_access_settings(
self,
request_mock: mock.MagicMock,
resource_client: StorageBoxesClient,
action_response,
):
request_mock.return_value = action_response

action = resource_client.update_subaccount_access_settings(
StorageBoxSubaccount(id=45, storage_box=StorageBox(42)),
access_settings=StorageBoxSubaccountAccessSettings(
reachable_externally=True,
ssh_enabled=True,
samba_enabled=False,
),
)

request_mock.assert_called_with(
method="POST",
url="/storage_boxes/42/subaccounts/45/actions/update_access_settings",
json={
"reachable_externally": True,
"ssh_enabled": True,
"samba_enabled": False,
},
)

assert_bound_action1(action, resource_client._parent.actions)