)]}'
{"networking_bagpipe/agent/bagpipe_bgp_agent.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"                    service_vpn_info \u003d service_info[vpn_type]"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"                    if \u0027vpn_instance_id\u0027 in service_vpn_info:"},{"line_number":272,"context_line":"                        attach_info[\u0027vpn_instance_id\u0027] \u003d ("},{"line_number":273,"context_line":"                            service_vpn_info[\u0027vpn_instance_id\u0027]"},{"line_number":274,"context_line":"                        )"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"                    if vpn_type not in attach_info:"},{"line_number":277,"context_line":"                        attach_info.update(dict(vpn_type\u003dvpn_type))"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_019214a0","line":274,"range":{"start_line":271,"start_character":0,"end_line":274,"end_character":25},"updated":"2017-12-15 16:45:22.000000000","message":"can a comment be added to explain why we need that ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"}],"networking_bagpipe/agent/sfc/agent_extension.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ce4c09c855afcb30b83c55c4e8d5ba7ac4ecc829","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.bagpipe_bgp_agent.register_port_list(SFC_SERVICE,"},{"line_number":71,"context_line":"                                                  self.ports)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        self._setup_rpc(connection)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _setup_rpc(self, connection):"},{"line_number":76,"context_line":"        self._pull_rpc \u003d resources_rpc.ResourcesPullRpcApi()"},{"line_number":77,"context_line":"        self._register_rpc_consumers(connection)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_c3efaaae","line":75,"range":{"start_line":73,"start_character":0,"end_line":75,"end_character":37},"updated":"2018-01-25 19:46:30.000000000","message":"not needed","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        mac_address \u003d port[\u0027mac_address\u0027]"},{"line_number":345,"context_line":"        port_info.set_ip_mac_infos(ip_address, mac_address)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        port_hops \u003d self._pull_rpc.pull(context,"},{"line_number":348,"context_line":"                                        chain_hop.BaGPipePortHops.obj_name(),"},{"line_number":349,"context_line":"                                        port_id)"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_1d0e53e5","line":347,"range":{"start_line":347,"start_character":35,"end_line":347,"end_character":39},"updated":"2018-01-24 16:48:56.000000000","message":"use bulk_pull to avoid the need to register a \u0027provide\u0027 on on neutron server side","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"}],"networking_bagpipe/db/migration/alembic_migrations/versions/pike/expand/d2c2dcb6c2d4_defining_sfc_data_model.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    op.create_table("},{"line_number":35,"context_line":"        \u0027sfc_bagpipe_ppg_rtnn_associations\u0027,"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":37,"context_line":"        sa.Column(\u0027ppg_id\u0027, sa.String(length\u003d36),  nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027rtnn\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027is_redirect\u0027, sa.Boolean(), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027reverse\u0027, sa.Boolean(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_01d77451","line":37,"range":{"start_line":37,"start_character":19,"end_line":37,"end_character":25},"updated":"2017-12-15 16:45:22.000000000","message":"Shouldn\u0027t this be a foreign key ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        sa.Column(\u0027egress_ppg\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":56,"context_line":"        sa.Column(\u0027ingress_network\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":57,"context_line":"        sa.Column(\u0027egress_network\u0027, sa.String(length\u003d36), nullable\u003dTrue),"},{"line_number":58,"context_line":"        sa.Column(\u0027readv_from_rts\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":59,"context_line":"        sa.Column(\u0027readv_to_rts\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":60,"context_line":"        sa.Column(\u0027attract_to_rts\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":61,"context_line":"        sa.Column(\u0027redirect_rts\u0027, sa.String(length\u003d255), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_81d4e448","line":58,"range":{"start_line":58,"start_character":19,"end_line":58,"end_character":33},"updated":"2017-12-15 16:45:22.000000000","message":"Making all the rt fields singular ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"}],"networking_bagpipe/db/sfc/sfc_db.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from oslo_log import helpers as log_helpers"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"AS_NUMBER \u003d 64512"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaGPipePpgRTAssoc(model_base.BASEV2, model_base.HasId):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_618e8028","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":17},"updated":"2017-12-15 16:45:22.000000000","message":"This needs to be configurable from the config file.","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from oslo_log import helpers as log_helpers"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"AS_NUMBER \u003d 64512"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaGPipePpgRTAssoc(model_base.BASEV2, model_base.HasId):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_88b1a4e4","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":17},"in_reply_to":"df87a7cf_618e8028","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaGPipePpgRTAssoc(model_base.BASEV2, model_base.HasId):"},{"line_number":30,"context_line":"    \u0027\u0027\u0027Port Pair Group route target network number associations \u0027\u0027\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    __tablename__ \u003d \u0027sfc_bagpipe_ppg_rtnn_associations\u0027"},{"line_number":33,"context_line":"    ppg_id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_a16c889c","line":30,"range":{"start_line":30,"start_character":23,"end_line":30,"end_character":50},"updated":"2017-12-15 16:45:22.000000000","message":"What is a \"route target network number\" ?\n\n(\"Mapping from Port Pair Group to the NN part of an AS:NN route target\" ?)","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaGPipePpgRTAssoc(model_base.BASEV2, model_base.HasId):"},{"line_number":30,"context_line":"    \u0027\u0027\u0027Port Pair Group route target network number associations \u0027\u0027\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    __tablename__ \u003d \u0027sfc_bagpipe_ppg_rtnn_associations\u0027"},{"line_number":33,"context_line":"    ppg_id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_48cb9c52","line":30,"range":{"start_line":30,"start_character":23,"end_line":30,"end_character":50},"in_reply_to":"df87a7cf_a16c889c","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    is_redirect \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":36,"context_line":"    reverse \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, ppg_id, rtnn, is_redirect, reverse):"},{"line_number":39,"context_line":"        self.ppg_id \u003d ppg_id"},{"line_number":40,"context_line":"        self.rtnn \u003d rtnn"},{"line_number":41,"context_line":"        self.is_redirect \u003d is_redirect"},{"line_number":42,"context_line":"        self.reverse \u003d reverse"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def singleton(class_):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_01f3f4e8","line":42,"range":{"start_line":38,"start_character":0,"end_line":42,"end_character":30},"updated":"2017-12-15 16:45:22.000000000","message":"sqlalchemy don\u0027t usually need that, do they ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    is_redirect \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":36,"context_line":"    reverse \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, ppg_id, rtnn, is_redirect, reverse):"},{"line_number":39,"context_line":"        self.ppg_id \u003d ppg_id"},{"line_number":40,"context_line":"        self.rtnn \u003d rtnn"},{"line_number":41,"context_line":"        self.is_redirect \u003d is_redirect"},{"line_number":42,"context_line":"        self.reverse \u003d reverse"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def singleton(class_):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_4894fc44","line":42,"range":{"start_line":38,"start_character":0,"end_line":42,"end_character":30},"in_reply_to":"df87a7cf_01f3f4e8","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        start, end \u003d self.conf_obj[\u0027rtnn\u0027][0], self.conf_obj[\u0027rtnn\u0027][1] + 1"},{"line_number":76,"context_line":"        for rtnn in six.moves.range(start, end):"},{"line_number":77,"context_line":"            if rtnn not in allocated_rtnns:"},{"line_number":78,"context_line":"                with self.session.begin(subtransactions\u003dTrue):"},{"line_number":79,"context_line":"                    ppg_rtnn \u003d BaGPipePpgRTAssoc("},{"line_number":80,"context_line":"                        ppg_id, rtnn, is_redirect, reverse)"},{"line_number":81,"context_line":"                    self.session.add(ppg_rtnn)"},{"line_number":82,"context_line":"                return self._get_rt_from_rtnn(rtnn)"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_61a0c0a6","line":81,"range":{"start_line":78,"start_character":0,"end_line":81,"end_character":46},"updated":"2017-12-15 16:45:22.000000000","message":"I\u0027m guessing that if two workers race to allocate, they may try to allocate the same value, and one them will fail at .add(ppg_rtnn) . I think we need to add some form of retry logic (or perhaps there is even a better solution to this type of issue).","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    self.session.add(ppg_rtnn)"},{"line_number":82,"context_line":"                return self._get_rt_from_rtnn(rtnn)"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return None"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @log_helpers.log_method_call"},{"line_number":87,"context_line":"    def get_rts_by_ppg(self, ppg_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_e1e5b00b","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":23},"updated":"2017-12-15 16:45:22.000000000","message":"Need to log an error here !","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    self.session.add(ppg_rtnn)"},{"line_number":82,"context_line":"                return self._get_rt_from_rtnn(rtnn)"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return None"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @log_helpers.log_method_call"},{"line_number":87,"context_line":"    def get_rts_by_ppg(self, ppg_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_8883e404","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":23},"in_reply_to":"df87a7cf_e1e5b00b","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                BaGPipePpgRTAssoc).filter_by(rtnn\u003drtnn).first()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"            if ppg_rtnn:"},{"line_number":112,"context_line":"                self.session.delete(ppg_rtnn)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class BaGPipeChainHop(model_base.BASEV2, model_base.HasId,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_c198ac76","line":112,"updated":"2017-12-15 16:45:22.000000000","message":"else ? \n(log a warning ?)","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                BaGPipePpgRTAssoc).filter_by(rtnn\u003drtnn).first()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"            if ppg_rtnn:"},{"line_number":112,"context_line":"                self.session.delete(ppg_rtnn)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class BaGPipeChainHop(model_base.BASEV2, model_base.HasId,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f93b717_c8b7acd8","line":112,"in_reply_to":"df87a7cf_c198ac76","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    is_redirect \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":39,"context_line":"    reverse \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, ppg_id, rtnn, is_redirect, reverse):"},{"line_number":42,"context_line":"        self.ppg_id \u003d ppg_id"},{"line_number":43,"context_line":"        self.rtnn \u003d rtnn"},{"line_number":44,"context_line":"        self.is_redirect \u003d is_redirect"},{"line_number":45,"context_line":"        self.reverse \u003d reverse"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def singleton(class_):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_7d88b770","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":30},"updated":"2018-01-24 16:48:56.000000000","message":"not needed, use kwargs at line  82","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    is_redirect \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":39,"context_line":"    reverse \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, ppg_id, rtnn, is_redirect, reverse):"},{"line_number":42,"context_line":"        self.ppg_id \u003d ppg_id"},{"line_number":43,"context_line":"        self.rtnn \u003d rtnn"},{"line_number":44,"context_line":"        self.is_redirect \u003d is_redirect"},{"line_number":45,"context_line":"        self.reverse \u003d reverse"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def singleton(class_):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_37a9d57a","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":30},"in_reply_to":"5f93b717_7d88b770","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"}],"networking_bagpipe/driver/sfc/sfc.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        return (ip_address, mask)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_subnet_by_port(self, port_id):"},{"line_number":86,"context_line":"        core_plugin \u003d directory.get_plugin()"},{"line_number":87,"context_line":"        port \u003d core_plugin.get_port(self.admin_context, port_id)"},{"line_number":88,"context_line":"        subnet \u003d None"},{"line_number":89,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_bc44af48","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":44},"updated":"2017-12-15 16:45:22.000000000","message":"do a \"self.core_plugin \u003d ...\"  in __init__ and reuse it elsewhere ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":90,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":91,"context_line":"                                            ip[\"subnet_id\"])"},{"line_number":92,"context_line":"            # currently only support one subnet for a port"},{"line_number":93,"context_line":"            break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        return subnet"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3ca73f0e","line":92,"range":{"start_line":92,"start_character":0,"end_line":92,"end_character":58},"updated":"2017-12-15 16:45:22.000000000","message":"we should take the first IPv4 subnet","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        for subnet_id in subnets:"},{"line_number":136,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context, subnet_id)"},{"line_number":137,"context_line":"            subnet_gw[subnet_id] \u003d subnet[\u0027gateway_ip\u0027]"},{"line_number":138,"context_line":"            # currently only support one subnet for a port"},{"line_number":139,"context_line":"            break"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return subnet_gw"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_dc965395","line":138,"range":{"start_line":138,"start_character":0,"end_line":138,"end_character":58},"updated":"2017-12-15 16:45:22.000000000","message":"should take the firs *IPv4* subnet","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        Depends on BGP VPN service plugin activation."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        bgpvpns \u003d []"},{"line_number":149,"context_line":"        if not network_id:"},{"line_number":150,"context_line":"            return bgpvpns"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        bgpvpn_plugin \u003d ("},{"line_number":153,"context_line":"            directory.get_plugin(bgpvpn_def.LABEL)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_7cd4e747","line":150,"range":{"start_line":149,"start_character":0,"end_line":150,"end_character":26},"updated":"2017-12-15 16:45:22.000000000","message":"Surprising: why do we do that ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":238,"context_line":"                )"},{"line_number":239,"context_line":"                if fc[side + \u0027_ip_prefix\u0027] is None:"},{"line_number":240,"context_line":"                    ips \u003d port[\u0027fixed_ips\u0027]"},{"line_number":241,"context_line":"                    # For now, only handle when the port has a single IP"},{"line_number":242,"context_line":"                    if len(ips) \u003d\u003d 1:"},{"line_number":243,"context_line":"                        classifier[flow_side + \u0027Prefix\u0027] \u003d ("},{"line_number":244,"context_line":"                            ips[0][\u0027ip_address\u0027] + \u0027/32\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_dcc41395","line":241,"range":{"start_line":241,"start_character":35,"end_line":241,"end_character":36},"updated":"2017-12-15 16:45:22.000000000","message":"Taking the first IPv4 address would be better here.","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":42,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"@log_helpers.log_method_call"},{"line_number":46,"context_line":"def _get_chain_hops_by_port(resource, port_id, **kwargs):"},{"line_number":47,"context_line":"    context \u003d kwargs.get(\u0027context\u0027)"},{"line_number":48,"context_line":"    if context is None:"},{"line_number":49,"context_line":"        LOG.warning("},{"line_number":50,"context_line":"            \u0027Received pull for %(resource)s %(port_id)s without context\u0027,"},{"line_number":51,"context_line":"            {\u0027resource\u0027: resource, \u0027port_id\u0027: port_id})"},{"line_number":52,"context_line":"        return"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    return sfc_object.BaGPipePortHops.get_object(context,"},{"line_number":55,"context_line":"                                                 port_id\u003dport_id)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class BaGPipeSfcDriver(driver_base.SfcDriverBase,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_9d0103b3","line":55,"range":{"start_line":45,"start_character":0,"end_line":55,"end_character":65},"updated":"2018-01-24 16:48:56.000000000","message":"not needed if we use bulk_pull on agent side\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def _setup_rpc(self):"},{"line_number":68,"context_line":"        self._push_rpc \u003d resources_rpc.ResourcesPushRpcApi()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        rpc_registry.provide(_get_chain_hops_by_port,"},{"line_number":71,"context_line":"                             sfc_object.BaGPipePortHops.obj_name())"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _parse_ipaddress_prefix(self, cidr):"},{"line_number":74,"context_line":"        ip_address \u003d \"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_5d2dbb44","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":67},"updated":"2018-01-24 16:48:56.000000000","message":"see above","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             sfc_object.BaGPipePortHops.obj_name())"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _parse_ipaddress_prefix(self, cidr):"},{"line_number":74,"context_line":"        ip_address \u003d \"\""},{"line_number":75,"context_line":"        mask \u003d 0"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            net \u003d IPNetwork(cidr)"},{"line_number":78,"context_line":"            (ip_address, mask) \u003d (str(net.ip), net.prefixlen)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_7dc0b751","line":75,"range":{"start_line":74,"start_character":0,"end_line":75,"end_character":16},"updated":"2018-01-24 16:48:56.000000000","message":"not needed","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             sfc_object.BaGPipePortHops.obj_name())"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _parse_ipaddress_prefix(self, cidr):"},{"line_number":74,"context_line":"        ip_address \u003d \"\""},{"line_number":75,"context_line":"        mask \u003d 0"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            net \u003d IPNetwork(cidr)"},{"line_number":78,"context_line":"            (ip_address, mask) \u003d (str(net.ip), net.prefixlen)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_7700bd35","line":75,"range":{"start_line":74,"start_character":0,"end_line":75,"end_character":16},"in_reply_to":"5f93b717_7dc0b751","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        mask \u003d 0"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            net \u003d IPNetwork(cidr)"},{"line_number":78,"context_line":"            (ip_address, mask) \u003d (str(net.ip), net.prefixlen)"},{"line_number":79,"context_line":"        except AddrFormatError:"},{"line_number":80,"context_line":"            raise exc.SfcDriverError(message\u003d("},{"line_number":81,"context_line":"                \"Malformed IP prefix: %s\" % cidr))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_7dd75725","line":78,"range":{"start_line":78,"start_character":12,"end_line":78,"end_character":32},"updated":"2018-01-24 16:48:56.000000000","message":"you can return here without allocating ip_address nor mask","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        mask \u003d 0"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            net \u003d IPNetwork(cidr)"},{"line_number":78,"context_line":"            (ip_address, mask) \u003d (str(net.ip), net.prefixlen)"},{"line_number":79,"context_line":"        except AddrFormatError:"},{"line_number":80,"context_line":"            raise exc.SfcDriverError(message\u003d("},{"line_number":81,"context_line":"                \"Malformed IP prefix: %s\" % cidr))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_37fa3542","line":78,"range":{"start_line":78,"start_character":12,"end_line":78,"end_character":32},"in_reply_to":"5f93b717_7dd75725","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        port \u003d core_plugin.get_port(self.admin_context, port_id)"},{"line_number":88,"context_line":"        subnet \u003d None"},{"line_number":89,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":90,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":91,"context_line":"                                            ip[\"subnet_id\"])"},{"line_number":92,"context_line":"            # currently only support one subnet for a port"},{"line_number":93,"context_line":"            break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_bd9abf6b","line":90,"updated":"2018-01-24 16:48:56.000000000","message":"add:\n\n  if subnet[\u0027ip_version\u0027] \u003d\u003d 4:\n\n(will help if the first subnet returned if the v6 subnet...)\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        port \u003d core_plugin.get_port(self.admin_context, port_id)"},{"line_number":88,"context_line":"        subnet \u003d None"},{"line_number":89,"context_line":"        for ip in port[\u0027fixed_ips\u0027]:"},{"line_number":90,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":91,"context_line":"                                            ip[\"subnet_id\"])"},{"line_number":92,"context_line":"            # currently only support one subnet for a port"},{"line_number":93,"context_line":"            break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_d79431eb","line":90,"in_reply_to":"5f93b717_bd9abf6b","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            )"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            for fixed_ip in port[0][\u0027fixed_ips\u0027]:"},{"line_number":109,"context_line":"                subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":110,"context_line":"                                                fixed_ip[\"subnet_id\"])"},{"line_number":111,"context_line":"                # currently only support one subnet for a port"},{"line_number":112,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_1d34134a","line":109,"updated":"2018-01-24 16:48:56.000000000","message":"add:\n\n  if subnet[\u0027ip_version\u0027] \u003d\u003d 4:\n\n(will help if the first subnet returned if the v6 subnet...)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            )"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            for fixed_ip in port[0][\u0027fixed_ips\u0027]:"},{"line_number":109,"context_line":"                subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":110,"context_line":"                                                fixed_ip[\"subnet_id\"])"},{"line_number":111,"context_line":"                # currently only support one subnet for a port"},{"line_number":112,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_179299f7","line":109,"in_reply_to":"5f93b717_1d34134a","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ce4c09c855afcb30b83c55c4e8d5ba7ac4ecc829","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            )"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            for fixed_ip in port[0][\u0027fixed_ips\u0027]:"},{"line_number":109,"context_line":"                subnet \u003d core_plugin.get_subnet(self.admin_context,"},{"line_number":110,"context_line":"                                                fixed_ip[\"subnet_id\"])"},{"line_number":111,"context_line":"                # currently only support one subnet for a port"},{"line_number":112,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_97d0e9cb","line":109,"in_reply_to":"5f93b717_1d34134a","updated":"2018-01-25 19:46:30.000000000","message":"The above comment is not relevant for this method.","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        subnet_gw \u003d {}"},{"line_number":135,"context_line":"        for subnet_id in subnets:"},{"line_number":136,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context, subnet_id)"},{"line_number":137,"context_line":"            subnet_gw[subnet_id] \u003d subnet[\u0027gateway_ip\u0027]"},{"line_number":138,"context_line":"            # currently only support one subnet for a port"},{"line_number":139,"context_line":"            break"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_5d137bb9","line":136,"updated":"2018-01-24 16:48:56.000000000","message":"add:\n\n  if subnet[\u0027ip_version\u0027] \u003d\u003d 4:\n\n(will help if the first subnet returned if the v6 subnet...)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        return [port[\u0027id\u0027] for port in ports]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _get_subnet_gw_by_port(self, port_id):"},{"line_number":127,"context_line":"        subnet \u003d self._get_subnet_by_port(port_id)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        return subnet[\u0027gateway_ip\u0027]"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _get_subnet_gw(self, subnets):"},{"line_number":132,"context_line":"        core_plugin \u003d directory.get_plugin()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        subnet_gw \u003d {}"},{"line_number":135,"context_line":"        for subnet_id in subnets:"},{"line_number":136,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context, subnet_id)"},{"line_number":137,"context_line":"            subnet_gw[subnet_id] \u003d subnet[\u0027gateway_ip\u0027]"},{"line_number":138,"context_line":"            # currently only support one subnet for a port"},{"line_number":139,"context_line":"            break"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return subnet_gw"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _get_bgpvpns_by_network(self, context, network_id):"},{"line_number":144,"context_line":"        \"\"\"Retrieve BGP VPNs associated to network."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_575fc140","line":141,"range":{"start_line":126,"start_character":0,"end_line":141,"end_character":24},"updated":"2018-01-25 11:11:46.000000000","message":"Not used methods, must be removed","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        for subnet_id in subnets:"},{"line_number":136,"context_line":"            subnet \u003d core_plugin.get_subnet(self.admin_context, subnet_id)"},{"line_number":137,"context_line":"            subnet_gw[subnet_id] \u003d subnet[\u0027gateway_ip\u0027]"},{"line_number":138,"context_line":"            # currently only support one subnet for a port"},{"line_number":139,"context_line":"            break"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return subnet_gw"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _get_bgpvpns_by_network(self, context, network_id):"},{"line_number":144,"context_line":"        \"\"\"Retrieve BGP VPNs associated to network."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_7d7d17e6","line":141,"range":{"start_line":138,"start_character":12,"end_line":141,"end_character":24},"updated":"2018-01-24 16:48:56.000000000","message":"you can return at line 139\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            self.admin_context,"},{"line_number":161,"context_line":"            filters\u003ddict(tenant_id\u003d[context.current[\u0027tenant_id\u0027]]))"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if tenant_bgpvpns:"},{"line_number":164,"context_line":"            for bgpvpn in tenant_bgpvpns:"},{"line_number":165,"context_line":"                if network_id in bgpvpn[\u0027networks\u0027]:"},{"line_number":166,"context_line":"                    bgpvpns.append(bgpvpn)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        LOG.debug(\"BGPVPNs associated to network %s: %s\", (network_id,"},{"line_number":169,"context_line":"                                                           bgpvpns))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_bd4b9fae","line":166,"range":{"start_line":163,"start_character":0,"end_line":166,"end_character":42},"updated":"2018-01-24 16:48:56.000000000","message":"isn\u0027t this filtering doable with filters at line 161 ?\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                if network_id in bgpvpn[\u0027networks\u0027]:"},{"line_number":166,"context_line":"                    bgpvpns.append(bgpvpn)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        LOG.debug(\"BGPVPNs associated to network %s: %s\", (network_id,"},{"line_number":169,"context_line":"                                                           bgpvpns))"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        return bgpvpns"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_3dd54fba","line":169,"range":{"start_line":168,"start_character":58,"end_line":169,"end_character":67},"updated":"2018-01-24 16:48:56.000000000","message":"you don\u0027t need a tuple here:\n\n   LOG.debug(\"foo %s %s\", a, b)\n\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        core_plugin \u003d directory.get_plugin()"},{"line_number":175,"context_line":"        network \u003d core_plugin.get_network(self.admin_context, network_id)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        return \u0027:\u0027.join([str(sfc_db.AS_NUMBER),"},{"line_number":178,"context_line":"                         str(network[pnet.SEGMENTATION_ID])])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _get_bgpvpn_rts(self, bgpvpn_list):"},{"line_number":181,"context_line":"        import_rt \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_9d2d83aa","line":178,"range":{"start_line":177,"start_character":8,"end_line":178,"end_character":61},"updated":"2018-01-24 16:48:56.000000000","message":"* need to use conf file for AS (like RT allocator)\n* need to document that the rtnn range for RT allocator\n  has to be disjoint from vxlan segmentation is range","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                         str(network[pnet.SEGMENTATION_ID])])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _get_bgpvpn_rts(self, bgpvpn_list):"},{"line_number":181,"context_line":"        import_rt \u003d []"},{"line_number":182,"context_line":"        export_rt \u003d []"},{"line_number":183,"context_line":"        for bgpvpn in bgpvpn_list:"},{"line_number":184,"context_line":"            if \u0027route_targets\u0027 in bgpvpn:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_9daa6317","line":181,"range":{"start_line":181,"start_character":8,"end_line":181,"end_character":17},"updated":"2018-01-24 16:48:56.000000000","message":"import_rts, export_rts\n\n(use plural in variable names)\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                         str(network[pnet.SEGMENTATION_ID])])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _get_bgpvpn_rts(self, bgpvpn_list):"},{"line_number":181,"context_line":"        import_rt \u003d []"},{"line_number":182,"context_line":"        export_rt \u003d []"},{"line_number":183,"context_line":"        for bgpvpn in bgpvpn_list:"},{"line_number":184,"context_line":"            if \u0027route_targets\u0027 in bgpvpn:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_ca4c8478","line":181,"range":{"start_line":181,"start_character":8,"end_line":181,"end_character":17},"in_reply_to":"5f93b717_9daa6317","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    def _get_bgpvpn_rts(self, bgpvpn_list):"},{"line_number":181,"context_line":"        import_rt \u003d []"},{"line_number":182,"context_line":"        export_rt \u003d []"},{"line_number":183,"context_line":"        for bgpvpn in bgpvpn_list:"},{"line_number":184,"context_line":"            if \u0027route_targets\u0027 in bgpvpn:"},{"line_number":185,"context_line":"                import_rt +\u003d bgpvpn[\u0027route_targets\u0027]"},{"line_number":186,"context_line":"                export_rt +\u003d bgpvpn[\u0027route_targets\u0027]"},{"line_number":187,"context_line":"            if \u0027import_targets\u0027 in bgpvpn:"},{"line_number":188,"context_line":"                import_rt +\u003d bgpvpn[\u0027import_targets\u0027]"},{"line_number":189,"context_line":"            if \u0027export_targets\u0027 in bgpvpn:"},{"line_number":190,"context_line":"                import_rt +\u003d bgpvpn[\u0027export_targets\u0027]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        return (import_rt, export_rt)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_c0bb200c","line":190,"range":{"start_line":183,"start_character":0,"end_line":190,"end_character":53},"updated":"2018-01-24 16:48:56.000000000","message":"should use set() to avoid duplicates\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    def _get_bgpvpn_rts(self, bgpvpn_list):"},{"line_number":181,"context_line":"        import_rt \u003d []"},{"line_number":182,"context_line":"        export_rt \u003d []"},{"line_number":183,"context_line":"        for bgpvpn in bgpvpn_list:"},{"line_number":184,"context_line":"            if \u0027route_targets\u0027 in bgpvpn:"},{"line_number":185,"context_line":"                import_rt +\u003d bgpvpn[\u0027route_targets\u0027]"},{"line_number":186,"context_line":"                export_rt +\u003d bgpvpn[\u0027route_targets\u0027]"},{"line_number":187,"context_line":"            if \u0027import_targets\u0027 in bgpvpn:"},{"line_number":188,"context_line":"                import_rt +\u003d bgpvpn[\u0027import_targets\u0027]"},{"line_number":189,"context_line":"            if \u0027export_targets\u0027 in bgpvpn:"},{"line_number":190,"context_line":"                import_rt +\u003d bgpvpn[\u0027export_targets\u0027]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        return (import_rt, export_rt)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_4a407436","line":190,"range":{"start_line":183,"start_character":0,"end_line":190,"end_character":53},"in_reply_to":"5f93b717_c0bb200c","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            LOG.warning(\"Not found the flow classifier service plugin\")"},{"line_number":205,"context_line":"            return flow_classifiers"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        for fc_id in fc_ids:"},{"line_number":208,"context_line":"            fc \u003d fc_plugin.get_flow_classifier(self.admin_context, fc_id)"},{"line_number":209,"context_line":"            flow_classifiers.append(fc)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        return flow_classifiers"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _build_bagpipe_classifier_from_fc(self, fc, reverse, source_bgpvpns):"},{"line_number":214,"context_line":"        classifier \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_802c389a","line":211,"range":{"start_line":207,"start_character":0,"end_line":211,"end_character":31},"updated":"2018-01-24 16:48:56.000000000","message":"use a list comprehension ?\n\n  return [fc_plugin.get_flow_classifier(\n              self.admin_context, fc_id)\n          for fc_id in fc_ids]\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            LOG.warning(\"Not found the flow classifier service plugin\")"},{"line_number":205,"context_line":"            return flow_classifiers"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        for fc_id in fc_ids:"},{"line_number":208,"context_line":"            fc \u003d fc_plugin.get_flow_classifier(self.admin_context, fc_id)"},{"line_number":209,"context_line":"            flow_classifiers.append(fc)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        return flow_classifiers"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _build_bagpipe_classifier_from_fc(self, fc, reverse, source_bgpvpns):"},{"line_number":214,"context_line":"        classifier \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_8a7d1c70","line":211,"range":{"start_line":207,"start_character":0,"end_line":211,"end_character":31},"in_reply_to":"5f93b717_802c389a","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        - One Flow Classifier"},{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        if not port_chain[\u0027flow_classifiers\u0027]:"},{"line_number":286,"context_line":"            LOG.warning(\u0027Port Chain is inconsistent for BaGPipe, missing Flow \u0027"},{"line_number":287,"context_line":"                        \u0027Classifier\u0027)"},{"line_number":288,"context_line":"            return False"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        if not self._has_valid_port_pair_groups("},{"line_number":291,"context_line":"                context, port_chain[\u0027port_pair_groups\u0027]):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_03ab52d6","line":288,"range":{"start_line":286,"start_character":1,"end_line":288,"end_character":24},"updated":"2018-01-24 16:48:56.000000000","message":"also need to fail \u0026 warni for the case where there are more than one classifier","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        - One Flow Classifier"},{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        if not port_chain[\u0027flow_classifiers\u0027]:"},{"line_number":286,"context_line":"            LOG.warning(\u0027Port Chain is inconsistent for BaGPipe, missing Flow \u0027"},{"line_number":287,"context_line":"                        \u0027Classifier\u0027)"},{"line_number":288,"context_line":"            return False"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        if not self._has_valid_port_pair_groups("},{"line_number":291,"context_line":"                context, port_chain[\u0027port_pair_groups\u0027]):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_eaa5c0b6","line":288,"range":{"start_line":286,"start_character":1,"end_line":288,"end_character":24},"in_reply_to":"5f93b717_03ab52d6","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        return True"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def create_bagpipe_chain_hop_detail(self, context, project_id, chain_id,"},{"line_number":299,"context_line":"                                        rts, ingress_gw, egress_gw,"},{"line_number":300,"context_line":"                                        reverse_hop,"},{"line_number":301,"context_line":"                                        **optional):"},{"line_number":302,"context_line":"        \"\"\"Create BaGPipe Chain Hop detail as follow:"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        {"},{"line_number":305,"context_line":"            portchain_id: \u003cPORT_CHAIN_UUID\u003e,"},{"line_number":306,"context_line":"            rts: [\u003cASN:NN\u003e, ...],"},{"line_number":307,"context_line":"            ingress_gw: \u003cGATEWAY_IP\u003e,"},{"line_number":308,"context_line":"            egress_gw: \u003cGATEWAY_IP\u003e,"},{"line_number":309,"context_line":"            reverse_hop: \u003cBOOLEAN\u003e,"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            # Optional parameters"},{"line_number":312,"context_line":"            ingress_ppg: \u003cPORT_PAIR_GROUP_UUID\u003e,"},{"line_number":313,"context_line":"            egress_ppg: \u003cPORT_PAIR_GROUP_UUID\u003e,"},{"line_number":314,"context_line":"            ingress_network: \u003cNETWORK_UUID\u003e,"},{"line_number":315,"context_line":"            egress_network: \u003cNETWORK_UUID\u003e,"},{"line_number":316,"context_line":"            readv_from_rts: [\u003cASN:NN\u003e],"},{"line_number":317,"context_line":"            readv_to_rt: \u003cASN:NN\u003e,"},{"line_number":318,"context_line":"            attract_to_rt: \u003cASN:NN\u003e,"},{"line_number":319,"context_line":"            redirect_rts: [\u003cASN:NN\u003e],"},{"line_number":320,"context_line":"            classifiers: [\u003cFLOW_CLASSIFIER_UUID\u003e, ...]"},{"line_number":321,"context_line":"        }"},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        hop_detail \u003d {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":324,"context_line":"                      \u0027project_id\u0027: project_id,"},{"line_number":325,"context_line":"                      \u0027portchain_id\u0027: chain_id,"},{"line_number":326,"context_line":"                      \u0027rts\u0027: rts,"},{"line_number":327,"context_line":"                      \u0027ingress_gw\u0027: ingress_gw,"},{"line_number":328,"context_line":"                      \u0027egress_gw\u0027: egress_gw,"},{"line_number":329,"context_line":"                      \u0027reverse_hop\u0027: reverse_hop}"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        for key in (\u0027ingress_ppg\u0027, \u0027egress_ppg\u0027,"},{"line_number":332,"context_line":"                    \u0027ingress_network\u0027, \u0027egress_network\u0027,"},{"line_number":333,"context_line":"                    \u0027redirect_rts\u0027, \u0027readv_from_rts\u0027, \u0027readv_to_rt\u0027,"},{"line_number":334,"context_line":"                    \u0027attract_to_rt\u0027, \u0027classifiers\u0027):"},{"line_number":335,"context_line":"            if key in optional:"},{"line_number":336,"context_line":"                hop_detail.update({key: optional[key]})"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        hop_detail_obj \u003d sfc_object.BaGPipeChainHop(context,"},{"line_number":339,"context_line":"                                                    **hop_detail)"},{"line_number":340,"context_line":"        hop_detail_obj.create()"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        return hop_detail_obj"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    @log_helpers.log_method_call"},{"line_number":345,"context_line":"    def _create_portchain_hop_details(self, context, port_chain,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_009fc850","line":342,"range":{"start_line":298,"start_character":1,"end_line":342,"end_character":29},"updated":"2018-01-24 16:48:56.000000000","message":"this method does not seem useful, you can create sfc_object.BaGPipeChainHop directly in the places where this function is called\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        return True"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def create_bagpipe_chain_hop_detail(self, context, project_id, chain_id,"},{"line_number":299,"context_line":"                                        rts, ingress_gw, egress_gw,"},{"line_number":300,"context_line":"                                        reverse_hop,"},{"line_number":301,"context_line":"                                        **optional):"},{"line_number":302,"context_line":"        \"\"\"Create BaGPipe Chain Hop detail as follow:"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        {"},{"line_number":305,"context_line":"            portchain_id: \u003cPORT_CHAIN_UUID\u003e,"},{"line_number":306,"context_line":"            rts: [\u003cASN:NN\u003e, ...],"},{"line_number":307,"context_line":"            ingress_gw: \u003cGATEWAY_IP\u003e,"},{"line_number":308,"context_line":"            egress_gw: \u003cGATEWAY_IP\u003e,"},{"line_number":309,"context_line":"            reverse_hop: \u003cBOOLEAN\u003e,"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            # Optional parameters"},{"line_number":312,"context_line":"            ingress_ppg: \u003cPORT_PAIR_GROUP_UUID\u003e,"},{"line_number":313,"context_line":"            egress_ppg: \u003cPORT_PAIR_GROUP_UUID\u003e,"},{"line_number":314,"context_line":"            ingress_network: \u003cNETWORK_UUID\u003e,"},{"line_number":315,"context_line":"            egress_network: \u003cNETWORK_UUID\u003e,"},{"line_number":316,"context_line":"            readv_from_rts: [\u003cASN:NN\u003e],"},{"line_number":317,"context_line":"            readv_to_rt: \u003cASN:NN\u003e,"},{"line_number":318,"context_line":"            attract_to_rt: \u003cASN:NN\u003e,"},{"line_number":319,"context_line":"            redirect_rts: [\u003cASN:NN\u003e],"},{"line_number":320,"context_line":"            classifiers: [\u003cFLOW_CLASSIFIER_UUID\u003e, ...]"},{"line_number":321,"context_line":"        }"},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        hop_detail \u003d {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":324,"context_line":"                      \u0027project_id\u0027: project_id,"},{"line_number":325,"context_line":"                      \u0027portchain_id\u0027: chain_id,"},{"line_number":326,"context_line":"                      \u0027rts\u0027: rts,"},{"line_number":327,"context_line":"                      \u0027ingress_gw\u0027: ingress_gw,"},{"line_number":328,"context_line":"                      \u0027egress_gw\u0027: egress_gw,"},{"line_number":329,"context_line":"                      \u0027reverse_hop\u0027: reverse_hop}"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        for key in (\u0027ingress_ppg\u0027, \u0027egress_ppg\u0027,"},{"line_number":332,"context_line":"                    \u0027ingress_network\u0027, \u0027egress_network\u0027,"},{"line_number":333,"context_line":"                    \u0027redirect_rts\u0027, \u0027readv_from_rts\u0027, \u0027readv_to_rt\u0027,"},{"line_number":334,"context_line":"                    \u0027attract_to_rt\u0027, \u0027classifiers\u0027):"},{"line_number":335,"context_line":"            if key in optional:"},{"line_number":336,"context_line":"                hop_detail.update({key: optional[key]})"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        hop_detail_obj \u003d sfc_object.BaGPipeChainHop(context,"},{"line_number":339,"context_line":"                                                    **hop_detail)"},{"line_number":340,"context_line":"        hop_detail_obj.create()"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        return hop_detail_obj"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    @log_helpers.log_method_call"},{"line_number":345,"context_line":"    def _create_portchain_hop_details(self, context, port_chain,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_2aa8881d","line":342,"range":{"start_line":298,"start_character":1,"end_line":342,"end_character":29},"in_reply_to":"5f93b717_009fc850","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                    self._get_network_rt(dest_subnet[\u0027network_id\u0027])"},{"line_number":401,"context_line":"                )"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            ingress_bgpvpns \u003d dest_bgpvpns if reverse else src_bgpvpns"},{"line_number":404,"context_line":"            egress_bgpvpns \u003d src_bgpvpns if reverse else dest_bgpvpns"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"            classifiers.append("},{"line_number":407,"context_line":"                self._build_bagpipe_classifier_from_fc(fc, reverse,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_a0f29499","line":404,"range":{"start_line":403,"start_character":0,"end_line":404,"end_character":69},"updated":"2018-01-24 16:48:56.000000000","message":"could be written as:\n\n (a,b) \u003d (x,y) if reverse else (y,x)\n\n(can be covered later)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                    self._get_network_rt(dest_subnet[\u0027network_id\u0027])"},{"line_number":401,"context_line":"                )"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"            ingress_bgpvpns \u003d dest_bgpvpns if reverse else src_bgpvpns"},{"line_number":404,"context_line":"            egress_bgpvpns \u003d src_bgpvpns if reverse else dest_bgpvpns"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"            classifiers.append("},{"line_number":407,"context_line":"                self._build_bagpipe_classifier_from_fc(fc, reverse,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_2a740835","line":404,"range":{"start_line":403,"start_character":0,"end_line":404,"end_character":69},"in_reply_to":"5f93b717_a0f29499","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                                                       ingress_bgpvpns)"},{"line_number":409,"context_line":"            )"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"            # bagpipe-bgp only support one flow classifier for the moment"},{"line_number":412,"context_line":"            break"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # Iterate in reversed order to propagate default route from last"},{"line_number":415,"context_line":"        # ingress VRF"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_205be487","line":412,"range":{"start_line":411,"start_character":11,"end_line":412,"end_character":17},"updated":"2018-01-24 16:48:56.000000000","message":"should add a warning if more than one classifier was defined in the API","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                                                       ingress_bgpvpns)"},{"line_number":409,"context_line":"            )"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"            # bagpipe-bgp only support one flow classifier for the moment"},{"line_number":412,"context_line":"            break"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # Iterate in reversed order to propagate default route from last"},{"line_number":415,"context_line":"        # ingress VRF"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_8d08d628","line":412,"range":{"start_line":411,"start_character":11,"end_line":412,"end_character":17},"in_reply_to":"5f93b717_205be487","updated":"2018-01-25 11:11:46.000000000","message":"Done in _is_valid_port_chain method","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":411,"context_line":"            # bagpipe-bgp only support one flow classifier for the moment"},{"line_number":412,"context_line":"            break"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # Iterate in reversed order to propagate default route from last"},{"line_number":415,"context_line":"        # ingress VRF"},{"line_number":416,"context_line":"        reversed_ppg \u003d port_pair_groups[::-1] if reverse else port_pair_groups"},{"line_number":417,"context_line":"        reversed_ingress \u003d (constants.REVERSE_PORT_SIDE[constants.INGRESS]"},{"line_number":418,"context_line":"                            if reverse else constants.INGRESS)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_604b2c87","line":415,"range":{"start_line":414,"start_character":4,"end_line":415,"end_character":21},"updated":"2018-01-24 16:48:56.000000000","message":"move this comment three lines below","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":411,"context_line":"            # bagpipe-bgp only support one flow classifier for the moment"},{"line_number":412,"context_line":"            break"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        # Iterate in reversed order to propagate default route from last"},{"line_number":415,"context_line":"        # ingress VRF"},{"line_number":416,"context_line":"        reversed_ppg \u003d port_pair_groups[::-1] if reverse else port_pair_groups"},{"line_number":417,"context_line":"        reversed_ingress \u003d (constants.REVERSE_PORT_SIDE[constants.INGRESS]"},{"line_number":418,"context_line":"                            if reverse else constants.INGRESS)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_aa4a587d","line":415,"range":{"start_line":414,"start_character":4,"end_line":415,"end_character":21},"in_reply_to":"5f93b717_604b2c87","updated":"2018-01-25 11:11:46.000000000","message":"Done","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                last_ppg \u003d context._plugin._get_port_pair_group("},{"line_number":428,"context_line":"                    context._plugin_context, ppg_id)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"                last_eports \u003d self._get_ports_by_portpairs_side("},{"line_number":431,"context_line":"                    last_ppg[\u0027port_pairs\u0027], reversed_egress)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"                last_subnet \u003d self._get_subnet_by_port(last_eports[0])"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"                hop_details.append("},{"line_number":436,"context_line":"                    self.create_bagpipe_chain_hop_detail("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_e33f46b3","line":433,"range":{"start_line":430,"start_character":0,"end_line":433,"end_character":70},"updated":"2018-01-24 16:48:56.000000000","message":"we need to track an RFE bug, to later remove this restriction we have that all egress ports on a ppg need to be on the same network (same for ingress)","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        port_chain \u003d context.current"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"        if not self._is_valid_port_chain(context, port_chain):"},{"line_number":584,"context_line":"            return"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        self._create_portchain_hops(context, port_chain)"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_03e35207","line":584,"range":{"start_line":584,"start_character":4,"end_line":584,"end_character":18},"updated":"2018-01-24 16:48:56.000000000","message":"Ideally, when a port chain has an empty ppg, we should not fail the API and we should simply do nothing.\n\nWe need to add a LP bug to track this.","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":637,"context_line":"            LOG.error(\u0027BaGPipe driver not supporting Flow Classifiers update\u0027)"},{"line_number":638,"context_line":"            raise exc.SfcDriverError(method\u003d\u0027update_port_chain\u0027)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        # Delete and re-create BaGPipeChainHop objects (Better to update"},{"line_number":641,"context_line":"        # BaGPipeChainHop objects"},{"line_number":642,"context_line":"        if current[\u0027port_pair_groups\u0027] !\u003d original[\u0027port_pair_groups\u0027]:"},{"line_number":643,"context_line":"            self._delete_portchain_hops(context, current)"},{"line_number":644,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_83bc42bc","line":641,"range":{"start_line":640,"start_character":0,"end_line":641,"end_character":33},"updated":"2018-01-24 16:48:56.000000000","message":"need a LP bug to track this need for enhancement","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                    \u0027PortPairGroup %s %s ports must be on same network\u0027"},{"line_number":665,"context_line":"                    % (port_pair_group[\u0027id\u0027], side)))"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    @log_helpers.log_method_call"},{"line_number":668,"context_line":"    def create_port_pair_group(self, context):"},{"line_number":669,"context_line":"        pass"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    @log_helpers.log_method_call"},{"line_number":672,"context_line":"    def delete_port_pair_group(self, context):"},{"line_number":673,"context_line":"        pass"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"    @log_helpers.log_method_call"},{"line_number":676,"context_line":"    def update_port_pair_group(self, context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_830a0288","line":673,"range":{"start_line":667,"start_character":0,"end_line":673,"end_character":12},"updated":"2018-01-24 16:48:56.000000000","message":"not needed , I think","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                    \u0027PortPairGroup %s %s ports must be on same network\u0027"},{"line_number":665,"context_line":"                    % (port_pair_group[\u0027id\u0027], side)))"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    @log_helpers.log_method_call"},{"line_number":668,"context_line":"    def create_port_pair_group(self, context):"},{"line_number":669,"context_line":"        pass"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    @log_helpers.log_method_call"},{"line_number":672,"context_line":"    def delete_port_pair_group(self, context):"},{"line_number":673,"context_line":"        pass"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"    @log_helpers.log_method_call"},{"line_number":676,"context_line":"    def update_port_pair_group(self, context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_2a2ba894","line":673,"range":{"start_line":667,"start_character":0,"end_line":673,"end_character":12},"in_reply_to":"5f93b717_830a0288","updated":"2018-01-25 11:11:46.000000000","message":"Needed, because methods are abstract","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"d5154657eca0ee32a432234cc6595f191eb78a89","unresolved":false,"context_lines":[{"line_number":733,"context_line":"                self._push_rpc.push(context._plugin_context, port_objs,"},{"line_number":734,"context_line":"                                    rpc_events.DELETED)"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"    @log_helpers.log_method_call"},{"line_number":737,"context_line":"    def create_port_pair(self, context):"},{"line_number":738,"context_line":"        pass"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    @log_helpers.log_method_call"},{"line_number":741,"context_line":"    def update_port_pair(self, context):"},{"line_number":742,"context_line":"        pass"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    @log_helpers.log_method_call"},{"line_number":745,"context_line":"    def delete_port_pair(self, context):"},{"line_number":746,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_c3d6caf2","line":746,"range":{"start_line":736,"start_character":3,"end_line":746,"end_character":12},"updated":"2018-01-24 16:48:56.000000000","message":"not needed, I think","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"},{"author":{"_account_id":19990,"name":"Yannick Thomas","email":"ythomas1.ext@orange.com","username":"ythomas1"},"change_message_id":"f46415161caf8ebd4a354bcb0991c7b842fc1443","unresolved":false,"context_lines":[{"line_number":733,"context_line":"                self._push_rpc.push(context._plugin_context, port_objs,"},{"line_number":734,"context_line":"                                    rpc_events.DELETED)"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"    @log_helpers.log_method_call"},{"line_number":737,"context_line":"    def create_port_pair(self, context):"},{"line_number":738,"context_line":"        pass"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    @log_helpers.log_method_call"},{"line_number":741,"context_line":"    def update_port_pair(self, context):"},{"line_number":742,"context_line":"        pass"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    @log_helpers.log_method_call"},{"line_number":745,"context_line":"    def delete_port_pair(self, context):"},{"line_number":746,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f93b717_4a0dd43c","line":746,"range":{"start_line":736,"start_character":3,"end_line":746,"end_character":12},"in_reply_to":"5f93b717_c3d6caf2","updated":"2018-01-25 11:11:46.000000000","message":"Needed, because methods are abstract","commit_id":"3a92dd4c73aef85b8af8f559d0d1185e0cf3bc96"}],"networking_bagpipe/objects/sfc/chain_hop.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df87a7cf_14c40ff4","updated":"2017-12-15 16:45:22.000000000","message":"maybe we should rename the file or split it ?","commit_id":"f23ffee3eac9e5b0c4ce61d460fa4f0b679c1de0"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027egress_network\u0027: common_types.UUIDField(nullable\u003dTrue, default\u003dNone),"},{"line_number":51,"context_line":"        \u0027ingress_ports\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":52,"context_line":"        \u0027egress_ports\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027readv_from_rts\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":54,"context_line":"        \u0027readv_to_rts\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":55,"context_line":"        \u0027attract_to_rts\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027redirect_rts\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_2fc8da71","line":53,"range":{"start_line":53,"start_character":9,"end_line":53,"end_character":23},"updated":"2017-12-15 16:45:22.000000000","message":"As discussed, this should be made singular, and same for the other RT parameters.","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        if getattr(self, side + \u0027_ppg\u0027):"},{"line_number":85,"context_line":"            reverse_side \u003d sfc_const.REVERSE_PORT_SIDE[side]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            query \u003d self.obj_context.session.query(sfc_db.PortPair)"},{"line_number":88,"context_line":"            query \u003d query.filter("},{"line_number":89,"context_line":"                sfc_db.PortPair.portpairgroup_id \u003d\u003d"},{"line_number":90,"context_line":"                getattr(self, side + \u0027_ppg\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_c153cc38","line":87,"range":{"start_line":87,"start_character":0,"end_line":87,"end_character":67},"updated":"2017-12-15 16:45:22.000000000","message":"I think that the code would be nicer here without coding SQL queries in sqlalchemy, but rather relying on OVO objects.\n\n  getattr(pp, reverse_side) for\n  for pp in PortPair.get_objects(portpairgroup_id\u003dgetattr(self, side + \u0027_ppg\u0027)\n\nThis requires adding SFC OVO objects \u003d\u003e add an rfe bg to improve that later?\n\nIn the meantime, I think that perhaps we could use sfc_db.PortPair.get_collection(...) ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":209,"context_line":"        fields \u003d super(BaGPipeChainHop, cls).modify_fields_from_db(db_obj)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        for field in [\u0027rts\u0027,"},{"line_number":212,"context_line":"                      \u0027readv_from_rts\u0027,"},{"line_number":213,"context_line":"                      \u0027readv_to_rts\u0027,"},{"line_number":214,"context_line":"                      \u0027attract_to_rts\u0027,"},{"line_number":215,"context_line":"                      \u0027redirect_rts\u0027]:"},{"line_number":216,"context_line":"            if fields.get(field) is not None:"},{"line_number":217,"context_line":"                fields[field] \u003d fields[field].split(\u0027,\u0027)"},{"line_number":218,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_c1bf4ca8","line":215,"range":{"start_line":211,"start_character":21,"end_line":215,"end_character":37},"updated":"2017-12-15 16:45:22.000000000","message":"Store this in an RT_FIELDS constant ?","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                      \u0027readv_to_rts\u0027,"},{"line_number":214,"context_line":"                      \u0027attract_to_rts\u0027,"},{"line_number":215,"context_line":"                      \u0027redirect_rts\u0027]:"},{"line_number":216,"context_line":"            if fields.get(field) is not None:"},{"line_number":217,"context_line":"                fields[field] \u003d fields[field].split(\u0027,\u0027)"},{"line_number":218,"context_line":"            else:"},{"line_number":219,"context_line":"                fields[field] \u003d []"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        for gw_ip in [\u0027ingress_gw\u0027, \u0027egress_gw\u0027]:"},{"line_number":222,"context_line":"            if fields.get(gw_ip) is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_812dc4fe","line":219,"range":{"start_line":216,"start_character":0,"end_line":219,"end_character":34},"updated":"2017-12-15 16:45:22.000000000","message":"can be shortened into:\n\n  fields[field] \u003d fields[field].split(\u0027,\u0027) if fields[field] or []","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"dba45bc0f0ab753cd7f360b829a4ca685269baf3","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                      \u0027readv_to_rts\u0027,"},{"line_number":234,"context_line":"                      \u0027attract_to_rts\u0027,"},{"line_number":235,"context_line":"                      \u0027redirect_rts\u0027]:"},{"line_number":236,"context_line":"            if result.get(field) is not None:"},{"line_number":237,"context_line":"                result[field] \u003d \u0027,\u0027.join(result[field])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        for gw_ip in [\u0027ingress_gw\u0027, \u0027egress_gw\u0027]:"},{"line_number":240,"context_line":"            if result.get(gw_ip) is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_2134f849","line":237,"range":{"start_line":236,"start_character":0,"end_line":237,"end_character":55},"updated":"2017-12-15 16:45:22.000000000","message":"It think it makes sense to always fill result[field]:\n\n   result[field] \u003d \u0027,\u0027.join(result.get(field, []))","commit_id":"186cf38e75daa1a772894c2d62ed2ea595e24177"}]}
