Where this gets really problematic in the case of PciDevice is that the older compute node preserves 'parent_addr' as a changed field and includes it as such the next time it calls device.save(). On the nova-conductor side in PciDevice.save() we then call updates = self.obj_get_changes(), which does this:
for key in self.obj_what_changed(): changes[key] = getattr(self, key)
but in this code 'parent_addr' is listed in self.obj_what_changed(), but the attribute isn't actually set. This results in the following exception:
NotImplementedError: Cannot load 'parent_addr' in the base class
Where this gets really problematic in the case of PciDevice is that the older compute node preserves 'parent_addr' as a changed field and includes it as such the next time it calls device.save(). On the nova-conductor side in PciDevice.save() we then call updates = self.obj_ get_changes( ), which does this:
for key in self.obj_ what_changed( ):
changes[ key] = getattr(self, key)
but in this code 'parent_addr' is listed in self.obj_ what_changed( ), but the attribute isn't actually set. This results in the following exception:
NotImplementedE rror: Cannot load 'parent_addr' in the base class