)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5572,"name":"Don Kehn","display_name":"DEKehn","email":"dekehn@gmail.com","username":"dekehn"},"change_message_id":"764a4769f9c4758fa1851e016d3e5612cb2656dc","unresolved":false,"context_lines":[{"line_number":11,"context_line":"and implement support for operational status in the L3 agent."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"NOTE: Still WIP as it lacks unit tests and strategy for plugin not"},{"line_number":14,"context_line":"supporting operational status. But at least this patch works!"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Implements blueprint fip-op-status"},{"line_number":17,"context_line":"Change-Id: Ib0176fbcde95b0db5dfdabd4fc297d1d29c0d604"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAUH%2F%2Bmnk%3D","line":14,"updated":"2014-01-23 23:22:10.000000000","message":"Should you not set the status as WIP?","commit_id":"7d96ba8412bbf84d72811a651b23fec3fe9cdb0f"}],"neutron/agent/l3_agent.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b21e6c8e2edaa0c0b23c663d209996d76c7cda2","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # Update floating IP status on the neutron server"},{"line_number":445,"context_line":"        if ex_gw_port:"},{"line_number":446,"context_line":"            self.plugin_rpc.update_fip_statuses("},{"line_number":447,"context_line":"                self.context, ri.router_id, fip_statuses)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def _handle_router_snat_rules(self, ri, ex_gw_port, internal_cidrs,"},{"line_number":450,"context_line":"                                  interface_name, action):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQUM%3D","line":447,"updated":"2014-01-15 20:59:02.000000000","message":"Probably would be a good idea to only send this RPC call if the dict of statuses has changed from its original state on line 433.","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c2630ef79f60be21dc165f7a1a1dfe0f6efcc82e","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # Update floating IP status on the neutron server"},{"line_number":445,"context_line":"        if ex_gw_port:"},{"line_number":446,"context_line":"            self.plugin_rpc.update_fip_statuses("},{"line_number":447,"context_line":"                self.context, ri.router_id, fip_statuses)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def _handle_router_snat_rules(self, ri, ex_gw_port, internal_cidrs,"},{"line_number":450,"context_line":"                                  interface_name, action):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQDY%3D","line":447,"in_reply_to":"AAAAUH%2F%2FQUM%3D","updated":"2014-01-15 21:56:22.000000000","message":"makes sense","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"cb1412c1d1f84f7db38e05af464f8e0e3d932a3f","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        if ex_gw_port:"},{"line_number":461,"context_line":"            # Identify floating IPs which were disabled"},{"line_number":462,"context_line":"            ri.floating_ips \u003d set(fip_statuses.keys())"},{"line_number":463,"context_line":"            for fip_id in existing_floating_ips - ri.floating_ips:"},{"line_number":464,"context_line":"                fip_statuses[fip_id] \u003d l3_constants.FLOATINGIP_STATUS_DOWN"},{"line_number":465,"context_line":"            # Update floating IP status on the neutron server"},{"line_number":466,"context_line":"            self.plugin_rpc.update_floatingip_statuses("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fl7A%3D","line":463,"updated":"2014-02-12 06:02:51.000000000","message":"When will existing_floating_ips be different floating_ips here so floating ip will be set to \"DOWN\"? Can you add a test case for this situation?","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":533,"context_line":""},{"line_number":534,"context_line":"            if ip_cidr not in existing_cidrs:"},{"line_number":535,"context_line":"                try:"},{"line_number":536,"context_line":"                    net \u003d netaddr.IPNetwork(ip_cidr)"},{"line_number":537,"context_line":"                    device.addr.add(net.version, ip_cidr, str(net.broadcast))"},{"line_number":538,"context_line":"                except (processutils.UnknownArgumentError,"},{"line_number":539,"context_line":"                        processutils.ProcessExecutionError):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FdAs%3D","line":536,"updated":"2014-02-13 04:12:34.000000000","message":"nit: could be moved out of try except block","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":533,"context_line":""},{"line_number":534,"context_line":"            if ip_cidr not in existing_cidrs:"},{"line_number":535,"context_line":"                try:"},{"line_number":536,"context_line":"                    net \u003d netaddr.IPNetwork(ip_cidr)"},{"line_number":537,"context_line":"                    device.addr.add(net.version, ip_cidr, str(net.broadcast))"},{"line_number":538,"context_line":"                except (processutils.UnknownArgumentError,"},{"line_number":539,"context_line":"                        processutils.ProcessExecutionError):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZXM%3D","line":536,"in_reply_to":"AAAAUX%2F%2FdAs%3D","updated":"2014-02-13 14:19:51.000000000","message":"meh will do","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                    fip_statuses[fip[\u0027id\u0027]] \u003d ("},{"line_number":543,"context_line":"                        l3_constants.FLOATINGIP_STATUS_ERROR)"},{"line_number":544,"context_line":"                    LOG.warn(_(\"Unable to configure IP address for \""},{"line_number":545,"context_line":"                               \"floating IP:%s\"), fip[\u0027id\u0027])"},{"line_number":546,"context_line":"                    continue"},{"line_number":547,"context_line":"                # As GARP sending is processed asynchronously it will"},{"line_number":548,"context_line":"                # hardly raise an exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FdAk%3D","line":545,"updated":"2014-02-13 04:12:34.000000000","message":"nit : \u003cspace\u003e","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                    fip_statuses[fip[\u0027id\u0027]] \u003d ("},{"line_number":543,"context_line":"                        l3_constants.FLOATINGIP_STATUS_ERROR)"},{"line_number":544,"context_line":"                    LOG.warn(_(\"Unable to configure IP address for \""},{"line_number":545,"context_line":"                               \"floating IP:%s\"), fip[\u0027id\u0027])"},{"line_number":546,"context_line":"                    continue"},{"line_number":547,"context_line":"                # As GARP sending is processed asynchronously it will"},{"line_number":548,"context_line":"                # hardly raise an exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZXE%3D","line":545,"in_reply_to":"AAAAUX%2F%2FdAk%3D","updated":"2014-02-13 14:19:51.000000000","message":"I thought I was the pedant one","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":545,"context_line":"                               \"floating IP:%s\"), fip[\u0027id\u0027])"},{"line_number":546,"context_line":"                    continue"},{"line_number":547,"context_line":"                # As GARP sending is processed asynchronously it will"},{"line_number":548,"context_line":"                # hardly raise an exception"},{"line_number":549,"context_line":"                self._send_gratuitous_arp_packet("},{"line_number":550,"context_line":"                    ri, interface_name, fip_ip)"},{"line_number":551,"context_line":"            fip_statuses[fip[\u0027id\u0027]] \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FdAQ%3D","line":548,"updated":"2014-02-13 04:12:34.000000000","message":"I\u0027m not sure what this comment means?","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":545,"context_line":"                               \"floating IP:%s\"), fip[\u0027id\u0027])"},{"line_number":546,"context_line":"                    continue"},{"line_number":547,"context_line":"                # As GARP sending is processed asynchronously it will"},{"line_number":548,"context_line":"                # hardly raise an exception"},{"line_number":549,"context_line":"                self._send_gratuitous_arp_packet("},{"line_number":550,"context_line":"                    ri, interface_name, fip_ip)"},{"line_number":551,"context_line":"            fip_statuses[fip[\u0027id\u0027]] \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZWg%3D","line":548,"in_reply_to":"AAAAUX%2F%2FdAQ%3D","updated":"2014-02-13 14:19:51.000000000","message":"It means that there is no reason for wrapping this call into an exception handler.\nI will clarify.","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1bc1e241b186ed65999875b8494165b1a4baaf89","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FhLM%3D","line":101,"updated":"2014-02-26 06:42:40.000000000","message":"version should be a string (according to the comment in openstack/common/rpc/dispatcher.py)\n\nDon\u0027t we need to increment the supported RPC version of the dispatcher (\u003d plugin) side to support this version of RPC.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ee02ccda88902a3377d5153dc39604e9fe803500","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2F42Y%3D","line":101,"in_reply_to":"AAAAU3%2F%2FdDg%3D","updated":"2014-02-27 15:51:06.000000000","message":"I checked \"version\" needs to be a string. I got the following error. http://paste.openstack.org/show/70264/\n\nAfter fixing it, then I got the following error.\nhttp://paste.openstack.org/show/70266/\nWe need to increment the supported RPC version of L3 plugin.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"da5d87462dcdbd7cf054f9a3b990fa81ecf492a1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FdDg%3D","line":101,"in_reply_to":"AAAAU3%2F%2Fe6E%3D","updated":"2014-02-26 14:56:28.000000000","message":"Yeah I agree. I am also confused by the fact that the callback class for the l3 router plugin does not actually have the callbacks, which are instead in a mixin!","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7b19099137e1b22a34445dbbdd8d077dafe00e28","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2Fe6E%3D","line":101,"in_reply_to":"AAAAU3%2F%2FfM4%3D","updated":"2014-02-26 11:15:19.000000000","message":"I will check it again too. we don\u0027t taking care of RPC versioning much so far :-(\n\nApart from L3 router plugin, most core plugins have a big callback class using multiple mixin classes, so it makes difficult for us control and know the exact RPC versions. It needs to be improved in Juno. I would like to do it.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d6032e3e13cabd257aae5fecc316e4f97f00927","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FfM4%3D","line":101,"in_reply_to":"AAAAU3%2F%2FhLM%3D","updated":"2014-02-26 10:39:21.000000000","message":"I don\u0027t know.\nRPC versioning and my brain are in serious conflict.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"1058e82dfbe540e5f3ebcac2f978277b9c7f3f2e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                       router_id\u003drouter_id,"},{"line_number":99,"context_line":"                                       fip_statuses\u003dfip_statuses),"},{"line_number":100,"context_line":"                         topic\u003dself.topic,"},{"line_number":101,"context_line":"                         version\u003d1.1)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class RouterInfo(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2Fpyk%3D","line":101,"in_reply_to":"AAAAVX%2F%2F42Y%3D","updated":"2014-03-01 22:29:05.000000000","message":"thanks I\u0027ll do that then!","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"}],"neutron/common/constants.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(salv-orlando): Verify if a single set of operational"},{"line_number":17,"context_line":"# status constants is achievable"},{"line_number":18,"context_line":"NET_STATUS_ACTIVE \u003d \u0027ACTIVE\u0027"},{"line_number":19,"context_line":"NET_STATUS_BUILD \u003d \u0027BUILD\u0027"},{"line_number":20,"context_line":"NET_STATUS_DOWN \u003d \u0027DOWN\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fc%2F4%3D","line":17,"updated":"2014-02-13 04:12:34.000000000","message":"+1 \n\nACTIVE\u003d \"ACTIVE\"\n\nDOWN\u003d\"DOWN\"  :)","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(salv-orlando): Verify if a single set of operational"},{"line_number":17,"context_line":"# status constants is achievable"},{"line_number":18,"context_line":"NET_STATUS_ACTIVE \u003d \u0027ACTIVE\u0027"},{"line_number":19,"context_line":"NET_STATUS_BUILD \u003d \u0027BUILD\u0027"},{"line_number":20,"context_line":"NET_STATUS_DOWN \u003d \u0027DOWN\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZWY%3D","line":17,"in_reply_to":"AAAAUX%2F%2Fc%2F4%3D","updated":"2014-02-13 14:19:51.000000000","message":"Yeah at some point I\u0027ll do some cleanup here","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"}],"neutron/db/l3_db.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"edd52b4abac377261e2694104030ac874e5186c4","unresolved":false,"context_lines":[{"line_number":455,"context_line":"               \u0027floating_ip_address\u0027: floatingip[\u0027floating_ip_address\u0027],"},{"line_number":456,"context_line":"               \u0027floating_network_id\u0027: floatingip[\u0027floating_network_id\u0027],"},{"line_number":457,"context_line":"               \u0027router_id\u0027: floatingip[\u0027router_id\u0027],"},{"line_number":458,"context_line":"               \u0027port_id\u0027: floatingip[\u0027fixed_port_id\u0027],"},{"line_number":459,"context_line":"               \u0027fixed_ip_address\u0027: floatingip[\u0027fixed_ip_address\u0027]}"},{"line_number":460,"context_line":"        return self._fields(res, fields)"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FBMg%3D","line":458,"updated":"2014-01-18 21:36:50.000000000","message":"add status here?","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b21e6c8e2edaa0c0b23c663d209996d76c7cda2","unresolved":false,"context_lines":[{"line_number":675,"context_line":"        \"\"\"Update operational status for floating IP in neutron DB.\"\"\""},{"line_number":676,"context_line":"        # TODO(salv-orlando): Optimize avoiding fetch before update"},{"line_number":677,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":678,"context_line":"            floatingip_db \u003d self._get_floatingip(context, floatingip_id)"},{"line_number":679,"context_line":"            floatingip_db[\u0027status\u0027] \u003d status"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"    def delete_floatingip(self, context, id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQSc%3D","line":678,"updated":"2014-01-15 20:59:02.000000000","message":"If you\u0027re going to update the floating IP record, this call should really do a SELECT ... FOR UPDATE. Otherwise, you run the risk of another thread deleting or modifying the floating IP record between the time you select it and the COMMIT from the session exit happens.","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c2630ef79f60be21dc165f7a1a1dfe0f6efcc82e","unresolved":false,"context_lines":[{"line_number":675,"context_line":"        \"\"\"Update operational status for floating IP in neutron DB.\"\"\""},{"line_number":676,"context_line":"        # TODO(salv-orlando): Optimize avoiding fetch before update"},{"line_number":677,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":678,"context_line":"            floatingip_db \u003d self._get_floatingip(context, floatingip_id)"},{"line_number":679,"context_line":"            floatingip_db[\u0027status\u0027] \u003d status"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"    def delete_floatingip(self, context, id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQCw%3D","line":678,"in_reply_to":"AAAAUH%2F%2FQSc%3D","updated":"2014-01-15 21:56:22.000000000","message":"That is the reason for which the two operations where wrapped in a transaction - isolation properties should ensure that this does not happen.\n\nHowever, in my opinion the get/update workflow is flawed in the first place as this kind of operation really calls for only an update query. If the record has been deleted in the meanwhile then the query will just have no effect.\n\nAs concerns concurrent modifications there might be concurrency concerns regarding whether they\u0027re applied in the correct order, but this is probably something that should not be taken care of in this method (and also - they\u0027re only updated from one source at the moment, so the issue does not exist (yet))\n\nSummarizing, I will just exec an update stmt rather","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"cb8a4ac11001d034a9b8ae220cd1cc357ebbe9a5","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    router_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027routers.id\u0027))"},{"line_number":76,"context_line":"    # Additional attribute for keeping track of the router where the floating"},{"line_number":77,"context_line":"    # ip was associated in order to be able to ensure consistency even if an"},{"line_number":78,"context_line":"    # aysnchronous backend is unavailable when the floating IP is disassociated"},{"line_number":79,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":80,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2Bljk%3D","line":78,"updated":"2014-01-24 04:53:10.000000000","message":"typo: aysnchronous","commit_id":"7d96ba8412bbf84d72811a651b23fec3fe9cdb0f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"cb8a4ac11001d034a9b8ae220cd1cc357ebbe9a5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    # Additional attribute for keeping track of the router where the floating"},{"line_number":77,"context_line":"    # ip was associated in order to be able to ensure consistency even if an"},{"line_number":78,"context_line":"    # aysnchronous backend is unavailable when the floating IP is disassociated"},{"line_number":79,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":80,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BljE%3D","line":79,"updated":"2014-01-24 04:53:10.000000000","message":"Per comment it seems that it\u0027s introducing this field is somewhat specific to backend implementation. \n\nE.g. it is only necessary when backend has it\u0027s persistent state that is not synced with neutron\u0027s db with polling.\n\nTo me it seems a little strange since other resources doesn\u0027t contain attributes that help to maintain such consistency.","commit_id":"7d96ba8412bbf84d72811a651b23fec3fe9cdb0f"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    def create_floatingip("},{"line_number":609,"context_line":"        self, context, floatingip,"},{"line_number":610,"context_line":"        initial_status\u003dl3_constants.FLOATINGIP_STATUS_ACTIVE):"},{"line_number":611,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":612,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, fip)"},{"line_number":613,"context_line":"        fip_id \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fc%2Fw%3D","line":610,"updated":"2014-02-13 04:12:34.000000000","message":"Should the initial status here be ACTIVE?","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    def create_floatingip("},{"line_number":609,"context_line":"        self, context, floatingip,"},{"line_number":610,"context_line":"        initial_status\u003dl3_constants.FLOATINGIP_STATUS_ACTIVE):"},{"line_number":611,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":612,"context_line":"        tenant_id \u003d self._get_tenant_id_for_create(context, fip)"},{"line_number":613,"context_line":"        fip_id \u003d uuidutils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZV8%3D","line":610,"in_reply_to":"AAAAUX%2F%2Fc%2Fw%3D","updated":"2014-02-13 14:19:51.000000000","message":"This is a default solution for all the plugins which do not support operational status updates.\nthey will default to ACTIVE.\n\nThe \u0027base\u0027 l3 router plugin inits the state to DOWN","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"}],"neutron/db/l3_rpc_base.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"edd52b4abac377261e2694104030ac874e5186c4","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def update_floatingip_statuses(self, context, router_id, fip_statuses):"},{"line_number":99,"context_line":"        \"\"\"Update operational status for a floating IP.\"\"\""},{"line_number":100,"context_line":"        l3_plugin \u003d manager.NeutronManager.get_service_plugins()["},{"line_number":101,"context_line":"            plugin_constants.L3_ROUTER_NAT]"},{"line_number":102,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":103,"context_line":"            for (floatingip_id, status) in fip_statuses.iteritems():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FBMY%3D","line":100,"updated":"2014-01-18 21:36:50.000000000","message":"i\u0027ve seen this line so many times. Can we get it saved to self.xxx in the __init__ once and forever, at least for this plugin?","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b21e6c8e2edaa0c0b23c663d209996d76c7cda2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                            \u0027status\u0027: status})"},{"line_number":107,"context_line":"                l3_plugin.update_floatingip_status(floatingip_id, status)"},{"line_number":108,"context_line":"            # Find all floating IPs on the given router for which an"},{"line_number":109,"context_line":"            # update was not received. Set them DOWN mercilessly"},{"line_number":110,"context_line":"            router_floating_ips \u003d l3_plugin.get_floating_ips("},{"line_number":111,"context_line":"                context, {\u0027router\u0027: [router_id]})"},{"line_number":112,"context_line":"            db_fip_set \u003d set(fip[\u0027id\u0027] for fip in router_floating_ips)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQP0%3D","line":109,"updated":"2014-01-15 20:59:02.000000000","message":"Not sure this is a good idea... what happens if another thread creates a new floating IP on this router between the time that another thread called this function and we get here? The below code would then \"mercilessly\" set the new floating IP to a downed status, and there would be no indication (log message or otherwise) to the other thread that the floater they just created was downed. \n\nAt the very least, if you keep the below code, you should make it very clear in the docstring that the fip_statuses parameter is expected to contain *all of the floating IPs that the router is handling*, otherwise any floater handled by the router and *not* included in that parameter will be downed.","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c2630ef79f60be21dc165f7a1a1dfe0f6efcc82e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                                            \u0027status\u0027: status})"},{"line_number":107,"context_line":"                l3_plugin.update_floatingip_status(floatingip_id, status)"},{"line_number":108,"context_line":"            # Find all floating IPs on the given router for which an"},{"line_number":109,"context_line":"            # update was not received. Set them DOWN mercilessly"},{"line_number":110,"context_line":"            router_floating_ips \u003d l3_plugin.get_floating_ips("},{"line_number":111,"context_line":"                context, {\u0027router\u0027: [router_id]})"},{"line_number":112,"context_line":"            db_fip_set \u003d set(fip[\u0027id\u0027] for fip in router_floating_ips)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FQAg%3D","line":109,"in_reply_to":"AAAAUH%2F%2FQP0%3D","updated":"2014-01-15 21:56:22.000000000","message":"Your analysis is correct, but the solution is not easy in this case. I need to think about a better strategy to identify the floating IPs which where disassociated.\n\nI could use the cache on the l3 agent but I tend to not rely too much on it. Perhaps if you have any idea for making it better.\n\nBy the way, DOWN is the default status for a new floating IPs, so the opportunity window for an ACTIVE floating IP to be mercilessy brought down perhaps does not exist.\nStill you should not perform an update on a floating IP whcih was not supposed to be update","commit_id":"03ed3fc30811ef912ccb42d3f9191d13b9c86dd3"}],"neutron/db/migration/alembic_migrations/versions/2eeaf963a447_floatingip_status.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"6de3b1733ef82c784d92a661efddefb003b2b296","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                            nullable\u003dTrue))"},{"line_number":49,"context_line":"    op.add_column(\u0027floatingips\u0027,"},{"line_number":50,"context_line":"                  sa.Column(\u0027status\u0027,"},{"line_number":51,"context_line":"                            sa.String(length\u003d16),"},{"line_number":52,"context_line":"                            nullable\u003dTrue))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9paE%3D","line":51,"updated":"2014-02-05 11:27:35.000000000","message":"nit: we could use: sa.Enum(\"DOWN\", \"ACTIVE\", \"ERROR\") but w/e","commit_id":"7d96ba8412bbf84d72811a651b23fec3fe9cdb0f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ee02ccda88902a3377d5153dc39604e9fe803500","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u00272eeaf963a447\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u00273d2585038b95\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2F4nY%3D","line":28,"updated":"2014-02-27 15:51:06.000000000","message":"note: down_revision needs to be updated.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"1058e82dfbe540e5f3ebcac2f978277b9c7f3f2e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# revision identifiers, used by Alembic."},{"line_number":27,"context_line":"revision \u003d \u00272eeaf963a447\u0027"},{"line_number":28,"context_line":"down_revision \u003d \u00273d2585038b95\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# Change to [\u0027*\u0027] if this migration applies to all plugins"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2Fpyw%3D","line":28,"in_reply_to":"AAAAVX%2F%2F4nY%3D","updated":"2014-03-01 22:29:05.000000000","message":"Yes I know thanks!","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"}],"neutron/services/l3_router/l3_router_plugin.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"aea3870fe7c1db092b412252d2fae5bd005b2558","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def create_floatingip(self, context, floatingip):"},{"line_number":96,"context_line":"        \"\"\"Create floating IP."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        @param context: Neutron request context"},{"line_number":99,"context_line":"        @param floatingip: data fo the floating IP being created"},{"line_number":100,"context_line":"        @returns A floating IP object on success"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fc%2Fc%3D","line":98,"updated":"2014-02-13 04:12:34.000000000","message":"nit: I think these are java style doc comments usually  I see them as :param","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def create_floatingip(self, context, floatingip):"},{"line_number":96,"context_line":"        \"\"\"Create floating IP."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        @param context: Neutron request context"},{"line_number":99,"context_line":"        @param floatingip: data fo the floating IP being created"},{"line_number":100,"context_line":"        @returns A floating IP object on success"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZVk%3D","line":98,"in_reply_to":"AAAAUX%2F%2Fc%2Fc%3D","updated":"2014-02-13 14:19:51.000000000","message":"I think I copied them from somewhere else.\nI will fix.","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f9b58c335eb6a1453ad4f156b06f276b5bd4f5e2","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        return super(L3RouterPlugin, self).create_floatingip("},{"line_number":107,"context_line":"            context, floatingip,"},{"line_number":108,"context_line":"            initial_status\u003dq_const.FLOATINGIP_STATUS_DOWN)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FZV0%3D","line":108,"updated":"2014-02-13 14:19:51.000000000","message":"see? It will create the floating IP with status DOWN","commit_id":"43f46f3d4d14da55a3f640bd373ff9ac230b2e2b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1bc1e241b186ed65999875b8494165b1a4baaf89","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class L3RouterPluginRpcCallbacks(l3_rpc_base.L3RpcCallbackMixin):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    RPC_API_VERSION \u003d \u00271.0\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":43,"context_line":"        \"\"\"Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FhH8%3D","line":40,"updated":"2014-02-26 06:42:40.000000000","message":"I wonder we need to increment RPC_API_VERSION to 1.1.\nupdate_floatingip_statuses from l3-agent has version 1.1, so I think the callback proxy object needs to have version 1.1. I hope my understanding is correct.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ee02ccda88902a3377d5153dc39604e9fe803500","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class L3RouterPluginRpcCallbacks(l3_rpc_base.L3RpcCallbackMixin):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    RPC_API_VERSION \u003d \u00271.0\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":43,"context_line":"        \"\"\"Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2F4qM%3D","line":40,"in_reply_to":"AAAAU3%2F%2FfMw%3D","updated":"2014-02-27 15:51:06.000000000","message":"As I commented in l3_agent.py, RPC_API_VERSION needs to be 1.1. After changing to 1.1, I finally got the fip status to ACTIVE.\n\nIn RPC versioning, the receiver of RPC message processes a message whose version is less than or equal to its supported rpc version.\n\nnova has a good practice on how to use RPC versioning (e.g., compute/rpcapi.py). A sender can check supported version by using can_send_version(version). It allows us rolling update. We neutron team needs to consider RPC versioning more, especially maintainers of agent-based plugins (including ML2).","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d6032e3e13cabd257aae5fecc316e4f97f00927","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class L3RouterPluginRpcCallbacks(l3_rpc_base.L3RpcCallbackMixin):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    RPC_API_VERSION \u003d \u00271.0\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":43,"context_line":"        \"\"\"Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2FfMw%3D","line":40,"in_reply_to":"AAAAU3%2F%2FhH8%3D","updated":"2014-02-26 10:39:21.000000000","message":"I did it and then undid it.\nThis confuses me a bit.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"1058e82dfbe540e5f3ebcac2f978277b9c7f3f2e","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class L3RouterPluginRpcCallbacks(l3_rpc_base.L3RpcCallbackMixin):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    RPC_API_VERSION \u003d \u00271.0\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":43,"context_line":"        \"\"\"Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVX%2F%2Fpyg%3D","line":40,"in_reply_to":"AAAAVX%2F%2F4qM%3D","updated":"2014-03-01 22:29:05.000000000","message":"thanks a lot for doing this check.","commit_id":"6558a285e122b1c3fc98472a96c7f0f91f32897d"}],"neutron/tests/unit/test_l3_agent.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5e1b7a1c93089e54911f420e2697cd89530d4c1f","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        device.addr.delete.assert_called_once_with(4, \u002715.1.2.3/32\u0027)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"        nat \u003d ri.iptables_manager.ipv4[\u0027nat\u0027]"},{"line_number":470,"context_line":"        nat \u003d ri.iptables_manager.ipv4[\u0027nat`\u0027]"},{"line_number":471,"context_line":"        nat.clear_rules_by_tag.assert_called_once_with(\u0027floating_ip\u0027)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    @mock.patch(\u0027neutron.agent.linux.ip_lib.IPDevice\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9hwM%3D","line":470,"updated":"2014-02-06 09:58:15.000000000","message":"A backquote looks a garbage.","commit_id":"fa25e60a013850db1a520dc4a0b2f693b512583d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"9d1b053cafc7c688dfc773654882f338fab8f3cb","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        device.addr.delete.assert_called_once_with(4, \u002715.1.2.3/32\u0027)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"        nat \u003d ri.iptables_manager.ipv4[\u0027nat\u0027]"},{"line_number":470,"context_line":"        nat \u003d ri.iptables_manager.ipv4[\u0027nat`\u0027]"},{"line_number":471,"context_line":"        nat.clear_rules_by_tag.assert_called_once_with(\u0027floating_ip\u0027)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    @mock.patch(\u0027neutron.agent.linux.ip_lib.IPDevice\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9elA%3D","line":470,"in_reply_to":"AAAAUH%2F9hwM%3D","updated":"2014-02-06 16:41:04.000000000","message":"Yes it is. I am am messy guy. \nIt is interesting that the line appeared to be a duplicate in the first place.","commit_id":"fa25e60a013850db1a520dc4a0b2f693b512583d"}]}
