)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"97da2d754b2da57559fa12cb92bbffe025810e7b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Allow plugin driver to create/delete l2 port on vip creation/deletion."},{"line_number":10,"context_line":"Plugin driver may have better knowledge about how to wire vip into the"},{"line_number":11,"context_line":"tenant network. Also there is possible to share l2 ports for multiple vips."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Noop driver and haproxy plugin drivers are updated with common method"},{"line_number":14,"context_line":"that creates l2 port."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAQ3%2F%2F9mY%3D","line":11,"updated":"2013-08-12 13:01:04.000000000","message":"nit: it is possible","commit_id":"7b3e6ada704ad0f6a7821907be287123a2079f57"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"5f9a7657a86a5dccc74785c918a10b32af5eb45b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Plugin driver may have better knowledge about how to wire vip into the"},{"line_number":11,"context_line":"tenant network. Also it is possible to share l2 ports for multiple vips."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Haproxy and Radware plugin drivers are updated with common method"},{"line_number":14,"context_line":"that creates l2 port."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"fixes bug 1207986"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAATH%2F%2Fb5I%3D","line":13,"updated":"2013-10-16 07:58:56.000000000","message":"And also nicira service plugin.","commit_id":"a33d3936580512d77021a823d466097aefe69148"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"0a876c38ab133171782f493b5899e39dce76594f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Plugin driver may have better knowledge about how to wire vip into the"},{"line_number":11,"context_line":"tenant network. Also it is possible to share l2 ports for multiple vips."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Haproxy and Radware plugin drivers are updated with common method"},{"line_number":14,"context_line":"that creates l2 port."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"fixes bug 1207986"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAATH%2F%2Fbdc%3D","line":13,"in_reply_to":"AAAATH%2F%2Fb5I%3D","updated":"2013-10-16 09:52:11.000000000","message":"Done","commit_id":"a33d3936580512d77021a823d466097aefe69148"}],"neutron/db/loadbalancer/loadbalancer_db.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"97da2d754b2da57559fa12cb92bbffe025810e7b","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        }"},{"line_number":319,"context_line":"        port \u003d self._core_plugin.create_port(context, {\u0027port\u0027: port_data})"},{"line_number":320,"context_line":"        vip_db.port_id \u003d port[\u0027id\u0027]"},{"line_number":321,"context_line":"        return self._make_vip_dict(vip_db)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def create_vip(self, context, vip):"},{"line_number":324,"context_line":"        v \u003d vip[\u0027vip\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F9lg%3D","line":321,"updated":"2013-08-12 13:01:04.000000000","message":"is this return value used anywhere?","commit_id":"7b3e6ada704ad0f6a7821907be287123a2079f57"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d379848289fd9b4ca1ce31f803aed8a474633eb","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            sess_qry \u003d context.session.query(SessionPersistence)"},{"line_number":311,"context_line":"            sess_qry.filter_by(vip_id\u003dvip_id).delete()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _create_port_for_vip(self, context, vip_db, subnet_id, ip_address):"},{"line_number":314,"context_line":"        # resolve subnet and create port"},{"line_number":315,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, subnet_id)"},{"line_number":316,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbS4%3D","line":313,"updated":"2013-10-16 11:09:48.000000000","message":"from a quick grep it seems this method is not used anymore.\nWhat\u0027s the reason for keeping it?","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"27c2d74046a36f65212bd82508774da822c88c21","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            sess_qry \u003d context.session.query(SessionPersistence)"},{"line_number":311,"context_line":"            sess_qry.filter_by(vip_id\u003dvip_id).delete()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _create_port_for_vip(self, context, vip_db, subnet_id, ip_address):"},{"line_number":314,"context_line":"        # resolve subnet and create port"},{"line_number":315,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, subnet_id)"},{"line_number":316,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Fac0%3D","line":313,"in_reply_to":"AAAATH%2F%2FbCw%3D","updated":"2013-10-16 18:16:12.000000000","message":"ok","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d264f357b084524c1b6e9e1d9c5bd52ddd4b086","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            sess_qry \u003d context.session.query(SessionPersistence)"},{"line_number":311,"context_line":"            sess_qry.filter_by(vip_id\u003dvip_id).delete()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _create_port_for_vip(self, context, vip_db, subnet_id, ip_address):"},{"line_number":314,"context_line":"        # resolve subnet and create port"},{"line_number":315,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, subnet_id)"},{"line_number":316,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbCw%3D","line":313,"in_reply_to":"AAAATH%2F%2FbOs%3D","updated":"2013-10-16 12:15:37.000000000","message":"any reason for not moving it in driver_utils?","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"17d40dba41bfaf32d5b4c96264b5496297b1fc3d","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            sess_qry \u003d context.session.query(SessionPersistence)"},{"line_number":311,"context_line":"            sess_qry.filter_by(vip_id\u003dvip_id).delete()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def _create_port_for_vip(self, context, vip_db, subnet_id, ip_address):"},{"line_number":314,"context_line":"        # resolve subnet and create port"},{"line_number":315,"context_line":"        subnet \u003d self._core_plugin.get_subnet(context, subnet_id)"},{"line_number":316,"context_line":"        fixed_ip \u003d {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbOs%3D","line":313,"in_reply_to":"AAAATH%2F%2FbS4%3D","updated":"2013-10-16 11:34:43.000000000","message":"It is used by driver_utils.create_port_for_vip","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"f0f33cf61a80e81efe45a3a4e759f31a76864250","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    ########################################################"},{"line_number":221,"context_line":"    # VIP DB access"},{"line_number":222,"context_line":"    def _make_vip_dict(self, vip, fields\u003dNone):"},{"line_number":223,"context_line":"        fixed_ip \u003d [{}]"},{"line_number":224,"context_line":"        subnet_id \u003d None"},{"line_number":225,"context_line":"        ip_address \u003d None"},{"line_number":226,"context_line":"        if vip.port_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FLio%3D","line":223,"updated":"2013-11-13 10:04:39.000000000","message":"whether fixed_ip should be {}?","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"cdf4ff1fd692be0179e4a580795447ea0057a8a2","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    ########################################################"},{"line_number":221,"context_line":"    # VIP DB access"},{"line_number":222,"context_line":"    def _make_vip_dict(self, vip, fields\u003dNone):"},{"line_number":223,"context_line":"        fixed_ip \u003d [{}]"},{"line_number":224,"context_line":"        subnet_id \u003d None"},{"line_number":225,"context_line":"        ip_address \u003d None"},{"line_number":226,"context_line":"        if vip.port_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FLaM%3D","line":223,"in_reply_to":"AAAATn%2F%2FLio%3D","updated":"2013-11-13 10:07:12.000000000","message":"indeed, good catch.","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6624,"name":"Stephen Gran","email":"sgran@debian.org","username":"sgran"},"change_message_id":"876cf5ccdced5ca997a5e0fce15c674d48ec8b6c","unresolved":false,"context_lines":[{"line_number":229,"context_line":"               \u0027description\u0027: vip[\u0027description\u0027],"},{"line_number":230,"context_line":"               \u0027subnet_id\u0027: fixed_ip.get(\u0027subnet_id\u0027),"},{"line_number":231,"context_line":"               \u0027address\u0027: fixed_ip.get(\u0027ip_address\u0027),"},{"line_number":232,"context_line":"               \u0027port_id\u0027: vip[\u0027port_id\u0027],"},{"line_number":233,"context_line":"               \u0027protocol_port\u0027: vip[\u0027protocol_port\u0027],"},{"line_number":234,"context_line":"               \u0027protocol\u0027: vip[\u0027protocol\u0027],"},{"line_number":235,"context_line":"               \u0027pool_id\u0027: vip[\u0027pool_id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2B7hU%3D","side":"PARENT","line":232,"updated":"2013-11-18 13:25:07.000000000","message":"I\u0027m confused - does \u0027vip\u0027 always have a port_id, or not?  Above, it is a conditional, and here you seem to use it unconditionally.\n\nAlso, whether or not there is a port_id shouldn\u0027t affect whether or not there is an address field, should it?  I\u0027m thinking in terms of things like hardware devices, service instances, etc - they may not get new ports, but the vip will still have an address.","commit_id":"0e2198ef75c377c538f735b207e38a79d05a2f85"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"72fa5cb5c9247661853de8f8172c6b3dbc0bacb5","unresolved":false,"context_lines":[{"line_number":229,"context_line":"               \u0027description\u0027: vip[\u0027description\u0027],"},{"line_number":230,"context_line":"               \u0027subnet_id\u0027: fixed_ip.get(\u0027subnet_id\u0027),"},{"line_number":231,"context_line":"               \u0027address\u0027: fixed_ip.get(\u0027ip_address\u0027),"},{"line_number":232,"context_line":"               \u0027port_id\u0027: vip[\u0027port_id\u0027],"},{"line_number":233,"context_line":"               \u0027protocol_port\u0027: vip[\u0027protocol_port\u0027],"},{"line_number":234,"context_line":"               \u0027protocol\u0027: vip[\u0027protocol\u0027],"},{"line_number":235,"context_line":"               \u0027pool_id\u0027: vip[\u0027pool_id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2B6E4%3D","side":"PARENT","line":232,"in_reply_to":"AAAATn%2F%2B7hU%3D","updated":"2013-11-18 17:58:42.000000000","message":"When port creation is split from vip creation, vip could have port_id \u003d None at certain intermediate point where calling _make_vip_dict occurs, that\u0027s why conditional in my change.\n\n \u003e port_id shouldn\u0027t affect whether or not there is an address field, should it?\nin fact address is defined by port_id.\n\n \u003e they may not get new ports, but the vip will still have an address.\nHow\u0027s that? VIP only have the address of existing port specified by port_id","commit_id":"0e2198ef75c377c538f735b207e38a79d05a2f85"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        fixed_ip \u003d {}"},{"line_number":224,"context_line":"        subnet_id \u003d None"},{"line_number":225,"context_line":"        ip_address \u003d None"},{"line_number":226,"context_line":"        if vip.port_id:"},{"line_number":227,"context_line":"            fixed_ip \u003d (vip.port.fixed_ips or [{}])[0]"},{"line_number":228,"context_line":"            subnet_id \u003d fixed_ip.get(\u0027subnet_id\u0027)"},{"line_number":229,"context_line":"            ip_address \u003d fixed_ip.get(\u0027ip_address\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bwg%3D","line":226,"updated":"2013-12-11 15:44:44.000000000","message":"vip[\u0027port_id\u0027] or vip.port_id?  Are they equivalent?  If not, it is confusing.  If so, should be consistent in usage.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"f213609db33e4f8d6029f3da3b3928ef5903846c","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        fixed_ip \u003d {}"},{"line_number":224,"context_line":"        subnet_id \u003d None"},{"line_number":225,"context_line":"        ip_address \u003d None"},{"line_number":226,"context_line":"        if vip.port_id:"},{"line_number":227,"context_line":"            fixed_ip \u003d (vip.port.fixed_ips or [{}])[0]"},{"line_number":228,"context_line":"            subnet_id \u003d fixed_ip.get(\u0027subnet_id\u0027)"},{"line_number":229,"context_line":"            ip_address \u003d fixed_ip.get(\u0027ip_address\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9MPE%3D","line":226,"in_reply_to":"AAAATn%2F9bwg%3D","updated":"2013-12-14 21:17:21.000000000","message":"they are equivalent","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":420,"context_line":"            vip \u003d self._get_resource(context, Vip, id)"},{"line_number":421,"context_line":"            qry \u003d context.session.query(Pool)"},{"line_number":422,"context_line":"            for pool in qry.filter_by(vip_id\u003did):"},{"line_number":423,"context_line":"                pool.update({\"vip_id\": None})"},{"line_number":424,"context_line":"            context.session.delete(vip)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def get_vip(self, context, id, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bpU%3D","line":423,"updated":"2013-12-11 15:44:44.000000000","message":"I\u0027m not a fan of changing whitespace gratuitously.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"}],"neutron/services/loadbalancer/drivers/driver_utils.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"375b5afcc4b87361f2ff7619ef3b4e5d4515918d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron.db.loadbalancer import loadbalancer_db"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def create_vip(plugin, context, vip):"},{"line_number":21,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":22,"context_line":"        vip_db \u003d plugin._get_resource(context,"},{"line_number":23,"context_line":"                                      loadbalancer_db.Vip,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F50Q%3D","line":20,"updated":"2013-08-21 09:22:39.000000000","message":"function does not create a vip - consider rename to create_port_for_vip","commit_id":"3c8845bba1e4f485bcb8012f267e50cf7306b65b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d379848289fd9b4ca1ce31f803aed8a474633eb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                context, vip_db, vip[\u0027subnet_id\u0027], vip.get(\u0027address\u0027))"},{"line_number":28,"context_line":"        except Exception:"},{"line_number":29,"context_line":"            # need to recover from port creation failure"},{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbUQ%3D","line":30,"updated":"2013-10-16 11:09:48.000000000","message":"I think this is not necessary - we usually rely on sqlalchemy __exit__ hook: https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L454\n\nCan you clarify why you need an explicit rolback here?","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"27c2d74046a36f65212bd82508774da822c88c21","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                context, vip_db, vip[\u0027subnet_id\u0027], vip.get(\u0027address\u0027))"},{"line_number":28,"context_line":"        except Exception:"},{"line_number":29,"context_line":"            # need to recover from port creation failure"},{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZ4I%3D","line":30,"in_reply_to":"AAAATH%2F%2FbDQ%3D","updated":"2013-10-16 18:16:12.000000000","message":"I believe that is happening because inner transaction throws, but that\u0027s just a guess.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d264f357b084524c1b6e9e1d9c5bd52ddd4b086","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                context, vip_db, vip[\u0027subnet_id\u0027], vip.get(\u0027address\u0027))"},{"line_number":28,"context_line":"        except Exception:"},{"line_number":29,"context_line":"            # need to recover from port creation failure"},{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbDQ%3D","line":30,"in_reply_to":"AAAATH%2F%2FbJI%3D","updated":"2013-10-16 12:15:37.000000000","message":"that\u0027s a symptom of something weird going on, but I am unable to say anything more.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bc682670a51ec0749ad18c729f463f853f06873d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                context, vip_db, vip[\u0027subnet_id\u0027], vip.get(\u0027address\u0027))"},{"line_number":28,"context_line":"        except Exception:"},{"line_number":29,"context_line":"            # need to recover from port creation failure"},{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbJI%3D","line":30,"in_reply_to":"AAAATH%2F%2FbOQ%3D","updated":"2013-10-16 11:39:19.000000000","message":"Yeah, here\u0027s what I get in case of exception:\n InvalidRequestError: This Session\u0027s transaction has been rolled back by a nested rollback() call.  To begin a new transaction, issue Session.rollback() first.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"17d40dba41bfaf32d5b4c96264b5496297b1fc3d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                context, vip_db, vip[\u0027subnet_id\u0027], vip.get(\u0027address\u0027))"},{"line_number":28,"context_line":"        except Exception:"},{"line_number":29,"context_line":"            # need to recover from port creation failure"},{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbOQ%3D","line":30,"in_reply_to":"AAAATH%2F%2FbUQ%3D","updated":"2013-10-16 11:34:43.000000000","message":"I believe I hit some issue until I added this line.\nI\u0027ll recheck this and will reply","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d379848289fd9b4ca1ce31f803aed8a474633eb","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":34,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbUE%3D","line":33,"updated":"2013-10-16 11:09:48.000000000","message":"this operation might raise too. I\u0027d suggest using excutils.save_and_reraise_exception","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"17d40dba41bfaf32d5b4c96264b5496297b1fc3d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            context.session.rollback()"},{"line_number":31,"context_line":"            # delete vip and reraise original exception"},{"line_number":32,"context_line":"            with context.session.begin(subtransactions\u003dTrue):"},{"line_number":33,"context_line":"                plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":34,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbPo%3D","line":33,"in_reply_to":"AAAATH%2F%2FbUE%3D","updated":"2013-10-16 11:34:43.000000000","message":"Done","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"a2dc061810be784a1dacb875c716f92c61b82d2a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.openstack.common import excutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def create_port_for_vip(plugin, context, vip):"},{"line_number":23,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":24,"context_line":"        vip_db \u003d plugin._get_resource(context,"},{"line_number":25,"context_line":"                                      loadbalancer_db.Vip,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2F2dg%3D","line":22,"updated":"2013-10-27 12:35:59.000000000","message":"We should consider moving \u0027populate_vip_graph\u0027 from plugin.py to here or move \u0027create_port_for_vip\u0027 to plugin.py.\nThose 2 methods are \"helper functions\"","commit_id":"c53b3f460330e9e6d2a5bff284f5c21d385dc9c8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"22576bf2ddb0736aa4762cfc4e0252d37dd6b83e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.openstack.common import excutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def create_port_for_vip(plugin, context, vip):"},{"line_number":23,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":24,"context_line":"        vip_db \u003d plugin._get_resource(context,"},{"line_number":25,"context_line":"                                      loadbalancer_db.Vip,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2F2dI%3D","line":22,"in_reply_to":"AAAATn%2F%2F2dg%3D","updated":"2013-10-27 12:53:02.000000000","message":"I would agree, however, this helper function is used by Nicira ServicePlugin. While it\u0027s ok for Nicira to be dependent of lbaas stuff, it\u0027s not ok for Nicira plugin to instantiate lbaas plugin just because of this method.\nSo I\u0027ll leave this function here. Regarding moving populate_vip_graph - sure I can do that, the only concern is that such refactoring is a bit out of scope of the patch. But that might be ok","commit_id":"c53b3f460330e9e6d2a5bff284f5c21d385dc9c8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            # delete vip and reraise original exception"},{"line_number":52,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":53,"context_line":"                with context.session.begin(subtransactions\u003dTrue):"},{"line_number":54,"context_line":"                    plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def populate_vip_graph(plugin, context, vip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bq4%3D","line":54,"updated":"2013-12-11 15:44:44.000000000","message":"Is this reaching too far?  Does it fit within the scope of this patch?  I noticed that the original code did not have this.  It wasn\u0027t mentioned in the commit message.  Seems like it is at least worthy of mentioning in the commit message.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"f213609db33e4f8d6029f3da3b3928ef5903846c","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            # delete vip and reraise original exception"},{"line_number":52,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":53,"context_line":"                with context.session.begin(subtransactions\u003dTrue):"},{"line_number":54,"context_line":"                    plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def populate_vip_graph(plugin, context, vip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9MO4%3D","line":54,"in_reply_to":"AAAATn%2F9bq4%3D","updated":"2013-12-14 21:17:21.000000000","message":"Could you please clarify what do you mean?","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"}],"neutron/services/loadbalancer/drivers/haproxy/plugin_driver.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"97da2d754b2da57559fa12cb92bbffe025810e7b","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def delete_vip(self, context, vip):"},{"line_number":294,"context_line":"        self.plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":295,"context_line":"        if vip[\u0027port_id\u0027]:"},{"line_number":296,"context_line":"            self.plugin._core_plugin.delete_port(context, vip[\u0027port_id\u0027])"},{"line_number":297,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":298,"context_line":"        self.agent_rpc.destroy_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F9ks%3D","line":295,"updated":"2013-08-12 13:01:04.000000000","message":"super(HaproxyOnHostPluginDriver, self).delete_vip(context, vip)?","commit_id":"7b3e6ada704ad0f6a7821907be287123a2079f57"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d379848289fd9b4ca1ce31f803aed8a474633eb","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def delete_vip(self, context, vip):"},{"line_number":299,"context_line":"        self.plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":300,"context_line":"        self.plugin._core_plugin.delete_port(context, vip[\u0027port_id\u0027])"},{"line_number":301,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":302,"context_line":"        self.agent_rpc.destroy_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbTw%3D","line":300,"updated":"2013-10-16 11:09:48.000000000","message":"Is it worth finding a way for ensuring atomicity here?\nBefore we had a single transaction in delete_db_vip; now there are two indepedent transactions.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"27c2d74046a36f65212bd82508774da822c88c21","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def delete_vip(self, context, vip):"},{"line_number":299,"context_line":"        self.plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":300,"context_line":"        self.plugin._core_plugin.delete_port(context, vip[\u0027port_id\u0027])"},{"line_number":301,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":302,"context_line":"        self.agent_rpc.destroy_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FZZo%3D","line":300,"in_reply_to":"AAAATH%2F%2FbCY%3D","updated":"2013-10-16 18:16:12.000000000","message":"I don\u0027t mind wrapping this sequence with a transaction here and in Nicira service plugin. For Radware driver the sequence is complex so I\u0027d avoid doing that.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d264f357b084524c1b6e9e1d9c5bd52ddd4b086","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def delete_vip(self, context, vip):"},{"line_number":299,"context_line":"        self.plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":300,"context_line":"        self.plugin._core_plugin.delete_port(context, vip[\u0027port_id\u0027])"},{"line_number":301,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":302,"context_line":"        self.agent_rpc.destroy_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbCY%3D","line":300,"in_reply_to":"AAAATH%2F%2FbNc%3D","updated":"2013-10-16 12:15:37.000000000","message":"A plugin crashes while deleting the port. We can\u0027t know a priority what code is execute there.\nIf that happens we should either restore the VIP or take some corrective action on the port which failed to delete.. I don\u0027t know - put it in error perhaps?\n\nUp to you anyway. The source code base is full of conditions like this. In the worst case a #NOTE or #TODO just to explain other people what can happen there will work too.","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"17d40dba41bfaf32d5b4c96264b5496297b1fc3d","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def delete_vip(self, context, vip):"},{"line_number":299,"context_line":"        self.plugin._delete_db_vip(context, vip[\u0027id\u0027])"},{"line_number":300,"context_line":"        self.plugin._core_plugin.delete_port(context, vip[\u0027port_id\u0027])"},{"line_number":301,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":302,"context_line":"        self.agent_rpc.destroy_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbNc%3D","line":300,"in_reply_to":"AAAATH%2F%2FbTw%3D","updated":"2013-10-16 11:34:43.000000000","message":"I can\u0027t think of a case where it would be neccessary. \nDo you have an example?","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"change_message_id":"261a766c677b48bfed06916bed9c4921cd0384f8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from neutron.openstack.common.rpc import proxy"},{"line_number":34,"context_line":"from neutron.plugins.common import constants"},{"line_number":35,"context_line":"from neutron.services.loadbalancer.drivers import ("},{"line_number":36,"context_line":"    abstract_driver, driver_utils"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ZGU%3D","line":36,"updated":"2013-12-11 23:59:26.000000000","message":"nit: separate the imports","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":288,"context_line":"        self.agent_rpc.reload_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":289,"context_line":"        return v"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def update_vip(self, context, old_vip, vip):"},{"line_number":292,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bpE%3D","line":289,"updated":"2013-12-11 15:44:44.000000000","message":"What is v?  A port?  It isn\u0027t clearly documented on create_port_for_vip what it returns.  I don\u0027t understand why create_vip needs to capture it and return it when it didn\u0027t return anything before.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"f213609db33e4f8d6029f3da3b3928ef5903846c","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":288,"context_line":"        self.agent_rpc.reload_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":289,"context_line":"        return v"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def update_vip(self, context, old_vip, vip):"},{"line_number":292,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9MOo%3D","line":289,"in_reply_to":"AAAATn%2F9ZAw%3D","updated":"2013-12-14 21:17:21.000000000","message":"It was forwarded, actually. The difference is that previously, port was created in plugin db, so vip already had the port in the dict.\nNo that is plugin driver\u0027s responsibility, so we need to pass the result back.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"change_message_id":"261a766c677b48bfed06916bed9c4921cd0384f8","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"},{"line_number":288,"context_line":"        self.agent_rpc.reload_pool(context, vip[\u0027pool_id\u0027], agent[\u0027host\u0027])"},{"line_number":289,"context_line":"        return v"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def update_vip(self, context, old_vip, vip):"},{"line_number":292,"context_line":"        agent \u003d self.get_pool_agent(context, vip[\u0027pool_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ZAw%3D","line":289,"in_reply_to":"AAAATn%2F9bpE%3D","updated":"2013-12-11 23:59:26.000000000","message":"v should be a VIP, the only reason I see for returning V is in order to return the complete VIP dictionary (i.e. port_id included) to the API call.\nHowever, this requires the loadbalancer plugin to forward it back.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"}],"neutron/services/loadbalancer/drivers/radware/driver.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"7d379848289fd9b4ca1ce31f803aed8a474633eb","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # device"},{"line_number":175,"context_line":"            self._remove_workflow(extended_vip, context)"},{"line_number":176,"context_line":"            if vip[\"port_id\"]:"},{"line_number":177,"context_line":"                self.plugin._core_plugin.delete_port(context, vip[\"port_id\"])"},{"line_number":178,"context_line":"        except Exception:"},{"line_number":179,"context_line":"            pool_id \u003d extended_vip[\u0027pool_id\u0027]"},{"line_number":180,"context_line":"            LOG.exception(_(\u0027Failed to remove workflow %s\u0027), pool_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbTc%3D","line":177,"updated":"2013-10-16 11:09:48.000000000","message":"Question, just for curiosity.\nWhat would be the case for a vip without a port?\nIf that happens, why only for the radware driver?\nAnd finally - do you think it might worth using get instead of __getitem__, just in case the key is missing?","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"17d40dba41bfaf32d5b4c96264b5496297b1fc3d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # device"},{"line_number":175,"context_line":"            self._remove_workflow(extended_vip, context)"},{"line_number":176,"context_line":"            if vip[\"port_id\"]:"},{"line_number":177,"context_line":"                self.plugin._core_plugin.delete_port(context, vip[\"port_id\"])"},{"line_number":178,"context_line":"        except Exception:"},{"line_number":179,"context_line":"            pool_id \u003d extended_vip[\u0027pool_id\u0027]"},{"line_number":180,"context_line":"            LOG.exception(_(\u0027Failed to remove workflow %s\u0027), pool_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FbNA%3D","line":177,"in_reply_to":"AAAATH%2F%2FbTc%3D","updated":"2013-10-16 11:34:43.000000000","message":"In fact I\u0027ve just missed that particular place while removing it from other places. Will remove this","commit_id":"875c59c73309b84f6ce84c117009e6e8918293cc"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"a2dc061810be784a1dacb875c716f92c61b82d2a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            # removing the WF will cause deletion of the configuration from the"},{"line_number":174,"context_line":"            # device"},{"line_number":175,"context_line":"            self._remove_workflow(extended_vip, context)"},{"line_number":176,"context_line":"            self.plugin._core_plugin.delete_port(context, vip[\"port_id\"])"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pool_id \u003d extended_vip[\u0027pool_id\u0027]"},{"line_number":179,"context_line":"            LOG.exception(_(\u0027Failed to remove workflow %s\u0027), pool_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2F2eE%3D","line":176,"updated":"2013-10-27 12:35:59.000000000","message":"The delete_port should go to:\nhttps://github.com/openstack/neutron/blob/master/neutron/services/loadbalancer/drivers/radware/driver.py#L758","commit_id":"c53b3f460330e9e6d2a5bff284f5c21d385dc9c8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"22576bf2ddb0736aa4762cfc4e0252d37dd6b83e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            # removing the WF will cause deletion of the configuration from the"},{"line_number":174,"context_line":"            # device"},{"line_number":175,"context_line":"            self._remove_workflow(extended_vip, context)"},{"line_number":176,"context_line":"            self.plugin._core_plugin.delete_port(context, vip[\"port_id\"])"},{"line_number":177,"context_line":"        except Exception:"},{"line_number":178,"context_line":"            pool_id \u003d extended_vip[\u0027pool_id\u0027]"},{"line_number":179,"context_line":"            LOG.exception(_(\u0027Failed to remove workflow %s\u0027), pool_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2F2dA%3D","line":176,"in_reply_to":"AAAATn%2F%2F2eE%3D","updated":"2013-10-27 12:53:02.000000000","message":"Done","commit_id":"c53b3f460330e9e6d2a5bff284f5c21d385dc9c8"}],"neutron/services/loadbalancer/drivers/single_vip_driver.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"97da2d754b2da57559fa12cb92bbffe025810e7b","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class SingleVipDriver(abstract_driver.LoadBalancerAbstractDriver):"},{"line_number":22,"context_line":"    \"\"\"Driver that creates and deletes l2 port."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Driver assumes that port and vip are in 1:1 relationship"},{"line_number":25,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQ3%2F%2F9ik%3D","line":22,"updated":"2013-08-12 13:01:04.000000000","message":"no methods for deleting port","commit_id":"7b3e6ada704ad0f6a7821907be287123a2079f57"}],"neutron/services/loadbalancer/plugin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # that will add address or subnet_id specified in input"},{"line_number":111,"context_line":"        v.update(vip[\u0027vip\u0027])"},{"line_number":112,"context_line":"        driver \u003d self._get_driver_for_pool(context, v[\u0027pool_id\u0027])"},{"line_number":113,"context_line":"        # driver.create_vip should return vip dict with a port"},{"line_number":114,"context_line":"        v \u003d driver.create_vip(context, v)"},{"line_number":115,"context_line":"        return v"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bn4%3D","line":113,"updated":"2013-12-11 15:44:44.000000000","message":"I\u0027m beginning to understand.  This should be documented where create_vip is defined.  I was a bit confused about the changes there.","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"9dc76905309a41ac6a5530e675ac0f37db00ded5","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        v.update(vip[\u0027vip\u0027])"},{"line_number":112,"context_line":"        driver \u003d self._get_driver_for_pool(context, v[\u0027pool_id\u0027])"},{"line_number":113,"context_line":"        # driver.create_vip should return vip dict with a port"},{"line_number":114,"context_line":"        v \u003d driver.create_vip(context, v)"},{"line_number":115,"context_line":"        return v"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def update_vip(self, context, id, vip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9bm0%3D","line":114,"updated":"2013-12-11 15:44:44.000000000","message":"v is overloaded (assigned twice).  Maybe just return driver.create_vip...","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"f213609db33e4f8d6029f3da3b3928ef5903846c","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        v.update(vip[\u0027vip\u0027])"},{"line_number":112,"context_line":"        driver \u003d self._get_driver_for_pool(context, v[\u0027pool_id\u0027])"},{"line_number":113,"context_line":"        # driver.create_vip should return vip dict with a port"},{"line_number":114,"context_line":"        v \u003d driver.create_vip(context, v)"},{"line_number":115,"context_line":"        return v"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def update_vip(self, context, id, vip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9MOk%3D","line":114,"in_reply_to":"AAAATn%2F9bm0%3D","updated":"2013-12-14 21:17:21.000000000","message":"yeah, sure","commit_id":"8f7c4d6826d9c648f6efb16d487d882929dcd31f"}],"neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py":[{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"                # Delete VIP"},{"line_number":235,"context_line":"                self.plugin_instance.delete_vip(self.ctx, vip[\u0027id\u0027])"},{"line_number":236,"context_line":"                self.plugin_instance._core_plugin.delete_port("},{"line_number":237,"context_line":"                    self.ctx, vip[\u0027port_id\u0027])"},{"line_number":238,"context_line":"                # Test deletion REST calls"},{"line_number":239,"context_line":"                calls \u003d ["}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1S0%3D","line":236,"updated":"2013-10-28 09:41:38.000000000","message":"This is handled by the driver - why should we call it from here?","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d5bf8944faccaa5716460e1be4704472873d54a5","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"                # Delete VIP"},{"line_number":235,"context_line":"                self.plugin_instance.delete_vip(self.ctx, vip[\u0027id\u0027])"},{"line_number":236,"context_line":"                self.plugin_instance._core_plugin.delete_port("},{"line_number":237,"context_line":"                    self.ctx, vip[\u0027port_id\u0027])"},{"line_number":238,"context_line":"                # Test deletion REST calls"},{"line_number":239,"context_line":"                calls \u003d ["}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1NE%3D","line":236,"in_reply_to":"AAAATn%2F%2F1QM%3D","updated":"2013-10-28 10:06:55.000000000","message":"please see: https://bugs.launchpad.net/neutron/+bug/1245208","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"04a4632e9553c76501cb18f52846289d7c02ea00","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"                # Delete VIP"},{"line_number":235,"context_line":"                self.plugin_instance.delete_vip(self.ctx, vip[\u0027id\u0027])"},{"line_number":236,"context_line":"                self.plugin_instance._core_plugin.delete_port("},{"line_number":237,"context_line":"                    self.ctx, vip[\u0027port_id\u0027])"},{"line_number":238,"context_line":"                # Test deletion REST calls"},{"line_number":239,"context_line":"                calls \u003d ["}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1QM%3D","line":236,"in_reply_to":"AAAATn%2F%2F1S0%3D","updated":"2013-10-28 09:55:28.000000000","message":"When i moved port deletion to the handler, it is now performed in separate thread. \nIt doesn\u0027t work with \u0027with\u0027 statement, since that separate thread doesn\u0027t manage to perform deletion during the __exit__ block of the with. So I have to do this manually.\nThat is a generic issue of radware UTs that should be fixed in a separate patch. I\u0027ll file a bug and let you know.","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"                # delete VIP"},{"line_number":287,"context_line":"                self.plugin_instance.delete_vip(self.ctx, vip[\u0027id\u0027])"},{"line_number":288,"context_line":"                self.plugin_instance._core_plugin.delete_port(self.ctx,"},{"line_number":289,"context_line":"                                                              vip[\u0027port_id\u0027])"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def test_delete_vip(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1Sw%3D","line":288,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                    self.ctx, {\u0027vip\u0027: vip_data})"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"                self.plugin_instance.delete_vip(self.ctx, vip[\u0027id\u0027])"},{"line_number":313,"context_line":"                self.plugin_instance._core_plugin.delete_port(self.ctx,"},{"line_number":314,"context_line":"                                                              vip[\u0027port_id\u0027])"},{"line_number":315,"context_line":"                calls \u003d ["},{"line_number":316,"context_line":"                    mock.call(\u0027DELETE\u0027, \u0027/api/workflow/\u0027 + pool[\u0027pool\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1S4%3D","line":313,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                                      self.ctx, pool[\u0027pool\u0027][\u0027id\u0027])"},{"line_number":336,"context_line":"                    self.plugin_instance.delete_vip(self.ctx,"},{"line_number":337,"context_line":"                                                    vip[\u0027vip\u0027][\u0027id\u0027])"},{"line_number":338,"context_line":"                    self.plugin_instance._core_plugin.delete_port("},{"line_number":339,"context_line":"                        self.ctx, vip[\u0027vip\u0027][\u0027port_id\u0027])"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def test_create_member_with_vip(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1Sc%3D","line":338,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                                                             any_order\u003dTrue)"},{"line_number":361,"context_line":"                        self.plugin_instance.delete_vip(self.ctx,"},{"line_number":362,"context_line":"                                                        vip[\u0027vip\u0027][\u0027id\u0027])"},{"line_number":363,"context_line":"                        self.plugin_instance._core_plugin.delete_port("},{"line_number":364,"context_line":"                            self.ctx, vip[\u0027vip\u0027][\u0027port_id\u0027])"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def test_update_member_with_vip(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1SY%3D","line":363,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                        self.assertEqual(updated_member[\u0027status\u0027], \u0027ACTIVE\u0027)"},{"line_number":401,"context_line":"                        self.plugin_instance.delete_vip(self.ctx,"},{"line_number":402,"context_line":"                                                        vip[\u0027vip\u0027][\u0027id\u0027])"},{"line_number":403,"context_line":"                        self.plugin_instance._core_plugin.delete_port("},{"line_number":404,"context_line":"                            self.ctx, vip[\u0027vip\u0027][\u0027port_id\u0027])"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"    def test_update_member_without_vip(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1SU%3D","line":403,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"0d8068385f698109e1ad3f56877c6b7edf4db00c","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                                          self.ctx, m[\u0027member\u0027][\u0027id\u0027])"},{"line_number":448,"context_line":"                        self.plugin_instance.delete_vip(self.ctx,"},{"line_number":449,"context_line":"                                                        vip[\u0027vip\u0027][\u0027id\u0027])"},{"line_number":450,"context_line":"                        self.plugin_instance._core_plugin.delete_port("},{"line_number":451,"context_line":"                            self.ctx, vip[\u0027vip\u0027][\u0027port_id\u0027])"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    def test_delete_member_without_vip(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2F1SQ%3D","line":450,"updated":"2013-10-28 09:41:38.000000000","message":"ditto","commit_id":"68bafba9995db2c9233194c2292fdad318110b46"}]}
