)]}'
{"neutron/agent/l2/extensions/qos.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ef1c8e3a6043738e9166d59367b3cf69997f800c","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                         \"port %s that we were trying to reset\"),"},{"line_number":286,"context_line":"                     port[\u0027port_id\u0027])"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def preprocess_added_port(self, context, data):"},{"line_number":289,"context_line":"        pass"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def preprocess_removed_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_efec19f5","line":288,"updated":"2016-08-17 22:36:06.000000000","message":"smell!","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ef1c8e3a6043738e9166d59367b3cf69997f800c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def preprocess_added_port(self, context, data):"},{"line_number":289,"context_line":"        pass"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def preprocess_removed_port(self, context, data):"},{"line_number":292,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_2fc10155","line":291,"range":{"start_line":291,"start_character":16,"end_line":291,"end_character":17},"updated":"2016-08-17 22:36:06.000000000","message":"smell!","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"}],"neutron/agent/l2/extensions/trunk.py":[{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        that the parent port is UP."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":85,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":86,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_b18ff6cb","line":85,"updated":"2016-06-17 22:26:38.000000000","message":"I\u0027ve been operating under the assumption that the port will have \u0027trunk_details\u0027 from https://review.openstack.org/#/c/320092/ . Actually populating that field is still a TODO.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        that the parent port is UP."},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":85,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":86,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_71a4f456","line":85,"in_reply_to":"7aa08908_b18ff6cb","updated":"2016-06-20 13:36:14.000000000","message":"this is returned by get_device_details...I don\u0027t think we have found an agreement regarding how to expose that. Once we agree I will modify the code accordingly.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        LOG.info(_LI(\"Added trunk for port: %s\" % port[\u0027port_id\u0027]))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @staticmethod"},{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_316946f9","line":112,"updated":"2016-06-17 22:26:38.000000000","message":"this method will need to be shared with whatever code modifies a port\u0027s vif_details to specify the bridge to attach to.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        LOG.info(_LI(\"Added trunk for port: %s\" % port[\u0027port_id\u0027]))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @staticmethod"},{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_119490e0","line":112,"in_reply_to":"7aa08908_316946f9","updated":"2016-06-20 13:36:14.000000000","message":"right, I will add a TODO","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"04f6e3b1da4e7930a2790c42c5de6a4866553e15","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def _gen_trunk_patch_names(port_id):"},{"line_number":117,"context_line":"        return ("},{"line_number":118,"context_line":"            (TRUNK_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":119,"context_line":"            (TRUNK_DEV + \u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @staticmethod"},{"line_number":122,"context_line":"    def _gen_subport_patch_names(port_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_e671980d","line":119,"updated":"2016-06-24 21:17:02.000000000","message":"See comment on L125.  Suggestions:\n\n  tp-int-\u003ctrunk id\u003e-\u003cport id\u003e\n  tp-trunk-\u003cport id\u003e","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def _gen_trunk_patch_names(port_id):"},{"line_number":117,"context_line":"        return ("},{"line_number":118,"context_line":"            (TRUNK_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":119,"context_line":"            (TRUNK_DEV + \u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @staticmethod"},{"line_number":122,"context_line":"    def _gen_subport_patch_names(port_id):"},{"line_number":123,"context_line":"        return ("},{"line_number":124,"context_line":"            (SUBPORT_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":125,"context_line":"            (SUBPORT_DEV +\u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def update_port(self, context, port):"},{"line_number":128,"context_line":"        #TODO(rossella_s) implement"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_313786ff","line":125,"range":{"start_line":115,"start_character":0,"end_line":125,"end_character":80},"updated":"2016-06-17 22:26:38.000000000","message":"Patch ports don\u0027t have the same DEVICE_NAME_MAX_LEN restriction as linux kernel devices. The names could use the full port_id.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"12de4fa82332a1d1171b1bd76fb0d044a59bff07","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def _gen_trunk_patch_names(port_id):"},{"line_number":117,"context_line":"        return ("},{"line_number":118,"context_line":"            (TRUNK_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":119,"context_line":"            (TRUNK_DEV + \u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @staticmethod"},{"line_number":122,"context_line":"    def _gen_subport_patch_names(port_id):"},{"line_number":123,"context_line":"        return ("},{"line_number":124,"context_line":"            (SUBPORT_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":125,"context_line":"            (SUBPORT_DEV +\u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def update_port(self, context, port):"},{"line_number":128,"context_line":"        #TODO(rossella_s) implement"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_3f4d0673","line":125,"range":{"start_line":115,"start_character":0,"end_line":125,"end_character":80},"in_reply_to":"5a9d85d2_1107701d","updated":"2016-06-20 17:24:39.000000000","message":"yes, but is that such a bad thing?","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"04f6e3b1da4e7930a2790c42c5de6a4866553e15","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def _gen_trunk_patch_names(port_id):"},{"line_number":117,"context_line":"        return ("},{"line_number":118,"context_line":"            (TRUNK_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":119,"context_line":"            (TRUNK_DEV + \u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @staticmethod"},{"line_number":122,"context_line":"    def _gen_subport_patch_names(port_id):"},{"line_number":123,"context_line":"        return ("},{"line_number":124,"context_line":"            (SUBPORT_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":125,"context_line":"            (SUBPORT_DEV +\u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def update_port(self, context, port):"},{"line_number":128,"context_line":"        #TODO(rossella_s) implement"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_4677cc9f","line":125,"range":{"start_line":115,"start_character":0,"end_line":125,"end_character":80},"in_reply_to":"5a9d85d2_3f4d0673","updated":"2016-06-24 21:17:02.000000000","message":"It would be nice to use some extra length to make these names a little more friendly.  I think I\u0027d like to see the vlan id in the name of the subports.  And, on the br-int side, I\u0027d like to see maybe something indicating what trunk the port belongs to (either trunk or subport).  This would really help us maintain our sanity while we\u0027re trying to troubleshoot and follow the datapath.\n\nI wouldn\u0027t go totally crazy and put the full uuids in the names but maybe a truncated and unique substring of the full uuid.\n\n  sp-\u003cvlan id\u003e-int-\u003ctrunk id\u003e-\u003cport id\u003e  ???\n  sp-\u003cvlan id\u003e-trunk-\u003cport id\u003e\n\nWhere trunk id and port id are shortened to something like a dozen characters each.\n\nIt doesn\u0027t have to be this but I think embedding some of this data in the name would be nice, even if it means the name is quite a bit longer.  My $0.02.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _gen_trunk_br_name(trunk_port_id):"},{"line_number":113,"context_line":"        return (\u0027tbr-\u0027 + trunk_port_id)[:constants.DEVICE_NAME_MAX_LEN-1]"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def _gen_trunk_patch_names(port_id):"},{"line_number":117,"context_line":"        return ("},{"line_number":118,"context_line":"            (TRUNK_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":119,"context_line":"            (TRUNK_DEV + \u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @staticmethod"},{"line_number":122,"context_line":"    def _gen_subport_patch_names(port_id):"},{"line_number":123,"context_line":"        return ("},{"line_number":124,"context_line":"            (SUBPORT_DEV + \u0027-int-\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1],"},{"line_number":125,"context_line":"            (SUBPORT_DEV +\u0027-trunk\u0027 + port_id)[:constants.DEVICE_NAME_MAX_LEN-1])"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def update_port(self, context, port):"},{"line_number":128,"context_line":"        #TODO(rossella_s) implement"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_1107701d","line":125,"range":{"start_line":115,"start_character":0,"end_line":125,"end_character":80},"in_reply_to":"7aa08908_313786ff","updated":"2016-06-20 13:36:14.000000000","message":"right but that would be a very long name, wouldn\u0027t it?","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def delete_port(self, context, port):"},{"line_number":132,"context_line":"        #TODO(rossella_s) implement"},{"line_number":133,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_11136a66","line":132,"updated":"2016-06-17 22:26:38.000000000","message":"Here we will need to delete the trunk bridge as well. os-vif won\u0027t be responsible for that.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"12de4fa82332a1d1171b1bd76fb0d044a59bff07","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def delete_port(self, context, port):"},{"line_number":132,"context_line":"        #TODO(rossella_s) implement"},{"line_number":133,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_c40cf744","line":132,"in_reply_to":"5a9d85d2_3487fa62","updated":"2016-06-20 17:24:39.000000000","message":"A good place to hash that out would be in https://review.openstack.org/#/c/330818/ . Your feedback there would be greatly appreciated!\n\nSo far the same driver is used to plug vifs into br-int and into new trunk bridges. If the bridge doesn\u0027t exist, os-vif will create it. Currently we\u0027re deciding whether or not os-vif should be adding a special external_ids field to the bridge it creates so that the OVS agent knows which bridge to delete when a trunk port is deleted.\n\nIf os-vif should be responsible for deleting the bridge, then it will have to add metadata to the bridge so it knows to delete it only when os-vif needed to create it (so br-int doesn\u0027t get deleted).","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"50d927e8d7ccbf7b9fdd598bd172c32a62aea3a9","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def delete_port(self, context, port):"},{"line_number":132,"context_line":"        #TODO(rossella_s) implement"},{"line_number":133,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_f82a8fe6","line":132,"in_reply_to":"5a9d85d2_c40cf744","updated":"2016-06-21 23:17:19.000000000","message":"Getting symmetry might be tricky if we have os-vif create the bridge. Will we know whether we\u0027re dealing with a trunk bridge in os-vif? We don\u0027t want to be attempting to delete br-int, we only to nuke the trunk bridge. Maybe we need more iteration on https://review.openstack.org/#/c/330818/.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def delete_port(self, context, port):"},{"line_number":132,"context_line":"        #TODO(rossella_s) implement"},{"line_number":133,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_3487fa62","line":132,"in_reply_to":"7aa08908_11136a66","updated":"2016-06-20 13:36:14.000000000","message":"why not? let\u0027s see how that evolves, it would be better to have symmetry: who creates the bridge should delete it too","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a1078fb670df496939d31331dea7218f6b6f72c2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":87,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":88,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":89,"context_line":"            return"},{"line_number":90,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"},{"line_number":91,"context_line":"        trunk_br \u003d ovs_lib.OVSBridge(trunk_br_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_bb277ab4","line":88,"updated":"2016-07-01 12:26:24.000000000","message":"I think it\u0027s fair to include trunk_id in details, then you check it\u0027s not None and subscribe+pull the initial state of the trunk.","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"56ee49bf065def0038c467a2b1c0731e628a307b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":87,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":88,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":89,"context_line":"            return"},{"line_number":90,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"},{"line_number":91,"context_line":"        trunk_br \u003d ovs_lib.OVSBridge(trunk_br_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_9e714979","line":88,"in_reply_to":"1aa78d24_8d83ef03","updated":"2016-07-05 22:31:45.000000000","message":"See https://review.openstack.org/#/c/337896 as an example of what I\u0027m thinking","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a0c7c030bd0f339ecc763e318081b958fa06bf4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":87,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":88,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":89,"context_line":"            return"},{"line_number":90,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"},{"line_number":91,"context_line":"        trunk_br \u003d ovs_lib.OVSBridge(trunk_br_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_8d83ef03","line":88,"in_reply_to":"3aaa91ec_81efa8e8","updated":"2016-07-05 18:06:17.000000000","message":"Would it be wrong to simply include the trunk_details in the device_details to avoid the RPC round trip? That way we could simply look in the trunk_details and pull out all the information we need without needing to call back on the server. trunk_details would contain all the subport information we would need as well. IMO opinion this would be simpler and allows to proceed with more of a push model where only the initial port creation requires a call back to the server. Any subsequent changes could simply be pushed out to the agent ie subport added/removed (or even updated in the future).\n\nWe can make the change to include trunk_details when get_device_details in invoked. https://review.openstack.org/#/c/334700/ only exposes it through the API, I think just a little more work is needed to expose trunk_details on the RPC.","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"a29d415a0f45f1557fb0dce105b6afa1bafbf0ec","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        # TODO(rossella_s) do we assume that get_device_details will have this"},{"line_number":87,"context_line":"        # new entry to signal that the port is associated to a trunk?"},{"line_number":88,"context_line":"        if not port.get(\u0027is_trunk\u0027):"},{"line_number":89,"context_line":"            return"},{"line_number":90,"context_line":"        trunk_br_name \u003d self._gen_trunk_br_name(port[\u0027port_id\u0027])"},{"line_number":91,"context_line":"        trunk_br \u003d ovs_lib.OVSBridge(trunk_br_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_81efa8e8","line":88,"in_reply_to":"3aaa91ec_bb277ab4","updated":"2016-07-01 15:14:11.000000000","message":"From [1] a port will have a new \u0027trunk_details\u0027 field, from which you can tell a port is a trunk if it has port[\u0027trunk_details\u0027][\u0027sub_ports\u0027]. But, unless we updated the get_device_details RPC to also pass the port\u0027s trunk_details, we won\u0027t have access to them. Because of that I think it\u0027s fair to update the get_device_details RPC in addition to having new RPC calls dedicated to pulling/pushing trunk and subport data from the server.\n\n[1] https://review.openstack.org/#/c/334700/","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"}],"neutron/api/rpc/callbacks/resources.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8fa986b7dfabc986f10dcdd883675ab8be29cc46","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Supported types"},{"line_number":26,"context_line":"QOS_POLICY \u003d _QOS_POLICY_CLS.obj_name()"},{"line_number":27,"context_line":"TRUNK \u003d \u0027trunk\u0027"},{"line_number":28,"context_line":"SUBPORT \u003d \u0027subport\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_bb9c9ac0","line":27,"updated":"2016-07-01 12:28:03.000000000","message":"You should calculate the names the same way it\u0027s done for qos policy.","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8fa986b7dfabc986f10dcdd883675ab8be29cc46","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_TYPE_TO_CLS_MAP \u003d {"},{"line_number":32,"context_line":"    QOS_POLICY: _QOS_POLICY_CLS,"},{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOCAL_RESOURCE_VERSIONS \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_bb83fa54","line":32,"updated":"2016-07-01 12:28:03.000000000","message":"You need to update more places for rpc callbacks to work for you, like that one or line 19.","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"        cur_ancillary_ports |\u003d ancillary_port_info[\u0027current\u0027]"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"        def _process_port(port, ports, ancillary_ports):"},{"line_number":1292,"context_line":"            external_ids \u003d port.get(\u0027external_ids\u0027, [])"},{"line_number":1293,"context_line":"            if \u0027attached-mac\u0027 in external_ids:"},{"line_number":1294,"context_line":"                # check \u0027iface-id\u0027 is set otherwise is not a port"},{"line_number":1295,"context_line":"                # the agent should care about"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_11ac0a9e","line":1292,"range":{"start_line":1292,"start_character":52,"end_line":1292,"end_character":54},"updated":"2016-06-17 22:26:38.000000000","message":"nit: I think this should default to an empty dict to match the type of port[\u0027external_ids\u0027]","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"                # check \u0027iface-id\u0027 is set otherwise is not a port"},{"line_number":1295,"context_line":"                # the agent should care about"},{"line_number":1296,"context_line":"                iface_id \u003d self.int_br.portid_from_external_ids("},{"line_number":1297,"context_line":"                    external_ids)"},{"line_number":1298,"context_line":"                if iface_id:"},{"line_number":1299,"context_line":"                    if port[\u0027ofport\u0027] \u003d\u003d ovs_lib.UNASSIGNED_OFPORT:"},{"line_number":1300,"context_line":"                        LOG.debug(\"Port %s not ready yet on the bridge\","}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_3195c631","line":1297,"range":{"start_line":1297,"start_character":20,"end_line":1297,"end_character":33},"updated":"2016-06-17 22:26:38.000000000","message":"nit: this can be with the previous line","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"                # check \u0027iface-id\u0027 is set otherwise is not a port"},{"line_number":1295,"context_line":"                # the agent should care about"},{"line_number":1296,"context_line":"                iface_id \u003d self.int_br.portid_from_external_ids("},{"line_number":1297,"context_line":"                    external_ids)"},{"line_number":1298,"context_line":"                if iface_id:"},{"line_number":1299,"context_line":"                    if port[\u0027ofport\u0027] \u003d\u003d ovs_lib.UNASSIGNED_OFPORT:"},{"line_number":1300,"context_line":"                        LOG.debug(\"Port %s not ready yet on the bridge\","}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_14563ed2","line":1297,"range":{"start_line":1297,"start_character":20,"end_line":1297,"end_character":33},"in_reply_to":"7aa08908_3195c631","updated":"2016-06-20 13:36:14.000000000","message":"I will revert this changes.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f8fd7a98c9fe139dd4a41ecaeaaaab90a290c2e5","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        for details in devices:"},{"line_number":1505,"context_line":"            device \u003d details[\u0027device\u0027]"},{"line_number":1506,"context_line":"            LOG.debug(\"Processing port: %s\", device)"},{"line_number":1507,"context_line":"            self.ext_manager.handle_port(self.context, details)"},{"line_number":1508,"context_line":"            port \u003d vif_by_id.get(device)"},{"line_number":1509,"context_line":"            if not port:"},{"line_number":1510,"context_line":"                # The port disappeared and cannot be processed"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_d12f22f4","line":1507,"updated":"2016-06-17 22:26:38.000000000","message":"This is interesting; I never even thought about the possibility of changing how this hook was called. How much do we need to worry about this breaking anything?\n\nI.e. when a QoS policy is applied on the port, it will be applied on the trunk bridge\u0027s port rather than br-int. That example is probably ok, but would there be anything else?","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"12de4fa82332a1d1171b1bd76fb0d044a59bff07","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        for details in devices:"},{"line_number":1505,"context_line":"            device \u003d details[\u0027device\u0027]"},{"line_number":1506,"context_line":"            LOG.debug(\"Processing port: %s\", device)"},{"line_number":1507,"context_line":"            self.ext_manager.handle_port(self.context, details)"},{"line_number":1508,"context_line":"            port \u003d vif_by_id.get(device)"},{"line_number":1509,"context_line":"            if not port:"},{"line_number":1510,"context_line":"                # The port disappeared and cannot be processed"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_5f81f249","line":1507,"in_reply_to":"5a9d85d2_b4480a2f","updated":"2016-06-20 17:24:39.000000000","message":"Ok, having new hooks seems like the safer route.","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"1aebc3ec56c62f97ac0293232fc8aa7b97d30bd4","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        for details in devices:"},{"line_number":1505,"context_line":"            device \u003d details[\u0027device\u0027]"},{"line_number":1506,"context_line":"            LOG.debug(\"Processing port: %s\", device)"},{"line_number":1507,"context_line":"            self.ext_manager.handle_port(self.context, details)"},{"line_number":1508,"context_line":"            port \u003d vif_by_id.get(device)"},{"line_number":1509,"context_line":"            if not port:"},{"line_number":1510,"context_line":"                # The port disappeared and cannot be processed"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_b4480a2f","line":1507,"in_reply_to":"7aa08908_d12f22f4","updated":"2016-06-20 13:36:14.000000000","message":"it breaks, I had to create other hooks","commit_id":"771a3dfb5a408e61fb9e89a1f6047060322408fb"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"f40813fca8e91eba0420abb133cf013dfdf488a8","unresolved":false,"context_lines":[{"line_number":1503,"context_line":"        for details in devices:"},{"line_number":1504,"context_line":"            device \u003d details[\u0027device\u0027]"},{"line_number":1505,"context_line":"            LOG.debug(\"Processing port: %s\", device)"},{"line_number":1506,"context_line":"            self.ext_manager.preprocess_added_port(self.context, details)"},{"line_number":1507,"context_line":"            port \u003d vif_by_id.get(device)"},{"line_number":1508,"context_line":"            if not port:"},{"line_number":1509,"context_line":"                # The port disappeared and cannot be processed"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a9d85d2_7fe2edd6","line":1506,"updated":"2016-06-20 17:51:52.000000000","message":"So this still doesn\u0027t give us a solution for \"minimize_polling\u003dFalse\" (used for Windows). For this 1st iteration, can we make the stipulation that minimize_polling must be True when using the trunk L2 agent extension (meaning Windows will have to wait for vlan-aware-vms support in the OVS agent)?","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"}],"neutron/tests/functional/agent/l2/base.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4a0c7c030bd0f339ecc763e318081b958fa06bf4","unresolved":false,"context_lines":[{"line_number":217,"context_line":"               \u0027device_owner\u0027: \u0027compute\u0027,"},{"line_number":218,"context_line":"               \u0027port_security_enabled\u0027: True,"},{"line_number":219,"context_line":"               \u0027security_groups\u0027: [\u0027default\u0027],"},{"line_number":220,"context_line":"               \u0027admin_state_up\u0027: True}"},{"line_number":221,"context_line":"        return dev"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def assert_bridge(self, br, exists\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_6d396341","line":220,"updated":"2016-07-05 18:06:17.000000000","message":"I would assume we\u0027d like to see trunk_details included here. I can put together a patch to make sure it\u0027s included, I don\u0027t think it will be very much work.","commit_id":"bba84e74967240c733f374806a92a3f3b2c8521f"}]}
