Merge lp:~julian-edwards/maas/acl-for-dns-trigger-rewrite into lp:~maas-committers/maas/trunk

Proposed by Julian Edwards
Status: Merged
Approved by: Julian Edwards
Approved revision: no longer in the source branch.
Merged at revision: 2852
Proposed branch: lp:~julian-edwards/maas/acl-for-dns-trigger-rewrite
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 78 lines (+39/-0)
2 files modified
src/maasserver/dns/connect.py (+14/-0)
src/maasserver/tests/test_forms_network.py (+25/-0)
To merge this branch: bzr merge lp:~julian-edwards/maas/acl-for-dns-trigger-rewrite
Reviewer Review Type Date Requested Status
Jeroen T. Vermeulen (community) Approve
Review via email: mp+232834@code.launchpad.net

Commit message

Connect save and delete signals for Networks so that the DNS config is rewritten. This is so the networks ACL for DNS will get updated when networks change.

To post a comment you must log in.
Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

It looks to me as if test_writes_dns_when_network_edited should be called test_writes_dns_when_network_created. Why does it go through the form?

I still don't like signals for this kind of thing. Do we know what we'll be doing during network auto-discovery? Will we implicitly be firing off a bunch of DNS server restarts concurrently, which may then get confused and break? It would make more sense to me to set some kind of “dirty” flag on DNS, and process that separately.

Also, consider triggering the signal only on specific field changes. Updating the description on a network, or saving it without changes, or perhaps updating some future field that may see routine changes, probably needn't activate the whole DNS machinery.

review: Approve
Revision history for this message
Julian Edwards (julian-edwards) wrote :

Thanks for the review!

On Monday 01 Sep 2014 03:20:57 you wrote:
> Review: Approve
>
> It looks to me as if test_writes_dns_when_network_edited should be called
> test_writes_dns_when_network_created. Why does it go through the form?

1. It's not just creating, it's any editing (which includes creating).
2. Using the form just covers actual code use style. I didn't want to rely on
any factory side effects.

> I still don't like signals for this kind of thing. Do we know what we'll be
> doing during network auto-discovery? Will we implicitly be firing off a
> bunch of DNS server restarts concurrently, which may then get confused and
> break? It would make more sense to me to set some kind of “dirty” flag on
> DNS, and process that separately.

I hate signals too, but there's not much choice. I think we've covered this
to death already.

Given that this will condense into an RPC job at some point, the easiest (and
I'd argue *right) place to coalesce jobs is right there. For now I figured
the rate at which Networks are changed will be absolutely tiny.

> Also, consider triggering the signal only on specific field changes.
> Updating the description on a network, or saving it without changes, or
> perhaps updating some future field that may see routine changes, probably
> needn't activate the whole DNS machinery.

Again, the number of changes to Networks will be tiny, it's not worth it IMO,
especially as we add more fields that *will* require a trigger would
potentially get missed.

cheers.

Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

>> It looks to me as if test_writes_dns_when_network_edited should be called
>> test_writes_dns_when_network_created. Why does it go through the form?
>
> 1. It's not just creating, it's any editing (which includes creating).

That's my point. You're not testing that, but the name of the test makes it seem as if you do.

Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Monday 01 Sep 2014 03:45:08 you wrote:
> >> It looks to me as if test_writes_dns_when_network_edited should be called
> >> test_writes_dns_when_network_created. Why does it go through the form?
> >
> > 1. It's not just creating, it's any editing (which includes creating).
>
> That's my point. You're not testing that, but the name of the test makes it
> seem as if you do.

I that case I don't see your point. I thought the name was clear enough.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/dns/connect.py'
2--- src/maasserver/dns/connect.py 2014-08-15 09:44:42 +0000
3+++ src/maasserver/dns/connect.py 2014-09-01 01:38:17 +0000
4@@ -24,6 +24,7 @@
5 from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT
6 from maasserver.models import (
7 Config,
8+ Network,
9 Node,
10 NodeGroup,
11 NodeGroupInterface,
12@@ -103,6 +104,19 @@
13 write_full_dns_config()
14
15
16+@receiver(post_save, sender=Network)
17+def dns_post_save_Network(sender, instance, **kwargs):
18+ """When a network is added/changed, put it in the DNS trusted networks."""
19+ from maasserver.dns.config import write_full_dns_config
20+ write_full_dns_config()
21+
22+
23+@receiver(post_delete, sender=Network)
24+def dns_post_delete_Network(sender, instance, **kwargs):
25+ from maasserver.dns.config import write_full_dns_config
26+ write_full_dns_config()
27+
28+
29 Config.objects.config_changed_connect("upstream_dns", dns_setting_changed)
30 Config.objects.config_changed_connect(
31 "windows_kms_host", dns_setting_changed)
32
33=== modified file 'src/maasserver/tests/test_forms_network.py'
34--- src/maasserver/tests/test_forms_network.py 2014-08-19 15:17:01 +0000
35+++ src/maasserver/tests/test_forms_network.py 2014-09-01 01:38:17 +0000
36@@ -14,6 +14,7 @@
37 __metaclass__ = type
38 __all__ = []
39
40+from maasserver.dns import config as dns_config_module
41 from maasserver.forms import NetworkForm
42 from maasserver.models import (
43 MACAddress,
44@@ -22,6 +23,7 @@
45 from maasserver.testing.factory import factory
46 from maasserver.testing.orm import reload_object
47 from maasserver.testing.testcase import MAASServerTestCase
48+from maastesting.matchers import MockCalledOnceWith
49 from netaddr import IPNetwork
50
51
52@@ -140,3 +142,26 @@
53 'netmask': [message],
54 },
55 form.errors)
56+
57+ def test_writes_dns_when_network_edited(self):
58+ write_full_dns_config = self.patch(
59+ dns_config_module, "write_full_dns_config")
60+ network = factory.getRandomNetwork()
61+ name = factory.make_name('network')
62+ definition = {
63+ 'name': name,
64+ 'description': factory.make_string(),
65+ 'ip': "%s" % network.cidr.ip,
66+ 'netmask': "%s" % network.netmask,
67+ 'vlan_tag': factory.make_vlan_tag(),
68+ }
69+ form = NetworkForm(data=definition)
70+ form.save()
71+ self.assertThat(write_full_dns_config, MockCalledOnceWith())
72+
73+ def test_writes_dns_when_network_deleted(self):
74+ network = factory.make_network()
75+ write_full_dns_config = self.patch(
76+ dns_config_module, "write_full_dns_config")
77+ network.delete()
78+ self.assertThat(write_full_dns_config, MockCalledOnceWith())