Skip to content

Commit 57cd6a4

Browse files
authored
1 parent 1c9bd3a commit 57cd6a4

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

hcloud/zones/client.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,21 @@ def add_rrset_records(
359359
"""
360360
return self._client.add_rrset_records(rrset=rrset, records=records, ttl=ttl)
361361

362+
def update_rrset_records(
363+
self,
364+
rrset: ZoneRRSet | BoundZoneRRSet,
365+
records: list[ZoneRecord],
366+
) -> BoundAction:
367+
"""
368+
Updates records in a ZoneRRSet.
369+
370+
See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-update-records-to-an-rrset
371+
372+
:param rrset: RRSet to update.
373+
:param records: Records to update in the RRSet.
374+
"""
375+
return self._client.update_rrset_records(rrset=rrset, records=records)
376+
362377
def remove_rrset_records(
363378
self,
364379
rrset: ZoneRRSet | BoundZoneRRSet,
@@ -479,6 +494,19 @@ def add_rrset_records(
479494
"""
480495
return self._client.add_rrset_records(self, records=records, ttl=ttl)
481496

497+
def update_rrset_records(
498+
self,
499+
records: list[ZoneRecord],
500+
) -> BoundAction:
501+
"""
502+
Updates records in a ZoneRRSet.
503+
504+
See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-update-records-to-an-rrset
505+
506+
:param records: Records to update in the RRSet.
507+
"""
508+
return self._client.update_rrset_records(self, records=records)
509+
482510
def remove_rrset_records(
483511
self,
484512
records: list[ZoneRecord],
@@ -1172,6 +1200,33 @@ def add_rrset_records(
11721200
)
11731201
return BoundAction(self._parent.actions, response["action"])
11741202

1203+
def update_rrset_records(
1204+
self,
1205+
rrset: ZoneRRSet | BoundZoneRRSet,
1206+
records: list[ZoneRecord],
1207+
) -> BoundAction:
1208+
"""
1209+
Updates records in a ZoneRRSet.
1210+
1211+
See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-update-records-to-an-rrset
1212+
1213+
:param rrset: RRSet to update.
1214+
:param records: Records to update in the RRSet.
1215+
"""
1216+
if rrset.zone is None:
1217+
raise ValueError("rrset zone property is none")
1218+
1219+
data: dict[str, Any] = {
1220+
"records": [o.to_payload() for o in records],
1221+
}
1222+
1223+
response = self._client.request(
1224+
method="POST",
1225+
url=f"{self._base_url}/{rrset.zone.id_or_name}/rrsets/{rrset.name}/{rrset.type}/actions/update_records",
1226+
json=data,
1227+
)
1228+
return BoundAction(self._parent.actions, response["action"])
1229+
11751230
def remove_rrset_records(
11761231
self,
11771232
rrset: ZoneRRSet | BoundZoneRRSet,

tests/unit/zones/test_client.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,55 @@ def test_add_rrset_records(
752752

753753
assert_bound_action1(action, resource_client._parent.actions)
754754

755+
@pytest.mark.parametrize(
756+
"zone",
757+
[
758+
Zone(name="example.com"),
759+
BoundZone(client=mock.MagicMock(), data={"id": 42}),
760+
],
761+
)
762+
@pytest.mark.parametrize(
763+
"rrset",
764+
[
765+
ZoneRRSet(name="www", type="A"),
766+
BoundZoneRRSet(client=mock.MagicMock(), data={"id": "www/A"}),
767+
],
768+
)
769+
def test_update_rrset_records(
770+
self,
771+
request_mock: mock.MagicMock,
772+
resource_client: ZonesClient,
773+
zone: Zone,
774+
rrset: ZoneRRSet,
775+
action_response,
776+
):
777+
rrset.zone = zone
778+
779+
request_mock.return_value = action_response
780+
781+
action = resource_client.update_rrset_records(
782+
rrset,
783+
records=[
784+
ZoneRecord("198.51.100.1", "web server"),
785+
ZoneRecord("198.51.100.2", ""),
786+
ZoneRecord("127.0.0.1"),
787+
],
788+
)
789+
790+
request_mock.assert_called_with(
791+
method="POST",
792+
url=f"/zones/{zone.id_or_name}/rrsets/{rrset.name}/{rrset.type}/actions/update_records",
793+
json={
794+
"records": [
795+
{"value": "198.51.100.1", "comment": "web server"},
796+
{"value": "198.51.100.2", "comment": ""},
797+
{"value": "127.0.0.1"},
798+
],
799+
},
800+
)
801+
802+
assert_bound_action1(action, resource_client._parent.actions)
803+
755804
@pytest.mark.parametrize(
756805
"zone",
757806
[
@@ -866,6 +915,7 @@ class TestBoundZone(BoundModelTestCase):
866915
(BoundZone.change_rrset_protection, {"sub_resource": True}),
867916
(BoundZone.change_rrset_ttl, {"sub_resource": True}),
868917
(BoundZone.add_rrset_records, {"sub_resource": True}),
918+
(BoundZone.update_rrset_records, {"sub_resource": True}),
869919
(BoundZone.remove_rrset_records, {"sub_resource": True}),
870920
(BoundZone.set_rrset_records, {"sub_resource": True}),
871921
]
@@ -927,6 +977,7 @@ class TestBoundZoneRRSet(BoundModelTestCase):
927977
BoundZoneRRSet.change_rrset_protection,
928978
BoundZoneRRSet.change_rrset_ttl,
929979
BoundZoneRRSet.add_rrset_records,
980+
BoundZoneRRSet.update_rrset_records,
930981
BoundZoneRRSet.remove_rrset_records,
931982
BoundZoneRRSet.set_rrset_records,
932983
]

0 commit comments

Comments
 (0)