[Maas-devel] Signals for DHCP changes still broken

Raphaël Badin raphael.badin at canonical.com
Mon Feb 10 08:35:36 UTC 2014


On 02/09/2014 11:49 PM, Julian Edwards wrote:
> On Friday 07 Feb 2014 11:20:21 Raphaël Badin wrote:
>>> So far I've done my testing on canonistack; the test I'm planning to do
>>> today, with my microservers, will use a setup similar to yours.  I'll
>>> report back when I'm done.
>>
>> I managed to recreate the problem and I've identified the root cause: I
>> think there is a bug in src/maasserver/signals.py
>>
>> :connect_to_field_change.post_save_callback.  Trying to recreate the
>>
>> problem in a test case now.
>
> \o/  Excellent, thanks.

Let me explain what the core problem is:

connect_to_field_change (from src/maasserver/signals.py) is a small 
utility which uses Django's signal infrastructure to register a callback 
that should be fired when any field in a set of fields is modified on an 
particular object type.  We use this utility to limit the number of 
fields on nodegroupinterface objects whose change should cause the DHCP 
configuration to be rewritten — we basically want to consider all the 
fields but 'foreign_dhcp_ip'.

The bug stems from GenericIPAddressField's default cleanup method 
clashing with the default value we use for the GenericIPAddressField 
fields on nodegroupinterface:  the default value, as far as 
GenericIPAddressField is concerned, is the empty string and thus 
"cleaning" (in the Django sense) the value None gives the empty string. 
  That clashes with us using None as the default value for all the 
GenericIPAddressField fields on nodegroupinterface:  if a 
nodegroupinterface comes out of the database with its field 
'ip_range_low' empty, it's value is None because we have configured it 
this way on the nodegroupinterface model.  If this object goes through 
an edit cycle, right before being stored into the database, the value of 
the 'ip_range_low' field is the empty string because it's been converted 
by the field's "clean()" method.  This empty string will then be 
correctly converted back into None before being written to the DB but 
the problem is that, as the time the signal created by 
connect_to_field_change() was called, the value was still the empty 
string and was thus connect_to_field_change() interpreted that as change 
worth a DHCP/DNS rewrite.

The proper fix would be to change the default value of the 
GenericIPAddressField fields of the nodegroupinterface model to the 
empty string instead of None.

I haven't tested it but creating a subclass of GenericIPAddressField 
with a changed clean() method might work although it's a bit of a hack.

Now, we decided to actually fix two bugs with one change and create a 
dedicated API call to update the 'foreign_dhcp_ip' 
(https://code.launchpad.net/~jtv/maas/report-foreign-dhcp/+merge/205430). 
This will fix both the manifestation of this bug and bug 1276985.

We might still want to fix this bug properly but this is less urgent now 
that the branch above has landed.

Cheers,

R.





More information about the Maas-devel mailing list