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
=== modified file 'src/maasserver/dns/connect.py'
--- src/maasserver/dns/connect.py 2014-08-15 09:44:42 +0000
+++ src/maasserver/dns/connect.py 2014-09-01 01:38:17 +0000
@@ -24,6 +24,7 @@
24from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT24from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT
25from maasserver.models import (25from maasserver.models import (
26 Config,26 Config,
27 Network,
27 Node,28 Node,
28 NodeGroup,29 NodeGroup,
29 NodeGroupInterface,30 NodeGroupInterface,
@@ -103,6 +104,19 @@
103 write_full_dns_config()104 write_full_dns_config()
104105
105106
107@receiver(post_save, sender=Network)
108def dns_post_save_Network(sender, instance, **kwargs):
109 """When a network is added/changed, put it in the DNS trusted networks."""
110 from maasserver.dns.config import write_full_dns_config
111 write_full_dns_config()
112
113
114@receiver(post_delete, sender=Network)
115def dns_post_delete_Network(sender, instance, **kwargs):
116 from maasserver.dns.config import write_full_dns_config
117 write_full_dns_config()
118
119
106Config.objects.config_changed_connect("upstream_dns", dns_setting_changed)120Config.objects.config_changed_connect("upstream_dns", dns_setting_changed)
107Config.objects.config_changed_connect(121Config.objects.config_changed_connect(
108 "windows_kms_host", dns_setting_changed)122 "windows_kms_host", dns_setting_changed)
109123
=== modified file 'src/maasserver/tests/test_forms_network.py'
--- src/maasserver/tests/test_forms_network.py 2014-08-19 15:17:01 +0000
+++ src/maasserver/tests/test_forms_network.py 2014-09-01 01:38:17 +0000
@@ -14,6 +14,7 @@
14__metaclass__ = type14__metaclass__ = type
15__all__ = []15__all__ = []
1616
17from maasserver.dns import config as dns_config_module
17from maasserver.forms import NetworkForm18from maasserver.forms import NetworkForm
18from maasserver.models import (19from maasserver.models import (
19 MACAddress,20 MACAddress,
@@ -22,6 +23,7 @@
22from maasserver.testing.factory import factory23from maasserver.testing.factory import factory
23from maasserver.testing.orm import reload_object24from maasserver.testing.orm import reload_object
24from maasserver.testing.testcase import MAASServerTestCase25from maasserver.testing.testcase import MAASServerTestCase
26from maastesting.matchers import MockCalledOnceWith
25from netaddr import IPNetwork27from netaddr import IPNetwork
2628
2729
@@ -140,3 +142,26 @@
140 'netmask': [message],142 'netmask': [message],
141 },143 },
142 form.errors)144 form.errors)
145
146 def test_writes_dns_when_network_edited(self):
147 write_full_dns_config = self.patch(
148 dns_config_module, "write_full_dns_config")
149 network = factory.getRandomNetwork()
150 name = factory.make_name('network')
151 definition = {
152 'name': name,
153 'description': factory.make_string(),
154 'ip': "%s" % network.cidr.ip,
155 'netmask': "%s" % network.netmask,
156 'vlan_tag': factory.make_vlan_tag(),
157 }
158 form = NetworkForm(data=definition)
159 form.save()
160 self.assertThat(write_full_dns_config, MockCalledOnceWith())
161
162 def test_writes_dns_when_network_deleted(self):
163 network = factory.make_network()
164 write_full_dns_config = self.patch(
165 dns_config_module, "write_full_dns_config")
166 network.delete()
167 self.assertThat(write_full_dns_config, MockCalledOnceWith())