)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adding BGPVPN OVO objects and tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bagpipe driver is moving toward using ovo objects for rpc calls."},{"line_number":10,"context_line":"The bgpvpn ovo objects are defined under networking_bagpipe/objects."},{"line_number":11,"context_line":"They overlay the bgpvpn database tables, and are intended for using rpc calls."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_2220a8b0","line":9,"range":{"start_line":9,"start_character":38,"end_line":9,"end_character":41},"updated":"2017-09-01 09:58:46.000000000","message":"OVO","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adding BGPVPN OVO objects and tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bagpipe driver is moving toward using ovo objects for rpc calls."},{"line_number":10,"context_line":"The bgpvpn ovo objects are defined under networking_bagpipe/objects."},{"line_number":11,"context_line":"They overlay the bgpvpn database tables, and are intended for using rpc calls."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_022daca7","line":9,"range":{"start_line":9,"start_character":54,"end_line":9,"end_character":57},"updated":"2017-09-01 09:58:46.000000000","message":"RPC","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Adding BGPVPN OVO objects and tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bagpipe driver is moving toward using ovo objects for rpc calls."},{"line_number":10,"context_line":"The bgpvpn ovo objects are defined under networking_bagpipe/objects."},{"line_number":11,"context_line":"They overlay the bgpvpn database tables, and are intended for using rpc calls."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The corresponding tests have been implemented."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_e229809b","line":10,"range":{"start_line":10,"start_character":11,"end_line":10,"end_character":14},"updated":"2017-09-01 09:58:46.000000000","message":"OVO","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bagpipe driver is moving toward using ovo objects for rpc calls."},{"line_number":10,"context_line":"The bgpvpn ovo objects are defined under networking_bagpipe/objects."},{"line_number":11,"context_line":"They overlay the bgpvpn database tables, and are intended for using rpc calls."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The corresponding tests have been implemented."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_8212bc61","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":78},"updated":"2017-09-01 09:58:46.000000000","message":"(line too long)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"}],"networking_bagpipe/objects/bgpvpn.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.objects.router import RouterPort"},{"line_number":24,"context_line":"from neutron.objects.subnet import Subnet"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from oslo_versionedobjects import base as obj_base"},{"line_number":27,"context_line":"from oslo_versionedobjects import fields as obj_fields"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_2209c830","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":54},"updated":"2017-09-01 09:58:46.000000000","message":"This change needs to modify requirements.txt to include a dependency on oslo_versionedobjects (same line as the one in neutron will be fine)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.objects.router import RouterPort"},{"line_number":24,"context_line":"from neutron.objects.subnet import Subnet"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from oslo_versionedobjects import base as obj_base"},{"line_number":27,"context_line":"from oslo_versionedobjects import fields as obj_fields"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_fdc26452","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":54},"in_reply_to":"7f287b81_2209c830","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        super(BGPVPNAssociations, self).__init__(context, **kwargs)"},{"line_number":49,"context_line":"        self.add_extra_filter_name(\u0027network_id\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def create(self):"},{"line_number":52,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":53,"context_line":"            super(BGPVPNAssociations, self).create()"},{"line_number":54,"context_line":"            self.obj_load_attr(\u0027router_associations\u0027)"},{"line_number":55,"context_line":"            self.obj_load_attr(\u0027network_associations\u0027)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def update(self):"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":59,"context_line":"            if \u0027router_associations\u0027 in self.obj_what_changed():"},{"line_number":60,"context_line":"                self.obj_load_attr(\u0027router_associations\u0027)"},{"line_number":61,"context_line":"            if \u0027network_associations\u0027 in self.obj_what_changed():"},{"line_number":62,"context_line":"                self.obj_load_attr(\u0027network_associations\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _load_network_associations(self, db_obj\u003dNone):"},{"line_number":65,"context_line":"        net_assocs \u003d BGPVPNNetAssociation.get_objects(self.obj_context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_0b9ee753","line":62,"range":{"start_line":51,"start_character":0,"end_line":62,"end_character":58},"updated":"2017-09-01 13:08:43.000000000","message":"Do we want/need to support *writing* to the DB via our OVO objects ?  I would say no.  Can we omit this from an OVO definition ?","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        super(BGPVPNAssociations, self).__init__(context, **kwargs)"},{"line_number":49,"context_line":"        self.add_extra_filter_name(\u0027network_id\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def create(self):"},{"line_number":52,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":53,"context_line":"            super(BGPVPNAssociations, self).create()"},{"line_number":54,"context_line":"            self.obj_load_attr(\u0027router_associations\u0027)"},{"line_number":55,"context_line":"            self.obj_load_attr(\u0027network_associations\u0027)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def update(self):"},{"line_number":58,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":59,"context_line":"            if \u0027router_associations\u0027 in self.obj_what_changed():"},{"line_number":60,"context_line":"                self.obj_load_attr(\u0027router_associations\u0027)"},{"line_number":61,"context_line":"            if \u0027network_associations\u0027 in self.obj_what_changed():"},{"line_number":62,"context_line":"                self.obj_load_attr(\u0027network_associations\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _load_network_associations(self, db_obj\u003dNone):"},{"line_number":65,"context_line":"        net_assocs \u003d BGPVPNNetAssociation.get_objects(self.obj_context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_dd91e848","line":62,"range":{"start_line":51,"start_character":0,"end_line":62,"end_character":58},"in_reply_to":"7f287b81_0b9ee753","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    @classmethod"},{"line_number":75,"context_line":"    def get_objects(cls, context, _pager\u003dNone, validate_filters\u003dTrue,"},{"line_number":76,"context_line":"                    **kwargs):"},{"line_number":77,"context_line":"        router_assocs \u003d BGPVPNRouterAssociation \\"},{"line_number":78,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":79,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":80,"context_line":"                         **kwargs)"},{"line_number":81,"context_line":"        network_assocs \u003d BGPVPNNetAssociation\\"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_e5174a45","line":78,"range":{"start_line":77,"start_character":47,"end_line":78,"end_character":13},"updated":"2017-09-01 09:58:46.000000000","message":"style: in OpenStack, we prefer to avoid backslashes when possible, here you can write:\n\n  router_assocs \u003d BGPVPNRouterAssociation.get_objects(\n      context,\n      _pager\u003d_pager,\n  ...\n\n(same in other places below)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    @classmethod"},{"line_number":75,"context_line":"    def get_objects(cls, context, _pager\u003dNone, validate_filters\u003dTrue,"},{"line_number":76,"context_line":"                    **kwargs):"},{"line_number":77,"context_line":"        router_assocs \u003d BGPVPNRouterAssociation \\"},{"line_number":78,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":79,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":80,"context_line":"                         **kwargs)"},{"line_number":81,"context_line":"        network_assocs \u003d BGPVPNNetAssociation\\"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_bd94ec37","line":78,"range":{"start_line":77,"start_character":47,"end_line":78,"end_character":13},"in_reply_to":"7f287b81_e5174a45","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":79,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":80,"context_line":"                         **kwargs)"},{"line_number":81,"context_line":"        network_assocs \u003d BGPVPNNetAssociation\\"},{"line_number":82,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":83,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":84,"context_line":"                         **kwargs)"},{"line_number":85,"context_line":"        assocs \u003d BGPVPNAssociations(router_associations\u003drouter_assocs,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_2bcac34e","line":82,"range":{"start_line":81,"start_character":45,"end_line":82,"end_character":13},"updated":"2017-09-01 13:08:43.000000000","message":"same here","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":79,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":80,"context_line":"                         **kwargs)"},{"line_number":81,"context_line":"        network_assocs \u003d BGPVPNNetAssociation\\"},{"line_number":82,"context_line":"            .get_objects(context, _pager\u003d_pager,"},{"line_number":83,"context_line":"                         validate_filters\u003dvalidate_filters,"},{"line_number":84,"context_line":"                         **kwargs)"},{"line_number":85,"context_line":"        assocs \u003d BGPVPNAssociations(router_associations\u003drouter_assocs,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_9d97f03a","line":82,"range":{"start_line":81,"start_character":45,"end_line":82,"end_character":13},"in_reply_to":"7f287b81_2bcac34e","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def __init__(self, context\u003dNone, **kwargs):"},{"line_number":132,"context_line":"        super(BGPVPNNetAssociation, self).__init__(context, **kwargs)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def create(self):"},{"line_number":135,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":136,"context_line":"            super(BGPVPNNetAssociation, self).create()"},{"line_number":137,"context_line":"            self.obj_load_attr(\u0027subnets\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update(self):"},{"line_number":140,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":141,"context_line":"            if \u0027subnets\u0027 in self.obj_what_changed():"},{"line_number":142,"context_line":"                self.obj_load_attr(\u0027subnets\u0027)"},{"line_number":143,"context_line":"            super(BGPVPNNetAssociation, self).update()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":146,"context_line":"        if attrname \u003d\u003d \u0027subnets\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_cbc0df2d","line":143,"range":{"start_line":134,"start_character":0,"end_line":143,"end_character":54},"updated":"2017-09-01 13:08:43.000000000","message":"same comment as for assocations: do we need to support write via our OVO objects ?","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def __init__(self, context\u003dNone, **kwargs):"},{"line_number":132,"context_line":"        super(BGPVPNNetAssociation, self).__init__(context, **kwargs)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def create(self):"},{"line_number":135,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":136,"context_line":"            super(BGPVPNNetAssociation, self).create()"},{"line_number":137,"context_line":"            self.obj_load_attr(\u0027subnets\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update(self):"},{"line_number":140,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":141,"context_line":"            if \u0027subnets\u0027 in self.obj_what_changed():"},{"line_number":142,"context_line":"                self.obj_load_attr(\u0027subnets\u0027)"},{"line_number":143,"context_line":"            super(BGPVPNNetAssociation, self).update()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":146,"context_line":"        if attrname \u003d\u003d \u0027subnets\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_7d9af461","line":143,"range":{"start_line":134,"start_character":0,"end_line":143,"end_character":54},"in_reply_to":"7f287b81_cbc0df2d","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def _load_subnets(self, db_obj\u003dNone):"},{"line_number":151,"context_line":"        subnets \u003d Subnet.get_objects(self.obj_context,"},{"line_number":152,"context_line":"                                     network_id\u003dself.network_id)"},{"line_number":153,"context_line":"        subnets_info \u003d []"},{"line_number":154,"context_line":"        for subnet in subnets:"},{"line_number":155,"context_line":"            gateway_mac \u003d self._get_gateway_mac_by_subnet(self.obj_context,"},{"line_number":156,"context_line":"                                                          subnet.id)"},{"line_number":157,"context_line":"            subnet_info \u003d {\u0027ip_version\u0027: subnet.ip_version,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_cb1c5fc3","line":154,"range":{"start_line":153,"start_character":8,"end_line":154,"end_character":30},"updated":"2017-09-01 13:08:43.000000000","message":"This loop could be replaced with \"list comprehension\":\n\n    subnets_info \u003d [{\n                     \"ip_version\": ...\n                       ... \n                     }\n                    for subnet in subnets]\n\n\n(This is really a matter of style, the performance delta is tiny)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        setattr(self, \u0027subnets\u0027, subnets_info)"},{"line_number":163,"context_line":"        self.obj_reset_changes([\u0027subnets\u0027])"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    # FIXME: in case network is attached to multiple ports"},{"line_number":166,"context_line":"    # it takes the first address as gateway_mac"},{"line_number":167,"context_line":"    def _get_gateway_mac_by_subnet(self, obj_context, subnet_id):"},{"line_number":168,"context_line":"        ip_allocations \u003d IPAllocation.get_objects(obj_context,"},{"line_number":169,"context_line":"                                                  subnet_id\u003dsubnet_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_453a9ecd","line":166,"range":{"start_line":165,"start_character":0,"end_line":166,"end_character":47},"updated":"2017-09-01 09:58:46.000000000","message":"Yes indeed this is wrong, it should find the Router port on the subnet.  Why not use a DB query similar as [1] ?\n\n[1] https://github.com/openstack/networking-bgpvpn/blob/master/networking_bgpvpn/neutron/services/service_drivers/bagpipe/bagpipe.py#L57-L70","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    # FIXME: in case network is attached to multiple ports"},{"line_number":166,"context_line":"    # it takes the first address as gateway_mac"},{"line_number":167,"context_line":"    def _get_gateway_mac_by_subnet(self, obj_context, subnet_id):"},{"line_number":168,"context_line":"        ip_allocations \u003d IPAllocation.get_objects(obj_context,"},{"line_number":169,"context_line":"                                                  subnet_id\u003dsubnet_id)"},{"line_number":170,"context_line":"        for ip_allocation in ip_allocations:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_ebd83b1f","line":167,"range":{"start_line":167,"start_character":8,"end_line":167,"end_character":34},"updated":"2017-09-01 13:08:43.000000000","message":"This method does not use self and could be defined out of the class in a simple utility function.","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    # FIXME: in case network is attached to multiple ports"},{"line_number":166,"context_line":"    # it takes the first address as gateway_mac"},{"line_number":167,"context_line":"    def _get_gateway_mac_by_subnet(self, obj_context, subnet_id):"},{"line_number":168,"context_line":"        ip_allocations \u003d IPAllocation.get_objects(obj_context,"},{"line_number":169,"context_line":"                                                  subnet_id\u003dsubnet_id)"},{"line_number":170,"context_line":"        for ip_allocation in ip_allocations:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_5d585886","line":167,"range":{"start_line":167,"start_character":8,"end_line":167,"end_character":34},"in_reply_to":"7f287b81_ebd83b1f","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c63d69a48375c4cd7e5bad36348c5f27309704f8","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        \u0027bgpvpn_obj\u0027: obj_fields.ObjectField(\u0027BGPVPN\u0027,"},{"line_number":194,"context_line":"                                             nullable\u003dTrue),"},{"line_number":195,"context_line":"        \u0027router_id\u0027: obj_fields.StringField(),"},{"line_number":196,"context_line":"        \u0027hidden_network_associations\u0027:"},{"line_number":197,"context_line":"            common_types.ListOfDictOfMiscValuesField(nullable\u003dTrue)"},{"line_number":198,"context_line":"    }"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_855526fd","line":196,"range":{"start_line":196,"start_character":9,"end_line":196,"end_character":15},"updated":"2017-09-01 09:58:46.000000000","message":"I would suggest \u0027implicit\u0027 instead of \u0027hidden\u0027.","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        \u0027bgpvpn_obj\u0027: obj_fields.ObjectField(\u0027BGPVPN\u0027,"},{"line_number":194,"context_line":"                                             nullable\u003dTrue),"},{"line_number":195,"context_line":"        \u0027router_id\u0027: obj_fields.StringField(),"},{"line_number":196,"context_line":"        \u0027hidden_network_associations\u0027:"},{"line_number":197,"context_line":"            common_types.ListOfDictOfMiscValuesField(nullable\u003dTrue)"},{"line_number":198,"context_line":"    }"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_9602fe08","line":196,"range":{"start_line":196,"start_character":9,"end_line":196,"end_character":15},"in_reply_to":"7f287b81_855526fd","updated":"2017-09-01 13:08:43.000000000","message":"Thinking more about it, I think we should keep the word \u0027association\u0027 for real association API resources. \n\nWhat about \"connected_networks\" ?","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        \u0027bgpvpn_obj\u0027: obj_fields.ObjectField(\u0027BGPVPN\u0027,"},{"line_number":194,"context_line":"                                             nullable\u003dTrue),"},{"line_number":195,"context_line":"        \u0027router_id\u0027: obj_fields.StringField(),"},{"line_number":196,"context_line":"        \u0027hidden_network_associations\u0027:"},{"line_number":197,"context_line":"            common_types.ListOfDictOfMiscValuesField(nullable\u003dTrue)"},{"line_number":198,"context_line":"    }"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_1df2e09a","line":196,"range":{"start_line":196,"start_character":9,"end_line":196,"end_character":15},"in_reply_to":"7f287b81_9602fe08","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    def __init__(self, context\u003dNone, **kwargs):"},{"line_number":204,"context_line":"        super(BGPVPNRouterAssociation, self).__init__(context, **kwargs)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def create(self):"},{"line_number":207,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":208,"context_line":"            super(BGPVPNRouterAssociation, self).create()"},{"line_number":209,"context_line":"            self.obj_load_attr(\u0027hidden_network_associations\u0027)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def update(self):"},{"line_number":212,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":213,"context_line":"            if \u0027hidden_network_associations\u0027 in self.obj_what_changed():"},{"line_number":214,"context_line":"                self.obj_load_attr(\u0027hidden_network_associations\u0027)"},{"line_number":215,"context_line":"            super(BGPVPNRouterAssociation, self).update()"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":218,"context_line":"        if attrname \u003d\u003d \u0027hidden_network_associations\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_4b862fde","line":215,"range":{"start_line":206,"start_character":0,"end_line":215,"end_character":57},"updated":"2017-09-01 13:08:43.000000000","message":"(same question as for the two other objects)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def get_objects(cls, context, _pager\u003dNone, validate_filters\u003dTrue,"},{"line_number":224,"context_line":"                    **kwargs):"},{"line_number":225,"context_line":"        if \u0027network_id\u0027 in kwargs:"},{"line_number":226,"context_line":"            network_id \u003d kwargs.pop(\u0027network_id\u0027)"},{"line_number":227,"context_line":"            router_assocs \u003d super(BGPVPNRouterAssociation, cls).get_objects("},{"line_number":228,"context_line":"                context, _pager\u003d_pager, validate_filters\u003dvalidate_filters,"},{"line_number":229,"context_line":"                **kwargs)"},{"line_number":230,"context_line":"            router_assocs \u003d cls.filter_bgpvpn_routers_by_network_id("},{"line_number":231,"context_line":"                router_assocs, network_id)"},{"line_number":232,"context_line":"            return router_assocs"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        return super(BGPVPNRouterAssociation, cls).get_objects("},{"line_number":235,"context_line":"            context, _pager\u003d_pager, validate_filters\u003dvalidate_filters,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_0b2027b0","line":232,"range":{"start_line":226,"start_character":0,"end_line":232,"end_character":32},"updated":"2017-09-01 13:08:43.000000000","message":"I think this is very inefficient: on a deployment with a total 1000 Router Associations, this method will look at all of them, even if our network is not connected to any Router.  \n\nI believe that starting from the network, finding which are the routers connected to it, and then finding if there are RouterAssociations for these routers, would be much more efficient.","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        setattr(self, \u0027hidden_network_associations\u0027, network_associations)"},{"line_number":255,"context_line":"        self.obj_reset_changes([\u0027hidden_network_associations\u0027])"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def _get_subnets_info(self, obj_context, port):"},{"line_number":258,"context_line":"        subnets \u003d Subnet.get_objects(obj_context,"},{"line_number":259,"context_line":"                                     network_id\u003dport.network_id)"},{"line_number":260,"context_line":"        subnets_info \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_6be8cb7b","line":257,"range":{"start_line":257,"start_character":0,"end_line":257,"end_character":51},"updated":"2017-09-01 13:08:43.000000000","message":"This function needs to move out of the class to be reused at lines L151-L161 to avoid code duplication.","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        setattr(self, \u0027hidden_network_associations\u0027, network_associations)"},{"line_number":255,"context_line":"        self.obj_reset_changes([\u0027hidden_network_associations\u0027])"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def _get_subnets_info(self, obj_context, port):"},{"line_number":258,"context_line":"        subnets \u003d Subnet.get_objects(obj_context,"},{"line_number":259,"context_line":"                                     network_id\u003dport.network_id)"},{"line_number":260,"context_line":"        subnets_info \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_7d5d5477","line":257,"range":{"start_line":257,"start_character":0,"end_line":257,"end_character":51},"in_reply_to":"7f287b81_6be8cb7b","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self._load_hidden_network_associations(obj)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    @classmethod"},{"line_number":274,"context_line":"    def filter_bgpvpn_routers_by_network_id(self,"},{"line_number":275,"context_line":"                                            router_associations,"},{"line_number":276,"context_line":"                                            net_id):"},{"line_number":277,"context_line":"        router_associations_filtered \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_6b9d6b09","line":274,"range":{"start_line":274,"start_character":8,"end_line":274,"end_character":43},"updated":"2017-09-01 13:08:43.000000000","message":"filter_router_assoc_by_network would be a better name, no ?\n\n(but, as said above, I think this approach is not very efficient)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"78e299d9aa69e2577141ed6071e9b5b2c7adfeee","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self._load_hidden_network_associations(obj)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    @classmethod"},{"line_number":274,"context_line":"    def filter_bgpvpn_routers_by_network_id(self,"},{"line_number":275,"context_line":"                                            router_associations,"},{"line_number":276,"context_line":"                                            net_id):"},{"line_number":277,"context_line":"        router_associations_filtered \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_5d8bb8c1","line":274,"range":{"start_line":274,"start_character":8,"end_line":274,"end_character":43},"in_reply_to":"7f287b81_6b9d6b09","updated":"2017-12-18 15:43:41.000000000","message":"Done","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"fa6e45061ca492346923b89d9963a519bc1c7efa","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                            net_id):"},{"line_number":277,"context_line":"        router_associations_filtered \u003d []"},{"line_number":278,"context_line":"        for router_association in router_associations:"},{"line_number":279,"context_line":"            for network_association in router_association.\\"},{"line_number":280,"context_line":"                hidden_network_associations:"},{"line_number":281,"context_line":"                if net_id in network_association[\u0027network_id\u0027]:"},{"line_number":282,"context_line":"                    router_associations_filtered.append(router_association)"},{"line_number":283,"context_line":"        return router_associations_filtered"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_abbc736c","line":280,"range":{"start_line":279,"start_character":39,"end_line":280,"end_character":44},"updated":"2017-09-01 13:08:43.000000000","message":"use parenthesis to avoid an ugly backslash :)","commit_id":"2c959344f6f8cfdda736ee22b550b33bb576da6a"}]}
