From 241f61338b8a140a79a43c80a78ad1a91c37b896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Thu, 29 Jan 2026 11:10:01 +0100 Subject: [PATCH] fix: unassign primary ip and floating ip before deletion (#796) ##### SUMMARY Explicitly unassign Primary IP and Floating IPs before deleting them. This allows us to better handle any errors that happen during the unassign and is consistent with the flow in our Terraform provider. ##### ISSUE TYPE - Bugfix Pull Request ##### COMPONENT NAME - `floating_ip` - `primary_ip` --------- Co-authored-by: jo --- changelogs/fragments/ip-unassign.yaml | 3 +++ plugins/modules/floating_ip.py | 22 +++++++++++++++------- plugins/modules/primary_ip.py | 17 +++++++++++++---- 3 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 changelogs/fragments/ip-unassign.yaml diff --git a/changelogs/fragments/ip-unassign.yaml b/changelogs/fragments/ip-unassign.yaml new file mode 100644 index 0000000..abf81a0 --- /dev/null +++ b/changelogs/fragments/ip-unassign.yaml @@ -0,0 +1,3 @@ +minor_changes: + - floating_ip - Unassign Floating IP before deleting it. + - primary_ip - Unassign Primary IP before deleting it. diff --git a/plugins/modules/floating_ip.py b/plugins/modules/floating_ip.py index 3ceab2c..eb6c7a4 100644 --- a/plugins/modules/floating_ip.py +++ b/plugins/modules/floating_ip.py @@ -281,16 +281,24 @@ class AnsibleFloatingIP(AnsibleHCloud): self.floating_ip = self.floating_ip.update(**params) def _delete(self): - if self.module.params.get("force") or self.floating_ip.server is None: + if self.floating_ip.server is not None: + if self.module.params.get("force"): + if not self.module.check_mode: + action = self.floating_ip.unassign() + action.wait_until_finished() + + self.floating_ip.delete() + self._mark_as_changed() + else: + self.module.warn( + "Floating IP is currently assigned to server " + f"{self.floating_ip.server.name}. You need to " + "unassign the Floating IP or use force=true." + ) + else: if not self.module.check_mode: self.floating_ip.delete() self._mark_as_changed() - else: - self.module.warn( - "Floating IP is currently assigned to server " - f"{self.floating_ip.server.name}. You need to " - "unassign the Floating IP or use force=true." - ) self.floating_ip = None diff --git a/plugins/modules/primary_ip.py b/plugins/modules/primary_ip.py index 833b83d..f19bf24 100644 --- a/plugins/modules/primary_ip.py +++ b/plugins/modules/primary_ip.py @@ -289,6 +289,18 @@ class AnsiblePrimaryIP(AnsibleHCloud): if not self.module.check_mode: self.primary_ip = self.primary_ip.update(**params) + def _delete(self): + if self.primary_ip.assignee_id is not None: + if not self.module.check_mode: + action = self.primary_ip.unassign() + action.wait_until_finished() + self._mark_as_changed() + + if not self.module.check_mode: + self.primary_ip.delete() + self.primary_ip = None + self._mark_as_changed() + def present(self): try: self._get() @@ -303,10 +315,7 @@ class AnsiblePrimaryIP(AnsibleHCloud): try: self._get() if self.primary_ip is not None: - if not self.module.check_mode: - self.primary_ip.delete() - self._mark_as_changed() - self.primary_ip = None + self._delete() except HCloudException as exception: self.fail_json_hcloud(exception)