160 lines
5.2 KiB
Go
160 lines
5.2 KiB
Go
package nameserver
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"testing"
|
|
|
|
. "github.com/weaveworks/weave/common"
|
|
wt "github.com/weaveworks/weave/testing"
|
|
)
|
|
|
|
func TestZone(t *testing.T) {
|
|
var (
|
|
container1 = "deadbeef"
|
|
container2 = "cowjuice"
|
|
name1 = "test1.weave."
|
|
name1Addr1 = "10.9.2.1/24"
|
|
name1Addr2 = "10.9.2.2/24"
|
|
revName1Addr1 = "1.2.9.10.in-addr.arpa."
|
|
)
|
|
|
|
InitDefaultLogging(testing.Verbose())
|
|
|
|
zone, err := NewZoneDb(ZoneConfig{})
|
|
wt.AssertNoErr(t, err)
|
|
err = zone.Start()
|
|
wt.AssertNoErr(t, err)
|
|
defer zone.Stop()
|
|
|
|
ip1, _, _ := net.ParseCIDR(name1Addr1)
|
|
t.Logf("Adding '%s'/%s to '%s'", name1, ip1, container1)
|
|
err = zone.AddRecord(container1, name1, ip1)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
// Add a few more records to make the job harder
|
|
t.Logf("Adding 'adummy.weave.' to 'abcdef0123'")
|
|
err = zone.AddRecord("abcdef0123", "adummy.weave.", net.ParseIP("10.9.0.1"))
|
|
wt.AssertNoErr(t, err)
|
|
t.Logf("Adding 'zdummy.weave.' to '0123abcdef'")
|
|
err = zone.AddRecord("0123abcdef", "zdummy.weave.", net.ParseIP("10.9.0.2"))
|
|
wt.AssertNoErr(t, err)
|
|
t.Logf("Zone database:\n%s", zone)
|
|
|
|
t.Logf("Checking if we can find the name '%s'", name1)
|
|
foundIPs, err := zone.LookupName(name1)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
if !foundIPs[0].IP().Equal(ip1) {
|
|
t.Fatal("Unexpected result for", name1, foundIPs)
|
|
}
|
|
|
|
t.Logf("Checking if we cannot find some silly name like 'something.wrong'")
|
|
foundIPs, err = zone.LookupName("something.wrong")
|
|
wt.AssertErrorType(t, err, (*LookupError)(nil), fmt.Sprintf("unknown name: %+v", foundIPs))
|
|
|
|
ip2, _, _ := net.ParseCIDR(name1Addr2)
|
|
t.Logf("Adding a second IP for '%s'/%s to '%s'", name1, ip2, container1)
|
|
err = zone.AddRecord(container1, name1, ip2)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
t.Logf("Checking if we can find both the old IP and the new IP for '%s'", name1)
|
|
foundIPs, err = zone.LookupName(name1)
|
|
wt.AssertNoErr(t, err)
|
|
if !(foundIPs[0].IP().Equal(ip1) || foundIPs[1].IP().Equal(ip1)) {
|
|
t.Fatal("Unexpected result for", name1, foundIPs)
|
|
}
|
|
if !(foundIPs[0].IP().Equal(ip2) || foundIPs[1].IP().Equal(ip2)) {
|
|
t.Fatal("Unexpected result for", name1, foundIPs)
|
|
}
|
|
|
|
t.Logf("Checking if we can find the address by IP '1.2.9.10.in-addr.arpa.'")
|
|
foundNames, err := zone.LookupInaddr("1.2.9.10.in-addr.arpa.")
|
|
wt.AssertNoErr(t, err)
|
|
|
|
if foundNames[0].Name() != name1 {
|
|
t.Fatal("Unexpected result for", ip1, foundNames)
|
|
}
|
|
|
|
t.Logf("Checking we can not find an unknown address '30.20.10.1.in-addr.arpa.'")
|
|
foundNames, err = zone.LookupInaddr("30.20.10.1.in-addr.arpa.")
|
|
wt.AssertErrorType(t, err, (*LookupError)(nil), fmt.Sprintf("unknown IP: %+v", foundNames))
|
|
|
|
t.Logf("Checking if adding again '%s'/%s in %s results in an error", name1, ip1, container1)
|
|
err = zone.AddRecord(container1, name1, ip1)
|
|
wt.AssertErrorType(t, err, (*DuplicateError)(nil), "duplicate add")
|
|
|
|
t.Logf("Adding '%s'/%s in %s too", name1, ip1, container2)
|
|
err = zone.AddRecord(container2, name1, ip1)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
name1Removed := 0
|
|
err = zone.ObserveName(name1, func() { t.Logf("Observer #1 for '%s' notified.", name1); name1Removed++ })
|
|
wt.AssertNoErr(t, err)
|
|
err = zone.ObserveName(name1, func() { t.Logf("Observer #2 for '%s' notified.", name1); name1Removed++ })
|
|
wt.AssertNoErr(t, err)
|
|
err = zone.ObserveInaddr(revName1Addr1, func() { t.Logf("Observer #1 for '%s' notified.", revName1Addr1); name1Removed++ })
|
|
wt.AssertNoErr(t, err)
|
|
|
|
t.Logf("Zone database:\n%s", zone)
|
|
t.Logf("Deleting the %s in %s", ip1, container1)
|
|
count := zone.DeleteRecords(container1, "", ip1)
|
|
wt.AssertEqualInt(t, count, 1, "delete failed")
|
|
t.Logf("Zone database:\n%s", zone)
|
|
|
|
t.Logf("Checking %s's observers have been notified on removal", name1)
|
|
if name1Removed < 3 {
|
|
t.Logf("Zone database:\n%s", zone)
|
|
t.Fatalf("Unexpected number (%d) of calls to observers", name1Removed)
|
|
}
|
|
|
|
t.Logf("Checking %s can be found", name1)
|
|
_, err = zone.LookupName(name1)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
t.Logf("Checking %s is not found after removing %s it in %s and %s in %s",
|
|
name1, ip1, container2, ip2, container1)
|
|
count = zone.DeleteRecords(container1, "", ip2)
|
|
wt.AssertEqualInt(t, count, 1, "delete failed")
|
|
count = zone.DeleteRecords(container2, "", ip1)
|
|
wt.AssertEqualInt(t, count, 1, "delete failed")
|
|
t.Logf("Zone database:\n%s", zone)
|
|
_, err = zone.LookupName(name1)
|
|
wt.AssertErrorType(t, err, (*LookupError)(nil), "after deleting record")
|
|
|
|
t.Logf("Checking if removing an unknown record results in an error")
|
|
count = zone.DeleteRecords(container1, "", net.ParseIP("0.0.0.0"))
|
|
wt.AssertEqualInt(t, count, 0, "delete failed")
|
|
}
|
|
|
|
func TestDeleteRecords(t *testing.T) {
|
|
var (
|
|
id = "foobar"
|
|
name = "foo.weave."
|
|
addr1 = "10.2.2.3/24"
|
|
addr2 = "10.2.7.8/24"
|
|
)
|
|
|
|
InitDefaultLogging(testing.Verbose())
|
|
|
|
zone, err := NewZoneDb(ZoneConfig{})
|
|
wt.AssertNoErr(t, err)
|
|
err = zone.Start()
|
|
wt.AssertNoErr(t, err)
|
|
defer zone.Stop()
|
|
|
|
for _, addr := range []string{addr1, addr2} {
|
|
ip, _, _ := net.ParseCIDR(addr)
|
|
err := zone.AddRecord(id, name, ip)
|
|
wt.AssertNoErr(t, err)
|
|
}
|
|
|
|
_, err = zone.LookupName(name)
|
|
wt.AssertNoErr(t, err)
|
|
|
|
count := zone.DeleteRecords(id, "", net.IP{})
|
|
wt.AssertEqualInt(t, count, 2, "wildcard delete failed")
|
|
_, err = zone.LookupName(name)
|
|
wt.AssertErrorType(t, err, (*LookupError)(nil), "after deleting records for ident")
|
|
}
|