From 422c64294937753ce47a737eec62eded76cf80b2 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Wed, 4 Oct 2023 03:24:30 +0200 Subject: [PATCH] fix: ensure ipv4 is checked, not sometimes ipv6 See https://git.coopcloud.tech/coop-cloud/organising/issues/490 --- pkg/dns/dns.go | 7 ++++++- pkg/dns/dns_test.go | 32 +++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/pkg/dns/dns.go b/pkg/dns/dns.go index 4c888a3f..46408049 100644 --- a/pkg/dns/dns.go +++ b/pkg/dns/dns.go @@ -7,11 +7,16 @@ import ( // EnsureIPv4 ensures that an ipv4 address is set for a domain name func EnsureIPv4(domainName string) (string, error) { - ipv4, err := net.ResolveIPAddr("ip", domainName) + ipv4, err := net.ResolveIPAddr("ip4", domainName) if err != nil { return "", err } + // NOTE(d1): e.g. when there is only an ipv6 record available + if ipv4 == nil { + return "", fmt.Errorf("unable to resolve ipv4 address for %s", domainName) + } + return ipv4.String(), nil } diff --git a/pkg/dns/dns_test.go b/pkg/dns/dns_test.go index 49b414fd..99249a71 100644 --- a/pkg/dns/dns_test.go +++ b/pkg/dns/dns_test.go @@ -3,6 +3,8 @@ package dns import ( "fmt" "testing" + + "gotest.tools/v3/assert" ) func TestEnsureDomainsResolveSameIPv4(t *testing.T) { @@ -11,9 +13,10 @@ func TestEnsureDomainsResolveSameIPv4(t *testing.T) { serverName string shouldValidate bool }{ - // NOTE(d1): DNS records get checked, so use something we control. if - // you're here because of a failing test, try `dig +short ` to - // ensure stuff matches first! + // NOTE(d1): DNS records get checked, so use something that is maintained + // within the federation. if you're here because of a failing test, try + // `dig +short ` to ensure stuff matches first! If flakyness + // becomes an issue we can look into mocking {"docs.coopcloud.tech", "coopcloud.tech", true}, {"docs.coopcloud.tech", "swarm.autonomic.zone", true}, @@ -36,3 +39,26 @@ func TestEnsureDomainsResolveSameIPv4(t *testing.T) { } } } + +func TestEnsureIpv4(t *testing.T) { + // NOTE(d1): DNS records get checked, so use something that is maintained + // within the federation. if you're here because of a failing test, try `dig + // +short ` to ensure stuff matches first! If flakyness becomes an + // issue we can look into mocking + domainName := "collabora.ostrom.collective.tools" + serverName := "ostrom.collective.tools" + + for i := 0; i < 15; i++ { + domainIpv4, err := EnsureIPv4(domainName) + if err != nil { + t.Fatal(err) + } + + serverIpv4, err := EnsureIPv4(serverName) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, domainIpv4, serverIpv4) + } +}