1
from landscape.tests.helpers import LandscapeTest
2
from landscape.lib.dns import (
3
_lookup_server_record, _lookup_hostname, discover_server)
5
from twisted.internet import defer
6
from twisted.names import dns
7
from twisted.names.error import ResolverError
10
class FakeResolverResult(object):
12
A fake resolver result returned by L{FakeResolver}.
14
@param type: The result type L{twisted.names.dns.SRV}
15
@param payload: The result contents
20
class Payload(object):
22
A payload result returned by fake resolver.
24
@param target: The result of the lookup
31
A payload target returned by fake resolver.
33
@param name: The name contained by the target.
38
self.payload = Payload()
39
self.payload.target = Target()
42
class FakeResolver(object):
44
A fake resolver that mimics L{twisted.names.client.Resolver}
51
def lookupService(self, arg1):
53
deferred = defer.Deferred()
54
deferred.callback(self.results)
57
def getHostByName(self, arg1):
59
deferred = defer.Deferred()
60
deferred.callback(self.name)
64
class BadResolver(object):
66
A resolver that mimics L{twisted.names.client.Resolver} and always returns
69
def lookupService(self, arg1):
70
deferred = defer.Deferred()
71
deferred.errback(ResolverError("Couldn't connect"))
74
def getHostByName(self, arg1):
75
deferred = defer.Deferred()
76
deferred.errback(ResolverError("Couldn't connect"))
80
class DnsSrvLookupTest(LandscapeTest):
81
def test_with_server_found(self):
83
Looking up a DNS SRV record should return the result of the lookup.
85
fake_result = FakeResolverResult()
86
fake_result.type = dns.SRV
87
fake_result.payload.target.name = "a.b.com"
88
fake_resolver = FakeResolver()
89
fake_resolver.results = [[fake_result]]
90
query_string = "_landscape._tcp.mylandscapehost.com"
93
self.assertEqual(fake_resolver.queried, query_string)
94
self.assertEqual("a.b.com", result)
96
d = _lookup_server_record(fake_resolver, query_string)
100
def test_with_server_not_found(self):
102
Looking up a DNS SRV record and finding nothing exists should return
105
fake_resolver = FakeResolver()
106
fake_resolver.results = [[]]
109
self.assertEqual("", result)
111
d = _lookup_server_record(fake_resolver,
112
"_landscape._tcp.mylandscapehost.com")
116
def test_with_resolver_error(self):
117
"""A resolver error triggers error handling code."""
118
# The failure should be properly logged
119
logging_mock = self.mocker.replace("logging.info")
120
logging_mock("SRV lookup of _landscape._tcp.mylandscapehost.com "
124
d = _lookup_server_record(BadResolver(),
125
"_landscape._tcp.mylandscapehost.com")
126
self.assertFailure(d, ResolverError)
130
class DnsNameLookupTest(LandscapeTest):
131
def test_with_name_found(self):
133
Looking up a DNS name record should return the result of the lookup.
135
fake_resolver = FakeResolver()
136
fake_resolver.name = "a.b.com"
137
query_string = "landscape.localdomain"
140
self.assertEqual(fake_resolver.queried, query_string)
141
self.assertEqual("a.b.com", result)
143
d = _lookup_hostname(None, fake_resolver, query_string)
147
def test_with_name_not_found(self):
149
Looking up a DNS NAME record and not finding a result should return
152
fake_resolver = FakeResolver()
153
fake_resolver.name = None
156
self.assertEqual(None, result)
158
d = _lookup_hostname(None, fake_resolver, "landscape.localdomain")
162
def test_with_resolver_error(self):
163
"""A resolver error triggers error handling code."""
164
# The failure should be properly logged
165
logging_mock = self.mocker.replace("logging.info")
166
logging_mock("Name lookup of landscape.localdomain failed.")
169
d = _lookup_hostname(None, BadResolver(), "landscape.localdomain")
170
self.assertFailure(d, ResolverError)
174
class DiscoverServerTest(LandscapeTest):
175
def test_srv_lookup(self):
176
"""The DNS name of the server is found using a SRV lookup."""
177
fake_result = FakeResolverResult()
178
fake_result.type = dns.SRV
179
fake_result.payload.target.name = "a.b.com"
180
fake_resolver = FakeResolver()
181
fake_resolver.results = [[fake_result]]
183
d = discover_server(resolver=fake_resolver)
186
self.assertEqual("a.b.com", result)
191
def test_a_name_lookup(self):
192
"""The DNS name of the server is found using an A name lookup."""
193
fake_resolver = FakeResolver()
194
fake_resolver.name = "x.y.com"
196
d = discover_server(resolver=fake_resolver)
199
self.assertEqual("x.y.com", result)
204
def test_failed_lookup(self):
205
"""A resolver error is returned when server autodiscovery fails."""
206
d = _lookup_server_record(BadResolver(), "landscape.localdomain")
207
self.assertFailure(d, ResolverError)