Merge lp:~rvb/maas/no-dhcp-write-of-unvalid-config-1.5 into lp:maas/1.5

Proposed by Raphaël Badin
Status: Merged
Approved by: Raphaël Badin
Approved revision: no longer in the source branch.
Merged at revision: 2281
Proposed branch: lp:~rvb/maas/no-dhcp-write-of-unvalid-config-1.5
Merge into: lp:maas/1.5
Diff against target: 131 lines (+36/-17)
4 files modified
src/maasserver/dhcp.py (+10/-1)
src/maasserver/tests/test_dhcp.py (+13/-14)
src/provisioningserver/tasks.py (+9/-1)
src/provisioningserver/tests/test_tasks.py (+4/-1)
To merge this branch: bzr merge lp:~rvb/maas/no-dhcp-write-of-unvalid-config-1.5
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Approve
Review via email: mp+221675@code.launchpad.net

Commit message

Backport revision 2389: Return early and stop the DHCP server when the list of managed interfaces of the nodegroup is empty.

To post a comment you must log in.
Revision history for this message
Raphaël Badin (rvb) wrote :

Simple backport, self-approving.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/dhcp.py'
--- src/maasserver/dhcp.py 2014-02-24 09:30:57 +0000
+++ src/maasserver/dhcp.py 2014-06-02 08:00:52 +0000
@@ -22,6 +22,7 @@
22from netaddr import IPAddress22from netaddr import IPAddress
23from provisioningserver.tasks import (23from provisioningserver.tasks import (
24 restart_dhcp_server,24 restart_dhcp_server,
25 stop_dhcp_server,
25 write_dhcp_config,26 write_dhcp_config,
26 )27 )
2728
@@ -52,7 +53,15 @@
52 from maasserver.dns import get_dns_server_address53 from maasserver.dns import get_dns_server_address
5354
54 interfaces = get_interfaces_managed_by(nodegroup)55 interfaces = get_interfaces_managed_by(nodegroup)
55 if interfaces is None:56 if interfaces in [None, []]:
57 # interfaces being None means the cluster isn't accepted: stop
58 # the DHCP server in case it case started.
59 # interfaces being [] means there is no interface configured: stop
60 # the DHCP server; Note that a config generated with this setup
61 # would not be valid and would result in the DHCP
62 # server failing with the error: "Not configured to listen on any
63 # interfaces!."
64 stop_dhcp_server.apply_async(queue=nodegroup.work_queue)
56 return65 return
5766
58 # Make sure this nodegroup has a key to communicate with the dhcp67 # Make sure this nodegroup has a key to communicate with the dhcp
5968
=== modified file 'src/maasserver/tests/test_dhcp.py'
--- src/maasserver/tests/test_dhcp.py 2014-02-24 09:30:57 +0000
+++ src/maasserver/tests/test_dhcp.py 2014-06-02 08:00:52 +0000
@@ -33,7 +33,6 @@
33from maasserver.testing.testcase import MAASServerTestCase33from maasserver.testing.testcase import MAASServerTestCase
34from maasserver.utils import map_enum34from maasserver.utils import map_enum
35from maastesting.celery import CeleryFixture35from maastesting.celery import CeleryFixture
36from mock import ANY
37from netaddr import (36from netaddr import (
38 IPAddress,37 IPAddress,
39 IPNetwork,38 IPNetwork,
@@ -72,6 +71,16 @@
72 {status: None for status in unaccepted_statuses},71 {status: None for status in unaccepted_statuses},
73 managed_interfaces)72 managed_interfaces)
7473
74 def test_configure_dhcp_stops_server_if_no_managed_interface(self):
75 self.patch(settings, "DHCP_CONNECT", True)
76 self.patch(dhcp, 'stop_dhcp_server')
77 nodegroup = factory.make_node_group(
78 status=NODEGROUP_STATUS.ACCEPTED,
79 management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED,
80 )
81 configure_dhcp(nodegroup)
82 self.assertEqual(1, dhcp.stop_dhcp_server.apply_async.call_count)
83
75 def test_configure_dhcp_obeys_DHCP_CONNECT(self):84 def test_configure_dhcp_obeys_DHCP_CONNECT(self):
76 self.patch(settings, "DHCP_CONNECT", False)85 self.patch(settings, "DHCP_CONNECT", False)
77 self.patch(dhcp, 'write_dhcp_config')86 self.patch(dhcp, 'write_dhcp_config')
@@ -205,19 +214,6 @@
205 args, kwargs = task.subtask.call_args214 args, kwargs = task.subtask.call_args
206 self.assertEqual(nodegroup.work_queue, kwargs['options']['queue'])215 self.assertEqual(nodegroup.work_queue, kwargs['options']['queue'])
207216
208 def test_write_dhcp_config_called_when_no_managed_interfaces(self):
209 nodegroup = factory.make_node_group(
210 status=NODEGROUP_STATUS.ACCEPTED,
211 management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
212 [interface] = nodegroup.nodegroupinterface_set.all()
213 self.patch(settings, "DHCP_CONNECT", True)
214 self.patch(tasks, 'sudo_write_file')
215 self.patch(dhcp, 'write_dhcp_config')
216 interface.management = NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED
217 interface.save()
218 dhcp.write_dhcp_config.apply_async.assert_called_once_with(
219 queue=nodegroup.work_queue, kwargs=ANY)
220
221 def test_dhcp_config_gets_written_when_interface_IP_changes(self):217 def test_dhcp_config_gets_written_when_interface_IP_changes(self):
222 nodegroup = factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED)218 nodegroup = factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED)
223 [interface] = nodegroup.nodegroupinterface_set.all()219 [interface] = nodegroup.nodegroupinterface_set.all()
@@ -318,6 +314,9 @@
318 factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED)314 factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED)
319 for x in range(num_inactive_nodegroups):315 for x in range(num_inactive_nodegroups):
320 factory.make_node_group(status=NODEGROUP_STATUS.PENDING)316 factory.make_node_group(status=NODEGROUP_STATUS.PENDING)
317 # Silence stop_dhcp_server: it will be called for the inactive
318 # nodegroups.
319 self.patch(dhcp, 'stop_dhcp_server')
321320
322 self.patch(settings, "DHCP_CONNECT", True)321 self.patch(settings, "DHCP_CONNECT", True)
323 self.patch(dhcp, 'write_dhcp_config')322 self.patch(dhcp, 'write_dhcp_config')
324323
=== modified file 'src/provisioningserver/tasks.py'
--- src/provisioningserver/tasks.py 2014-05-21 17:30:26 +0000
+++ src/provisioningserver/tasks.py 2014-06-02 08:00:52 +0000
@@ -385,10 +385,18 @@
385 call_and_check(['sudo', '-n', 'service', 'maas-dhcp-server', 'restart'])385 call_and_check(['sudo', '-n', 'service', 'maas-dhcp-server', 'restart'])
386386
387387
388# Message to put in the DHCP config file when the DHCP server gets stopped.
389DISABLED_DHCP_SERVER = "# DHCP server stopped."
390
391
388@task392@task
389@log_exception_text393@log_exception_text
390def stop_dhcp_server():394def stop_dhcp_server():
391 """Stop a DHCP server."""395 """Write a blank config file and stop a DHCP server."""
396 # Write an empty config file to avoid having an outdated config laying
397 # around.
398 sudo_write_file(
399 celery_config.DHCP_CONFIG_FILE, DISABLED_DHCP_SERVER)
392 call_and_check(['sudo', '-n', 'service', 'maas-dhcp-server', 'stop'])400 call_and_check(['sudo', '-n', 'service', 'maas-dhcp-server', 'stop'])
393401
394402
395403
=== modified file 'src/provisioningserver/tests/test_tasks.py'
--- src/provisioningserver/tests/test_tasks.py 2014-05-06 21:18:17 +0000
+++ src/provisioningserver/tests/test_tasks.py 2014-06-02 08:00:52 +0000
@@ -330,11 +330,14 @@
330 self.assertThat(tasks.call_and_check, MockCalledOnceWith(330 self.assertThat(tasks.call_and_check, MockCalledOnceWith(
331 ['sudo', '-n', 'service', 'maas-dhcp-server', 'restart']))331 ['sudo', '-n', 'service', 'maas-dhcp-server', 'restart']))
332332
333 def test_stop_dhcp_server_sends_command(self):333 def test_stop_dhcp_server_sends_command_and_writes_empty_config(self):
334 self.patch(tasks, 'call_and_check')334 self.patch(tasks, 'call_and_check')
335 self.patch(tasks, 'sudo_write_file')
335 stop_dhcp_server()336 stop_dhcp_server()
336 self.assertThat(tasks.call_and_check, MockCalledOnceWith(337 self.assertThat(tasks.call_and_check, MockCalledOnceWith(
337 ['sudo', '-n', 'service', 'maas-dhcp-server', 'stop']))338 ['sudo', '-n', 'service', 'maas-dhcp-server', 'stop']))
339 self.assertThat(tasks.sudo_write_file, MockCalledOnceWith(
340 celery_config.DHCP_CONFIG_FILE, tasks.DISABLED_DHCP_SERVER))
338341
339342
340def assertTaskRetried(runner, result, nb_retries, task_name):343def assertTaskRetried(runner, result, nb_retries, task_name):

Subscribers

People subscribed via source and target branches

to all changes: