Merge lp:~rvb/maas/tftp-bug-1317705 into lp:~maas-committers/maas/trunk

Proposed by Raphaël Badin
Status: Merged
Approved by: Raphaël Badin
Approved revision: no longer in the source branch.
Merged at revision: 4014
Proposed branch: lp:~rvb/maas/tftp-bug-1317705
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 110 lines (+49/-2)
4 files modified
src/provisioningserver/monkey.py (+13/-0)
src/provisioningserver/plugin.py (+5/-1)
src/provisioningserver/tests/test_monkey.py (+22/-1)
src/provisioningserver/tests/test_plugin.py (+9/-0)
To merge this branch: bzr merge lp:~rvb/maas/tftp-bug-1317705
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+261937@code.launchpad.net

Commit message

Monkey patch the TFTP server to add error code 8.

Description of the change

Fix has landed upstream but this is taking forever to be SRUed so I think it's worth monkey patching this since the patch is simple.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/provisioningserver/monkey.py'
--- src/provisioningserver/monkey.py 2015-06-08 06:17:54 +0000
+++ src/provisioningserver/monkey.py 2015-06-15 09:18:42 +0000
@@ -13,6 +13,7 @@
1313
14__metaclass__ = type14__metaclass__ = type
15__all__ = [15__all__ = [
16 "add_term_error_code_to_tftp",
16 "force_simplestreams_to_use_urllib2",17 "force_simplestreams_to_use_urllib2",
17]18]
1819
@@ -38,3 +39,15 @@
38 URL_READER=simplestreams.contentsource.Urllib2UrlReader,39 URL_READER=simplestreams.contentsource.Urllib2UrlReader,
39 URL_READER_CLASSNAME="Urllib2UrlReader", urllib_error=urllib_error,40 URL_READER_CLASSNAME="Urllib2UrlReader", urllib_error=urllib_error,
40 urllib_request=urllib_request)41 urllib_request=urllib_request)
42
43
44def add_term_error_code_to_tftp():
45 """Add error code 8 to TFT server as introduced by RFC 2347.
46
47 Manually apply the fix to python-tx-tftp landed in
48 https://github.com/shylent/python-tx-tftp/pull/20
49 """
50 import tftp.datagram
51 if tftp.datagram.errors.get(8) is None:
52 tftp.datagram.errors[8] = (
53 "Terminate transfer due to option negotiation")
4154
=== modified file 'src/provisioningserver/plugin.py'
--- src/provisioningserver/plugin.py 2015-06-08 06:17:54 +0000
+++ src/provisioningserver/plugin.py 2015-06-15 09:18:42 +0000
@@ -21,7 +21,10 @@
21import socket21import socket
22from socket import error as socket_error22from socket import error as socket_error
2323
24from provisioningserver.monkey import force_simplestreams_to_use_urllib224from provisioningserver.monkey import (
25 add_term_error_code_to_tftp,
26 force_simplestreams_to_use_urllib2,
27)
25from provisioningserver.utils.debug import (28from provisioningserver.utils.debug import (
26 register_sigusr2_thread_dump_handler,29 register_sigusr2_thread_dump_handler,
27)30)
@@ -233,6 +236,7 @@
233 """Construct the MAAS Cluster service."""236 """Construct the MAAS Cluster service."""
234 register_sigusr2_thread_dump_handler()237 register_sigusr2_thread_dump_handler()
235 force_simplestreams_to_use_urllib2()238 force_simplestreams_to_use_urllib2()
239 add_term_error_code_to_tftp()
236240
237 from provisioningserver import services241 from provisioningserver import services
238 from provisioningserver.config import Config242 from provisioningserver.config import Config
239243
=== modified file 'src/provisioningserver/tests/test_monkey.py'
--- src/provisioningserver/tests/test_monkey.py 2015-06-08 06:17:54 +0000
+++ src/provisioningserver/tests/test_monkey.py 2015-06-15 09:18:42 +0000
@@ -20,8 +20,12 @@
2020
21from maastesting.testcase import MAASTestCase21from maastesting.testcase import MAASTestCase
22from mock import sentinel22from mock import sentinel
23from provisioningserver.monkey import force_simplestreams_to_use_urllib223from provisioningserver.monkey import (
24 add_term_error_code_to_tftp,
25 force_simplestreams_to_use_urllib2,
26)
24from simplestreams import contentsource27from simplestreams import contentsource
28import tftp.datagram
2529
2630
27if sys.version_info > (3, 0):31if sys.version_info > (3, 0):
@@ -62,3 +66,20 @@
62 force_simplestreams_to_use_urllib2()66 force_simplestreams_to_use_urllib2()
63 self.assertEqual(67 self.assertEqual(
64 self.value, getattr(contentsource, self.key))68 self.value, getattr(contentsource, self.key))
69
70
71class TestAddTermErrorCodeToTFT(MAASTestCase):
72
73 def test_adds_error_code_8(self):
74 self.patch(tftp.datagram, 'errors', {})
75 add_term_error_code_to_tftp()
76 self.assertIn(8, tftp.datagram.errors)
77 self.assertEqual(
78 "Terminate transfer due to option negotiation",
79 tftp.datagram.errors.get(8))
80
81 def test_skips_adding_error_code_if_already_present(self):
82 self.patch(tftp.datagram, 'errors', {8: sentinel.error_8})
83 add_term_error_code_to_tftp()
84 self.assertEqual(
85 sentinel.error_8, tftp.datagram.errors.get(8))
6586
=== modified file 'src/provisioningserver/tests/test_plugin.py'
--- src/provisioningserver/tests/test_plugin.py 2015-06-08 06:17:54 +0000
+++ src/provisioningserver/tests/test_plugin.py 2015-06-15 09:18:42 +0000
@@ -132,6 +132,15 @@
132 service_maker.makeService(options)132 service_maker.makeService(options)
133 self.assertThat(mock_simplestreams_patch, MockCalledOnceWith())133 self.assertThat(mock_simplestreams_patch, MockCalledOnceWith())
134134
135 def test_makeService_patches_tftp_service(self):
136 mock_tftp_patch = (
137 self.patch(plugin_module, 'add_term_error_code_to_tftp'))
138 options = Options()
139 options["config-file"] = self.write_config({})
140 service_maker = ProvisioningServiceMaker("Harry", "Hill")
141 service_maker.makeService(options)
142 self.assertThat(mock_tftp_patch, MockCalledOnceWith())
143
135 def test_image_download_service(self):144 def test_image_download_service(self):
136 options = Options()145 options = Options()
137 options["config-file"] = self.write_config({})146 options["config-file"] = self.write_config({})