Merge lp:~jseutter/landscape-client/autodiscover-questions into lp:~landscape/landscape-client/trunk

Proposed by Jerry Seutter
Status: Superseded
Proposed branch: lp:~jseutter/landscape-client/autodiscover-questions
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 495 lines (+130/-38)
11 files modified
debian/landscape-client.config (+9/-0)
debian/landscape-client.templates (+21/-0)
landscape-client.conf (+0/-2)
landscape/broker/config.py (+10/-0)
landscape/broker/dnslookup.py (+14/-9)
landscape/broker/ping.py (+22/-4)
landscape/broker/service.py (+6/-2)
landscape/broker/tests/test_config.py (+4/-4)
landscape/broker/tests/test_dnslookup.py (+22/-13)
landscape/broker/tests/test_ping.py (+3/-1)
landscape/broker/transport.py (+19/-3)
To merge this branch: bzr merge lp:~jseutter/landscape-client/autodiscover-questions
Reviewer Review Type Date Requested Status
Landscape Pending
Landscape Pending
Review via email: mp+91957@code.launchpad.net

This proposal has been superseded by a proposal from 2012-02-08.

Description of the change

This branch adds questions to debconf for server autodiscovery. It asks 3 questions:
- should server autodiscovery be done?
- What string should be used for DNS SRV queries (default to _landscape._tcp.localdomain)
- What string should be used for DNS A queries (default to landscape.localdomain)

I don't have any experience with this so I could be doing something dubious, dastardly or even diabolical.

To post a comment you must log in.
459. By Jerry Seutter

Fixing bugs in landscape-client.config

460. By Jerry Seutter

Transmitting new settings from debconf back to landscape-client.

461. By Jerry Seutter

Adding a default setting to the templates file

462. By Jerry Seutter

Merge from trunk.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/landscape-client.config'
2--- debian/landscape-client.config 2011-10-07 12:14:19 +0000
3+++ debian/landscape-client.config 2012-02-08 00:58:28 +0000
4@@ -29,6 +29,9 @@
5 HTTPS_PROXY=$(get_var_from_file "https_proxy" "$CONFIGFILE")
6 OTP=$(get_var_from_file "otp" "$CONFIGFILE")
7 TAGS=$(get_var_from_file "tags" "$CONFIG_FILE")
8+ SERVER_AUTODISCOVER=$(get_var_from_file "server_autodiscover" "$CONFIG_FILE")
9+ AUTODISCOVER_SRV_QUERY_STRING=$(get_var_from_file "autodiscover_srv_query_string" "$CONFIG_FILE")
10+ AUTODISCOVER_A_QUERY_STRING=$(get_var_from_file "autodiscover_a_query_string" "$CONFIG_FILE")
11
12 # Store values from config file into
13 # debconf db.
14@@ -45,6 +48,9 @@
15 db_set $PACKAGE/https_proxy $HTTPS_PROXY
16 db_set $PACKAGE/otp $OTP
17 db_set $PACKAGE/tags $TAGS
18+ db_set $PACKAGE/server_autodiscover $TAGS
19+ db_set $PACKAGE/autodiscover_srv_query_string $TAGS
20+ db_set $PACKAGE/autodiscover_a_query_string $TAGS
21 fi
22
23 # Ask questions.
24@@ -58,5 +64,8 @@
25 db_input "$priority" $PACKAGE/computer_title || true
26 db_input "$priority" $PACKAGE/account_name || true
27 db_input "$priority" $PACKAGE/registration_password || true
28+db_input "$priority" $PACKAGE/server_autodiscover || true
29+db_input "$priority" $PACKAGE/autodiscover_srv_query_string || true
30+db_input "$priority" $PACKAGE/autodiscover_a_query_string || true
31 db_go || true
32
33
34=== modified file 'debian/landscape-client.templates'
35--- debian/landscape-client.templates 2011-10-20 10:59:10 +0000
36+++ debian/landscape-client.templates 2012-02-08 00:58:28 +0000
37@@ -83,3 +83,24 @@
38 Register this system with a preexisting Landscape account. Please
39 go to http://landscape.canonical.com if you need a Landscape account.
40
41+Template: landscape-client/server_autodiscover
42+Type: boolean
43+Default: false
44+_Description: Enable server autodiscovery?
45+ Enable DNS searches to discover the hostname of a Landscape Dedicated
46+ Server.
47+
48+Template: landscape-client/autodiscover_srv_query_string
49+Type: string
50+Default: _landscape._tcp.localdomain
51+_Description: DNS SRV query string for discovering the server name:
52+ When server autodiscovery is enabled, this string is used to make a
53+ DNS SRV query to find the location of the Landscape server. This
54+ will override portions of the ping url and https url settings.
55+
56+Template: landscape-client/autodiscover_a_query_string
57+Type: string
58+_Description: DNS A name query string for discovering the server name:
59+ When server autodiscovery is enabled, this string is used to make a
60+ DNS A name query to find the location of the Landscape server. This
61+ will override portions of the ping url and https url settings.
62
63=== modified file 'landscape-client.conf'
64--- landscape-client.conf 2012-01-21 00:07:53 +0000
65+++ landscape-client.conf 2012-02-08 00:58:28 +0000
66@@ -9,5 +9,3 @@
67 log_level = debug
68 pid_file = /tmp/landscape/landscape-client.pid
69 ping_url = http://localhost:8081/ping
70-server_autodiscover = false
71-
72
73=== modified file 'landscape/broker/config.py'
74--- landscape/broker/config.py 2012-02-02 02:49:13 +0000
75+++ landscape/broker/config.py 2012-02-08 00:58:28 +0000
76@@ -45,6 +45,9 @@
77 - C{otp}
78 - C{record}
79 - C{provisioning_otp}
80+ - C{server_autodiscover}
81+ - C{autodiscover_srv_query_string}
82+ - C{autodiscover_a_query_string}
83 """
84 parser = super(BrokerConfiguration, self).make_parser()
85
86@@ -91,6 +94,13 @@
87 help="The OTP to use for a provisioned machine.")
88 parser.add_option("--server-autodiscover", type="string",
89 default="false", help="Enable server autodiscovery.")
90+ parser.add_option("--autodiscover-srv-query-string", type="string",
91+ default="_tcp._landscape.localdomain",
92+ help="autodiscovery string for DNS SRV queries")
93+ parser.add_option("--autodiscover-a-query-string", type="string",
94+ default="landscape.localdomain",
95+ help="autodiscovery string for DNS A queries")
96+
97 return parser
98
99 @property
100
101=== modified file 'landscape/broker/dnslookup.py'
102--- landscape/broker/dnslookup.py 2012-02-02 01:39:15 +0000
103+++ landscape/broker/dnslookup.py 2012-02-08 00:58:28 +0000
104@@ -5,31 +5,36 @@
105 from twisted.names.client import Resolver
106
107
108-def discover_server(resolver=None):
109+def discover_server(resolver=None, autodiscover_srv_query_string="",
110+ autodiscover_a_query_string=""):
111 """
112 Look up the dns location of the landscape server.
113
114 @type resolver: The resolver to use. If none is specified a resolver that
115 uses settings from /etc/resolv.conf will be created.
116+ @param autodiscover_srv_query_string: The query string to send to the DNS
117+ server when making a SRV query.
118+ @param autodiscover_a_query_string: The query string to send to the DNS
119+ server when making a A query.
120 """
121 if not resolver:
122 resolver = Resolver("/etc/resolv.conf")
123- d = lookup_server_record(resolver)
124- d.addErrback(lookup_hostname, resolver)
125+ d = lookup_server_record(resolver, autodiscover_srv_query_string)
126+ d.addErrback(lookup_hostname, resolver, autodiscover_a_query_string)
127 return d
128
129
130-def lookup_server_record(resolver):
131+def lookup_server_record(resolver, service_name):
132 """
133 Do a DNS SRV record lookup for the location of the landscape server.
134
135 @type resolver: A resolver to use for DNS lookups
136 L{twisted.names.client.Resolver}.
137+ @param service_name: The query string to send to the DNS server when
138+ making a SRV query.
139 @return: A deferred containing either the hostname of the landscape server
140 if found or an empty string if not found.
141 """
142- service_name = "_landscape._tcp.mylandscapehost.com"
143-
144 def lookup_done(result):
145 name = ""
146 for item in result:
147@@ -49,17 +54,17 @@
148 return d
149
150
151-def lookup_hostname(result, resolver):
152+def lookup_hostname(result, resolver, hostname):
153 """
154 Do a DNS name lookup for the location of the landscape server.
155
156 @param result: The result from a call to lookup_server_record.
157 @param resolver: The resolver to use for DNS lookups.
158+ @param hostname: The query string to send to the DNS server when making
159+ a A query.
160 @param return: A deferred containing the ip address of the landscape
161 server if found or None if not found.
162 """
163- hostname = "landscape.localdomain"
164-
165 def lookup_done(result):
166 return result
167
168
169=== modified file 'landscape/broker/ping.py'
170--- landscape/broker/ping.py 2012-01-27 22:00:02 +0000
171+++ landscape/broker/ping.py 2012-02-08 00:58:28 +0000
172@@ -22,10 +22,19 @@
173 @param url: The URL to ask the question to.
174 @type identity: L{landscape.broker.registration.Identity}
175 @param identity: This client's identity.
176+ @param get_page: The method to use to retrieve content. If not specified,
177+ landscape.lib.fetch.fetch is used.
178+ @param server_autodiscovery: Server autodiscovery is performed if True,
179+ otherwise server autodiscover is not done.
180+ @param autodiscover_srv_query_string: If server autodiscovery is done, this
181+ string will be sent to the DNS server when making a SRV query.
182+ @param autodiscover_a_query_string: If server autodiscovery is done, this
183+ string will be sent to the DNS server when making an A query.
184 """
185
186 def __init__(self, reactor, url, identity, get_page=None,
187- server_autodiscover=False):
188+ server_autodiscover=False, autodiscover_srv_query_string="",
189+ autodiscover_a_query_string=""):
190 if get_page is None:
191 get_page = fetch
192 self._reactor = reactor
193@@ -33,6 +42,8 @@
194 self.get_page = get_page
195 self.url = url
196 self._server_autodiscover = server_autodiscover
197+ self._autodiscover_srv_query_string = autodiscover_srv_query_string
198+ self._autodiscover_a_query_string = autodiscover_a_query_string
199
200 def ping(self):
201 """Ask the question.
202@@ -72,7 +83,9 @@
203 return defer.succeed(False)
204
205 if self._server_autodiscover:
206- lookup_deferred = discover_server()
207+ lookup_deferred = discover_server(
208+ None, self._autodiscover_srv_query_string,
209+ self._autodiscover_a_query_string)
210 lookup_deferred.addCallback(handle_result)
211 lookup_deferred.addCallback(do_rest)
212 return lookup_deferred
213@@ -103,7 +116,8 @@
214
215 def __init__(self, reactor, url, identity, exchanger,
216 interval=30, ping_client_factory=PingClient,
217- server_autodiscover=False):
218+ server_autodiscover=False, autodiscover_srv_query_string="",
219+ autodiscover_a_query_string=""):
220 self._url = url
221 self._interval = interval
222 self._identity = identity
223@@ -113,6 +127,8 @@
224 self._ping_client = None
225 self.ping_client_factory = ping_client_factory
226 self._server_autodiscover = server_autodiscover
227+ self._autodiscover_srv_query_string = autodiscover_srv_query_string
228+ self._autodiscover_a_query_string = autodiscover_a_query_string
229 reactor.call_on("message", self._handle_set_intervals)
230
231 def get_url(self):
232@@ -130,7 +146,9 @@
233 """Start pinging."""
234 self._ping_client = self.ping_client_factory(
235 self._reactor, self._url, self._identity,
236- server_autodiscover=self._server_autodiscover)
237+ server_autodiscover=self._server_autodiscover,
238+ autodiscover_srv_query_string=self._autodiscover_srv_query_string,
239+ autodiscover_a_query_string=self._autodiscover_a_query_string)
240 self._call_id = self._reactor.call_every(self._interval, self.ping)
241
242 def ping(self):
243
244=== modified file 'landscape/broker/service.py'
245--- landscape/broker/service.py 2012-01-30 16:11:20 +0000
246+++ landscape/broker/service.py 2012-02-08 00:58:28 +0000
247@@ -55,7 +55,9 @@
248
249 self.transport = self.transport_factory(
250 self.reactor, config.url, config.ssl_public_key,
251- self.payload_recorder, config.server_autodiscover)
252+ self.payload_recorder, config.server_autodiscover,
253+ config.autodiscover_srv_query_string,
254+ config.autodiscover_a_query_string)
255 self.message_store = get_default_message_store(
256 self.persist, config.message_store_path)
257 self.identity = Identity(self.config, self.persist)
258@@ -66,7 +68,9 @@
259 self.pinger = self.pinger_factory(
260 self.reactor, config.ping_url, self.identity, self.exchanger,
261 interval=config.ping_interval,
262- server_autodiscover=config.server_autodiscover)
263+ server_autodiscover=config.server_autodiscover,
264+ autodiscover_srv_query_string=config.autodiscover_srv_query_string,
265+ autodiscover_a_query_string=config.autodiscover_a_query_string)
266 self.registration = RegistrationHandler(
267 config, self.identity, self.reactor, self.exchanger, self.pinger,
268 self.message_store, fetch_async)
269
270=== modified file 'landscape/broker/tests/test_config.py'
271--- landscape/broker/tests/test_config.py 2012-02-02 02:49:13 +0000
272+++ landscape/broker/tests/test_config.py 2012-02-08 00:58:28 +0000
273@@ -92,19 +92,19 @@
274 self.assertEqual(configuration.url,
275 "https://landscape.canonical.com/message-system")
276
277- def test_server_autodiscovery_handling(self):
278+ def test_server_autodiscover_handling(self):
279 """
280 server_autodiscover is parsed and converted to a boolean value by
281 load().
282 """
283 configuration = BrokerConfiguration()
284 configuration.load([])
285- self.assertEquals(configuration.server_autodiscover, False)
286+ self.assertEqual(configuration.server_autodiscover, False)
287
288 configuration = BrokerConfiguration()
289 configuration.load(["--server-autodiscover=true"])
290- self.assertEquals(configuration.server_autodiscover, True)
291+ self.assertEqual(configuration.server_autodiscover, True)
292
293 configuration = BrokerConfiguration()
294 configuration.load(["--server-autodiscover=false"])
295- self.assertEquals(configuration.server_autodiscover, False)
296+ self.assertEqual(configuration.server_autodiscover, False)
297
298=== modified file 'landscape/broker/tests/test_dnslookup.py'
299--- landscape/broker/tests/test_dnslookup.py 2012-02-02 01:39:15 +0000
300+++ landscape/broker/tests/test_dnslookup.py 2012-02-08 00:58:28 +0000
301@@ -46,13 +46,16 @@
302 def __init__(self):
303 self.results = None
304 self.name = None
305+ self.queried = None
306
307 def lookupService(self, arg1):
308+ self.queried = arg1
309 deferred = defer.Deferred()
310 deferred.callback(self.results)
311 return deferred
312
313 def getHostByName(self, arg1):
314+ self.queried = arg1
315 deferred = defer.Deferred()
316 deferred.callback(self.name)
317 return deferred
318@@ -84,11 +87,13 @@
319 fake_result.payload.target.name = "a.b.com"
320 fake_resolver = FakeResolver()
321 fake_resolver.results = [[fake_result]]
322+ query_string = "_landscape._tcp.mylandscapehost.com"
323
324 def check(result):
325- self.assertEquals("a.b.com", result)
326+ self.assertEqual(fake_resolver.queried, query_string)
327+ self.assertEqual("a.b.com", result)
328
329- d = lookup_server_record(fake_resolver)
330+ d = lookup_server_record(fake_resolver, query_string)
331 d.addCallback(check)
332 return d
333
334@@ -101,9 +106,10 @@
335 fake_resolver.results = [[]]
336
337 def check(result):
338- self.assertEquals("", result)
339+ self.assertEqual("", result)
340
341- d = lookup_server_record(fake_resolver)
342+ d = lookup_server_record(fake_resolver,
343+ "_landscape._tcp.mylandscapehost.com")
344 d.addCallback(check)
345 return d
346
347@@ -115,7 +121,8 @@
348 "failed.")
349 self.mocker.replay()
350
351- d = lookup_server_record(BadResolver())
352+ d = lookup_server_record(BadResolver(),
353+ "_landscape._tcp.mylandscapehost.com")
354 self.assertFailure(d, ResolverError)
355 return d
356
357@@ -127,11 +134,13 @@
358 """
359 fake_resolver = FakeResolver()
360 fake_resolver.name = "a.b.com"
361+ query_string = "landscape.localdomain"
362
363 def check(result):
364- self.assertEquals("a.b.com", result)
365+ self.assertEqual(fake_resolver.queried, query_string)
366+ self.assertEqual("a.b.com", result)
367
368- d = lookup_hostname(None, fake_resolver)
369+ d = lookup_hostname(None, fake_resolver, query_string)
370 d.addCallback(check)
371 return d
372
373@@ -144,9 +153,9 @@
374 fake_resolver.name = None
375
376 def check(result):
377- self.assertEquals(None, result)
378+ self.assertEqual(None, result)
379
380- d = lookup_hostname(None, fake_resolver)
381+ d = lookup_hostname(None, fake_resolver, "landscape.localdomain")
382 d.addCallback(check)
383 return d
384
385@@ -157,7 +166,7 @@
386 logging_mock("Name lookup of landscape.localdomain failed.")
387 self.mocker.replay()
388
389- d = lookup_hostname(None, BadResolver())
390+ d = lookup_hostname(None, BadResolver(), "landscape.localdomain")
391 self.assertFailure(d, ResolverError)
392 return d
393
394@@ -174,7 +183,7 @@
395 d = discover_server(fake_resolver)
396
397 def check(result):
398- self.assertEquals("a.b.com", result)
399+ self.assertEqual("a.b.com", result)
400
401 d.addCallback(check)
402 return d
403@@ -187,13 +196,13 @@
404 d = discover_server(fake_resolver)
405
406 def check(result):
407- self.assertEquals("x.y.com", result)
408+ self.assertEqual("x.y.com", result)
409
410 d.addCallback(check)
411 return d
412
413 def test_failed_lookup(self):
414 """A resolver error is returned when server autodiscovery fails."""
415- d = lookup_server_record(BadResolver())
416+ d = lookup_server_record(BadResolver(), "landscape.localdomain")
417 self.assertFailure(d, ResolverError)
418 return d
419
420=== modified file 'landscape/broker/tests/test_ping.py'
421--- landscape/broker/tests/test_ping.py 2012-01-19 23:34:55 +0000
422+++ landscape/broker/tests/test_ping.py 2012-02-08 00:58:28 +0000
423@@ -128,7 +128,9 @@
424 self.url = "http://localhost:8081/whatever"
425 self.page_getter = FakePageGetter(None)
426
427- def factory(reactor, url, insecure_id, server_autodiscover):
428+ def factory(reactor, url, insecure_id, server_autodiscover,
429+ autodiscover_srv_query_string,
430+ autodiscover_a_query_string):
431 return PingClient(reactor, url, insecure_id,
432 get_page=self.page_getter.get_page)
433 self.pinger = Pinger(self.broker_service.reactor,
434
435=== modified file 'landscape/broker/transport.py'
436--- landscape/broker/transport.py 2012-01-26 23:37:53 +0000
437+++ landscape/broker/transport.py 2012-02-08 00:58:28 +0000
438@@ -22,15 +22,24 @@
439 @param pubkey: SSH public key used for secure communication.
440 @param payload_recorder: PayloadRecorder used for recording exchanges
441 with the server. If C{None}, exchanges will not be recorded.
442+ @param server_autodiscovery: Server autodiscovery is performed if True,
443+ otherwise server autodiscover is not done.
444+ @param autodiscover_srv_query_string: If server autodiscovery is done, this
445+ string will be sent to the DNS server when making a SRV query.
446+ @param autodiscover_a_query_string: If server autodiscovery is done, this
447+ string will be sent to the DNS server when making an A query.
448 """
449
450 def __init__(self, reactor, url, pubkey=None, payload_recorder=None,
451- server_autodiscover=False):
452+ server_autodiscover=False, autodiscover_srv_query_string="",
453+ autodiscover_a_query_string=""):
454 self._reactor = reactor
455 self._url = url
456 self._pubkey = pubkey
457 self._payload_recorder = payload_recorder
458 self._server_autodiscover = server_autodiscover
459+ self._autodiscover_srv_query_string = autodiscover_srv_query_string
460+ self._autodiscover_a_query_string = autodiscover_a_query_string
461
462 def get_url(self):
463 """Get the URL of the remote message system."""
464@@ -42,7 +51,10 @@
465
466 def _curl(self, payload, computer_id, message_api):
467 if self._server_autodiscover:
468- result = blockingCallFromThread(self._reactor, discover_server)
469+ result = blockingCallFromThread(
470+ self._reactor, discover_server, None,
471+ self._autodiscover_srv_query_string,
472+ self._autodiscover_a_query_string)
473 if result is not None:
474 self._url = "https://%s/message-system" % result
475 else:
476@@ -166,7 +178,9 @@
477 """Fake transport for testing purposes."""
478
479 def __init__(self, reactor=None, url=None, pubkey=None,
480- payload_recorder=None, server_autodiscover=False):
481+ payload_recorder=None, server_autodiscover=False,
482+ autodiscover_srv_query_string="",
483+ autodiscover_a_query_string=""):
484 self._pubkey = pubkey
485 self._payload_recorder = payload_recorder
486 self.payloads = []
487@@ -179,6 +193,8 @@
488 self._url = url
489 self._reactor = reactor
490 self._server_autodiscover = server_autodiscover
491+ self._autodiscover_srv_query_string = autodiscover_srv_query_string
492+ self._autodiscover_a_query_string = autodiscover_a_query_string
493
494 def get_url(self):
495 return self._url

Subscribers

People subscribed via source and target branches

to all changes: