diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 00000000..1b763b1b --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1 @@ +CHANGELOG.md diff --git a/.vscode/settings.json b/.vscode/settings.json index e2db3ac1..ff6e40d9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,7 @@ "proxmoxtf", "qcow", "rootfs", + "tflog", "unmanaged", "virtio", "VLANID", diff --git a/fwprovider/provider.go b/fwprovider/provider.go index 3f7a6d91..7b1dbe04 100644 --- a/fwprovider/provider.go +++ b/fwprovider/provider.go @@ -9,6 +9,7 @@ package fwprovider import ( "context" "fmt" + "net" "regexp" "strings" @@ -402,12 +403,14 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox networkDevices, err := nc.ListNetworkInterfaces(ctx) if err != nil { - return ssh.ProxmoxNode{}, fmt.Errorf("failed to list network devices of node \"%s\": %w", nc.NodeName, err) + return ssh.ProxmoxNode{}, fmt.Errorf("failed to list network devices of node %q: %w", nc.NodeName, err) } nodeAddress := "" // try IPv4 address on the interface with IPv4 gateway + tflog.Debug(ctx, "Attempting to find interfaces with both a static IPV4 address and gateway.") + for _, d := range networkDevices { if d.Gateway != nil && d.Address != nil { nodeAddress = *d.Address @@ -417,6 +420,8 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox if nodeAddress == "" { // fallback 1: try IPv6 address on the interface with IPv6 gateway + tflog.Debug(ctx, "Attempting to find interfaces with both a static IPV6 address and gateway.") + for _, d := range networkDevices { if d.Gateway6 != nil && d.Address6 != nil { nodeAddress = *d.Address6 @@ -427,6 +432,8 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox if nodeAddress == "" { // fallback 2: use first interface with any IPv4 address + tflog.Debug(ctx, "Attempting to find interfaces with at least a static IPV4 address.") + for _, d := range networkDevices { if d.Address != nil { nodeAddress = *d.Address @@ -435,6 +442,23 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox } } + if nodeAddress == "" { + // fallback 3: do a good old DNS lookup + tflog.Debug(ctx, fmt.Sprintf("Attempting a DNS lookup of node %q.", nc.NodeName)) + + ips, err := net.LookupIP(nodeName) + if err != nil { + for _, ip := range ips { + if ipv4 := ip.To4(); ipv4 != nil { + nodeAddress = ipv4.String() + break + } + } + } else { + tflog.Debug(ctx, fmt.Sprintf("Failed to do a DNS lookup of the node: %s", err.Error())) + } + } + if nodeAddress == "" { return ssh.ProxmoxNode{}, fmt.Errorf("failed to determine the IP address of node \"%s\"", nc.NodeName) } diff --git a/proxmoxtf/provider/provider.go b/proxmoxtf/provider/provider.go index fe4f1c21..160fe7eb 100644 --- a/proxmoxtf/provider/provider.go +++ b/proxmoxtf/provider/provider.go @@ -9,8 +9,10 @@ package provider import ( "context" "fmt" + "net" "strings" + "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -176,12 +178,14 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox networkDevices, err := nc.ListNetworkInterfaces(ctx) if err != nil { - return ssh.ProxmoxNode{}, fmt.Errorf("failed to list network devices of node \"%s\": %w", nc.NodeName, err) + return ssh.ProxmoxNode{}, fmt.Errorf("failed to list network devices of node %q: %w", nc.NodeName, err) } nodeAddress := "" // try IPv4 address on the interface with IPv4 gateway + tflog.Debug(ctx, "Attempting to find interfaces with both a static IPV4 address and gateway.") + for _, d := range networkDevices { if d.Gateway != nil && d.Address != nil { nodeAddress = *d.Address @@ -191,6 +195,8 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox if nodeAddress == "" { // fallback 1: try IPv6 address on the interface with IPv6 gateway + tflog.Debug(ctx, "Attempting to find interfaces with both a static IPV6 address and gateway.") + for _, d := range networkDevices { if d.Gateway6 != nil && d.Address6 != nil { nodeAddress = *d.Address6 @@ -201,6 +207,8 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox if nodeAddress == "" { // fallback 2: use first interface with any IPv4 address + tflog.Debug(ctx, "Attempting to find interfaces with at least a static IPV4 address.") + for _, d := range networkDevices { if d.Address != nil { nodeAddress = *d.Address @@ -209,6 +217,23 @@ func (r *apiResolver) Resolve(ctx context.Context, nodeName string) (ssh.Proxmox } } + if nodeAddress == "" { + // fallback 3: do a good old DNS lookup + tflog.Debug(ctx, fmt.Sprintf("Attempting a DNS lookup of node %q.", nc.NodeName)) + + ips, err := net.LookupIP(nodeName) + if err != nil { + for _, ip := range ips { + if ipv4 := ip.To4(); ipv4 != nil { + nodeAddress = ipv4.String() + break + } + } + } else { + tflog.Debug(ctx, fmt.Sprintf("Failed to do a DNS lookup of the node: %s", err.Error())) + } + } + if nodeAddress == "" { return ssh.ProxmoxNode{}, fmt.Errorf("failed to determine the IP address of node \"%s\"", nc.NodeName) }