)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ddde633eb6540f0437ad69c7aa4a70ce9da2665","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  moved into _update_port_with_ips in ipam_non_pluggable_backend;"},{"line_number":13,"context_line":"- writing port changes to db is common for both backends, so"},{"line_number":14,"context_line":"  moved into _update_db_port in ipam_backend_mixin;"},{"line_number":15,"context_line":"- added _make_fixed_ip_dict with determinated keys;"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially-Implements: blueprint neutron-ipam"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_e001ed3a","line":15,"updated":"2015-06-11 21:10:39.000000000","message":"I\u0027m not really following this step.","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"621b32d7494f52b0b280d1da88aec879fc650c04","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  moved into _update_port_with_ips in ipam_non_pluggable_backend;"},{"line_number":13,"context_line":"- writing port changes to db is common for both backends, so"},{"line_number":14,"context_line":"  moved into _update_db_port in ipam_backend_mixin;"},{"line_number":15,"context_line":"- added _make_fixed_ip_dict with determinated keys;"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially-Implements: blueprint neutron-ipam"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1af86dd1_768dba30","line":15,"in_reply_to":"3afb71cf_e001ed3a","updated":"2015-06-12 17:23:13.000000000","message":"Done","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ddde633eb6540f0437ad69c7aa4a70ce9da2665","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                             new_port, new_mac)"},{"line_number":1167,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_c3517610","line":1169,"updated":"2015-06-11 21:10:39.000000000","message":"I followed everything down to this point.  Somehow, the following code turned in to L1169 - 1172 here.  I\u0027m not exactly sure why.  The commit message was a little less than helpful.\n\n        if ips[\u0027original\u0027] or ips[\u0027remove\u0027]:\n            result[\u0027fixed_ips\u0027] \u003d ips[\u0027original\u0027] + ips[\u0027add\u0027]\n\nIn unified diff format:\n\ndiff --git b/neutron/db/db_base_plugin_v2.py a/neutron/db/db_base_plugin_v2.py\n--- b/neutron/db/db_base_plugin_v2.py\n+++ a/neutron/db/db_base_plugin_v2.py\n@@ -1166,8 +1166,10 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNo\n                                              new_port, new_mac)\n         result \u003d self._make_port_dict(port)\n         # Keep up with fields that changed\n-        if ips[\u0027original\u0027] or ips[\u0027remove\u0027]:\n-            result[\u0027fixed_ips\u0027] \u003d ips[\u0027original\u0027] + ips[\u0027add\u0027]\n+        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:\n+            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict(\n+                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if\n+                ip not in ips[\u0027remove\u0027])\n         return result\n \n     def delete_port(self, context, id):","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"cc90f8ea0b3f30d45715647d86937591f149e9b9","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                             new_port, new_mac)"},{"line_number":1167,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_323cf792","line":1169,"in_reply_to":"1af86dd1_1709ed2c","updated":"2015-06-12 13:54:34.000000000","message":"Thanks for the catch. \nThis one seems to be leftover from early debug patch versions,\nso pretty sure it is not needed now.\nWill update it to be just:\n\nresult[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict(ips[\u0027original\u0027] + ips[\u0027add\u0027])","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"f74417530a42c8f8224d1c5291e9ea7dc71cc3db","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                             new_port, new_mac)"},{"line_number":1167,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_1709ed2c","line":1169,"in_reply_to":"1af86dd1_21e70be6","updated":"2015-06-12 13:14:42.000000000","message":"Ugh nevermind. For some reason I thought I traced that down and they were different - but I see that \"changes\" and \"ips\" are both just there return value from _update_ips_for_port. So, I don\u0027t quite get the reason for the change here either.","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"621b32d7494f52b0b280d1da88aec879fc650c04","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                             new_port, new_mac)"},{"line_number":1167,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_5682be01","line":1169,"in_reply_to":"1af86dd1_323cf792","updated":"2015-06-12 17:23:13.000000000","message":"Done","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"d90bf71fea812021d70f4b4cec0b599c67b91c4b","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                             new_port, new_mac)"},{"line_number":1167,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_21e70be6","line":1169,"in_reply_to":"1af86dd1_c3517610","updated":"2015-06-12 12:48:15.000000000","message":"No, the original is dealing with the \"changes\" dict whereas the new one is dealing with the \"ips\" dict. So, the contents of them are different and thus the different calculation.\n\nThe calculation is pretty dense though, and agreed it is another set operation done as if statements.","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ddde633eb6540f0437ad69c7aa4a70ce9da2665","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_5fed45ee","line":1171,"updated":"2015-06-11 21:10:39.000000000","message":"nit:  you could use itertools.chain here if you want.  But, I doubt very much that this will be performance sensitive in any way.  So, use the one that is most intuitive to you and easiest.\n\nnit2: Put newline before \"if\" at the end.  It seems more intuitive to me for the if to go on the next line before the conditional.  But, this is a style matter I don\u0027t feel strongly about.","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"621b32d7494f52b0b280d1da88aec879fc650c04","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_36874211","line":1171,"in_reply_to":"1af86dd1_d2e7e310","updated":"2015-06-12 17:23:13.000000000","message":"Done","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"cc90f8ea0b3f30d45715647d86937591f149e9b9","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"        # Keep up with fields that changed"},{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_d2e7e310","line":1171,"in_reply_to":"3afb71cf_5fed45ee","updated":"2015-06-12 13:54:34.000000000","message":"this part to be removed","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ddde633eb6540f0437ad69c7aa4a70ce9da2665","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    def delete_port(self, context, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_8a47fd1c","line":1172,"updated":"2015-06-11 21:10:39.000000000","message":"Say these two lines 5 times fast.\n\nSeriously, though.  This looks like a set operation.","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"621b32d7494f52b0b280d1da88aec879fc650c04","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    def delete_port(self, context, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_167d661c","line":1172,"in_reply_to":"1af86dd1_f2b89fe7","updated":"2015-06-12 17:23:13.000000000","message":"Done","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"cc90f8ea0b3f30d45715647d86937591f149e9b9","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        if ips[\u0027original\u0027] or ips[\u0027add\u0027] or ips[\u0027remove\u0027]:"},{"line_number":1170,"context_line":"            result[\u0027fixed_ips\u0027] \u003d self._make_fixed_ip_dict("},{"line_number":1171,"context_line":"                ip for ip in (ips[\u0027original\u0027] + ips[\u0027add\u0027]) if"},{"line_number":1172,"context_line":"                ip not in ips[\u0027remove\u0027])"},{"line_number":1173,"context_line":"        return result"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    def delete_port(self, context, id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_f2b89fe7","line":1172,"in_reply_to":"3afb71cf_8a47fd1c","updated":"2015-06-12 13:54:34.000000000","message":"this part to be removed","commit_id":"f7ae1bdbf9c5d17962709c497cce3525b293bb2a"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"31cb87e5dc24a0d2849768890b47a805dbde52b9","unresolved":false,"context_lines":[{"line_number":1159,"context_line":"        new_port \u003d port[\u0027port\u0027]"},{"line_number":1160,"context_line":""},{"line_number":1161,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":1162,"context_line":"            port \u003d self._get_port(context, id)"},{"line_number":1163,"context_line":"            new_mac \u003d new_port.get(\u0027mac_address\u0027)"},{"line_number":1164,"context_line":"            self._validate_port_for_update(context, port, new_port, new_mac)"},{"line_number":1165,"context_line":"            changes \u003d self._update_port_with_ips(context, port,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_9fdacc77","line":1162,"updated":"2015-06-13 08:49:13.000000000","message":"nit: I prefer db_port over port. Considering _validate_port_for_update and _update_port_with_ips, that\u0027s easier to understand for me.","commit_id":"d9cc0e47aa067013342fde26d38a94bfe288c2a3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e460896a84cbb23d8b92c8507b4f0a8af82830ba","unresolved":false,"context_lines":[{"line_number":1159,"context_line":"        new_port \u003d port[\u0027port\u0027]"},{"line_number":1160,"context_line":""},{"line_number":1161,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":1162,"context_line":"            port \u003d self._get_port(context, id)"},{"line_number":1163,"context_line":"            new_mac \u003d new_port.get(\u0027mac_address\u0027)"},{"line_number":1164,"context_line":"            self._validate_port_for_update(context, port, new_port, new_mac)"},{"line_number":1165,"context_line":"            changes \u003d self._update_port_with_ips(context, port,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_0c2d06a7","line":1162,"in_reply_to":"fa32b979_9fdacc77","updated":"2015-06-15 16:58:37.000000000","message":"Changing the name here is a bit out of the scope of this patch and would make it more difficult to review.  I prefer db_port too but we need to consider the scope of this patch set and put up a change that is reviewable.","commit_id":"d9cc0e47aa067013342fde26d38a94bfe288c2a3"}],"neutron/db/ipam_backend_mixin.py":[{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"31cb87e5dc24a0d2849768890b47a805dbde52b9","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                    ip_address\u003dgateway_ip)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    # define namedtuple here to share with backends"},{"line_number":177,"context_line":"    Changes \u003d collections.namedtuple(\u0027Changes\u0027, \u0027add original remove\u0027)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _get_changed_ips_for_port(self, context, original_ips,"},{"line_number":180,"context_line":"                                  new_ips, device_owner):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_3f906095","line":177,"updated":"2015-06-13 08:49:13.000000000","message":"I feel odd that the line is here(between def and def). Should it be moved to L.36 in order not to confuse developer?","commit_id":"d9cc0e47aa067013342fde26d38a94bfe288c2a3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e460896a84cbb23d8b92c8507b4f0a8af82830ba","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                    ip_address\u003dgateway_ip)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    # define namedtuple here to share with backends"},{"line_number":177,"context_line":"    Changes \u003d collections.namedtuple(\u0027Changes\u0027, \u0027add original remove\u0027)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _get_changed_ips_for_port(self, context, original_ips,"},{"line_number":180,"context_line":"                                  new_ips, device_owner):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_2797c391","line":177,"in_reply_to":"fa32b979_3f906095","updated":"2015-06-15 16:58:37.000000000","message":"I\u0027ll agree it isn\u0027t what you usually see.  I\u0027m not sure it needs to change though.  Actually, the point is moot.  This part of the change will go away when rebased.","commit_id":"d9cc0e47aa067013342fde26d38a94bfe288c2a3"}]}
