From 312fe476ce5ce7380354c0f5b07cb6dedf3e476e Mon Sep 17 00:00:00 2001 From: Jonas Lammler Date: Tue, 8 Sep 2026 11:34:52 +0200 Subject: [PATCH 1/2] feat(server): always read public_net config into state This ensure that when importing a server, the plan does not propose a public network update, forcing a server power cycle. --- internal/server/resource.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/internal/server/resource.go b/internal/server/resource.go index 54458aa33..f2d0ffeae 100644 --- a/internal/server/resource.go +++ b/internal/server/resource.go @@ -1257,20 +1257,30 @@ func getServerAttributes(d *schema.ResourceData, s *hcloud.Server, forceSetNetwo "firewall_ids": firewallIDs, "primary_disk_size": s.PrimaryDiskSize, } + resPublicNet := []map[string]any{{}} + if s.PublicNet.IPv4.IsUnspecified() { res["ipv4_address"] = nil + resPublicNet[0]["ipv4_enabled"] = false } else { res["ipv4_address"] = s.PublicNet.IPv4.IP.String() + resPublicNet[0]["ipv4_enabled"] = true + resPublicNet[0]["ipv4"] = s.PublicNet.IPv4.ID } if len(s.PublicNet.IPv6.IP) == 0 { // No IPv6 Primary IP assigned res["ipv6_address"] = nil + resPublicNet[0]["ipv6_enabled"] = false } else { // Set first IP in assigned subnet range res["ipv6_address"] = s.PublicNet.IPv6.IP.String() + "1" + resPublicNet[0]["ipv6_enabled"] = true + resPublicNet[0]["ipv6"] = s.PublicNet.IPv6.ID } + res["public_net"] = resPublicNet + if s.Image != nil { if s.Image.Name != "" && util.FormatID(s.Image.ID) != d.Get("image") { // Only use the image name if the image is official (Name != "") From d798ea76b22582ff972f176e7e788d0836e48ee7 Mon Sep 17 00:00:00 2001 From: Jonas Lammler Date: Tue, 8 Sep 2026 18:55:17 +0200 Subject: [PATCH 2/2] fix: mark public_net as computer and remove diff suppression A optional attribute with its diff suppressed when undefined is in the end a computed value. --- internal/server/resource.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/internal/server/resource.go b/internal/server/resource.go index f2d0ffeae..cdce8b8fe 100644 --- a/internal/server/resource.go +++ b/internal/server/resource.go @@ -169,12 +169,7 @@ func Resource() *schema.Resource { "public_net": { Type: schema.TypeSet, Optional: true, - DiffSuppressFunc: func(_, _, _ string, d *schema.ResourceData) bool { - // Diff is only valid if "public_net" resource is set in - // terraform configuration. - _, ok := d.GetOk("public_net") - return !ok // Negate because we do **not** want to suppress the diff. - }, + Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ipv4_enabled": {