)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support DPDK application on bare-metal host"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch contains binding driver, which intend to copy vhostuser port to"},{"line_number":10,"context_line":"containers\u0027s directory. Here container\u0027s directory it\u0027s mounted directory."},{"line_number":11,"context_line":"Also this patch contains code to create proper VIF in case when neutron ovs"},{"line_number":12,"context_line":"agent configured to work with vhostuser ports."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_825ee276","line":9,"range":{"start_line":9,"start_character":42,"end_line":9,"end_character":48},"updated":"2018-10-12 09:30:27.000000000","message":"intends","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch contains binding driver, which intend to copy vhostuser port to"},{"line_number":10,"context_line":"containers\u0027s directory. Here container\u0027s directory it\u0027s mounted directory."},{"line_number":11,"context_line":"Also this patch contains code to create proper VIF in case when neutron ovs"},{"line_number":12,"context_line":"agent configured to work with vhostuser ports."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"There is no code here for port creation, due to it performs in"},{"line_number":15,"context_line":"base.connect by os_vif.plug. This function creates/or recreates OVS bridge"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_c2dcdae3","line":12,"range":{"start_line":12,"start_character":5,"end_line":12,"end_character":16},"updated":"2018-10-12 09:30:27.000000000","message":"is configured","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Also this patch contains code to create proper VIF in case when neutron ovs"},{"line_number":12,"context_line":"agent configured to work with vhostuser ports."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"There is no code here for port creation, due to it performs in"},{"line_number":15,"context_line":"base.connect by os_vif.plug. This function creates/or recreates OVS bridge"},{"line_number":16,"context_line":"with netdev type, then it  creates port in this bridge. It uses vif.network.bridge"},{"line_number":17,"context_line":"as the name for integration bridge, IOW it doesn\u0027t use ovs_bridge from kuryr.conf,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_22fd8e3a","line":14,"range":{"start_line":14,"start_character":50,"end_line":14,"end_character":59},"updated":"2018-10-12 09:30:27.000000000","message":"is performed","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"There is no code here for port creation, due to it performs in"},{"line_number":15,"context_line":"base.connect by os_vif.plug. This function creates/or recreates OVS bridge"},{"line_number":16,"context_line":"with netdev type, then it  creates port in this bridge. It uses vif.network.bridge"},{"line_number":17,"context_line":"as the name for integration bridge, IOW it doesn\u0027t use ovs_bridge from kuryr.conf,"},{"line_number":18,"context_line":"vif.network.bridge is configured by neutron ovs agent."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_829102fa","line":16,"range":{"start_line":16,"start_character":25,"end_line":16,"end_character":27},"updated":"2018-10-12 09:30:27.000000000","message":"too many spaces","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":17,"context_line":"as the name for integration bridge, IOW it doesn\u0027t use ovs_bridge from kuryr.conf,"},{"line_number":18,"context_line":"vif.network.bridge is configured by neutron ovs agent."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"VhostUser mode is defined by neutron ovs agent, it obtains from"},{"line_number":21,"context_line":"Open vSwitch configuration:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Command to check Open vSwitch configuration"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_22826ea6","line":20,"range":{"start_line":20,"start_character":50,"end_line":20,"end_character":58},"updated":"2018-10-12 09:30:27.000000000","message":"is obtained","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":24604,"name":"Danil Golov","email":"d.golov@samsung.com","username":"d.golov"},"change_message_id":"1bcec8f486e42060fd8d2e9e9895e66ef9ddb1e2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"When dpdkvhostuserclient is not in OVS\u0027s capability list, e.g. it\u0027s old"},{"line_number":33,"context_line":"OVS or it was built w/o dpdkvhostuserclient support, the mode will be"},{"line_number":34,"context_line":" VIFVHostUserMode.CLIENT. In this case OVS will create/bind/listen socket,"},{"line_number":35,"context_line":"so socket file will exist, and it shoud be copied to container\u0027s mount volume."},{"line_number":36,"context_line":"At the moment of copying OVS server already has to listen it, otherwise"},{"line_number":37,"context_line":"approach is not working."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f79a3b5_e2a0f638","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":39},"updated":"2018-10-12 09:30:27.000000000","message":"should","commit_id":"c32f505705fd06395a971d3b82208d6f52aa4dd2"},{"author":{"_account_id":25900,"name":"Vladimir Kuramshin","email":"vladimir@kuramsh.in","username":"vkuramshin"},"change_message_id":"c298824154590fe14d0dab6f258bead6098d0bb2","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Partially Implements: blueprint support-vhost-user-port-type-on-bm-installation"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Based on commit c32f505 of https://review.opendev.org/#/c/596731/"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Change-Id: Ib9c22368e518815064282f4c3b9f9ddaf58dc622"},{"line_number":45,"context_line":"Signed-off-by: Alexey Perevalov \u003ca.perevalov@samsung.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1fa4df85_6144b174","line":42,"range":{"start_line":42,"start_character":0,"end_line":42,"end_character":65},"updated":"2020-03-10 06:49:45.000000000","message":"Please remove this line","commit_id":"e82e104c237059e620dcb7bde8e75dbe1f3f68ce"}],"kuryr_kubernetes/cni/binding/base.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"83de656b64a677f077378009fffe5b87279efedf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from stevedore import driver as stv_driver"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from kuryr_kubernetes import utils"},{"line_number":24,"context_line":"from os_vif.objects import vif as osv_objects"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_45466352","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":45},"updated":"2018-09-20 08:47:25.000000000","message":"This should go close to another os_vif import in this file. See [1].\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def _skip_default_gw(vif):"},{"line_number":76,"context_line":"    return isinstance(vif, osv_objects.VIFVHostUser)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _configure_l3(vif, ifname, netns, is_default_gateway):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_55c1462e","line":76,"range":{"start_line":76,"start_character":11,"end_line":76,"end_character":52},"updated":"2018-09-19 14:02:23.000000000","message":"Why this is a condition to be default gateway?","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"83de656b64a677f077378009fffe5b87279efedf","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def _skip_default_gw(vif):"},{"line_number":76,"context_line":"    return isinstance(vif, osv_objects.VIFVHostUser)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _configure_l3(vif, ifname, netns, is_default_gateway):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_c51d9362","line":76,"range":{"start_line":76,"start_character":11,"end_line":76,"end_character":52},"in_reply_to":"3f79a3b5_21e9ec18","updated":"2018-09-20 08:47:25.000000000","message":"Oh, okay. I think this should be renamed to skip_l3 then. Or even better - let\u0027s just move that to connect() and don\u0027t call _configure_l3 if that condition is fulfilled.\n\nOtherwise, as you see, it\u0027s a bit confusing.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":28396,"name":"Alexey Perevalov","email":"alexey.perevalov@huawei.com","username":"a.perevalov"},"change_message_id":"c1eea2178c62fd48b7e550cffc7ff921b0b6af63","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def _skip_default_gw(vif):"},{"line_number":76,"context_line":"    return isinstance(vif, osv_objects.VIFVHostUser)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _configure_l3(vif, ifname, netns, is_default_gateway):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_21e9ec18","line":76,"range":{"start_line":76,"start_character":11,"end_line":76,"end_character":52},"in_reply_to":"3f79a3b5_55c1462e","updated":"2018-09-19 16:10:34.000000000","message":"There is no interface in case of VIFVhostUser in container, and no reason to set up default gw or some other routing operation.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import abc"},{"line_number":17,"context_line":"import errno"},{"line_number":18,"context_line":"import pyroute2"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import os_vif"},{"line_number":21,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_63caac4e","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":15},"updated":"2020-03-05 16:10:35.000000000","message":"pyroute2 is an external library so it should stay where it is. See [1] for reference.\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html#imports","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":25900,"name":"Vladimir Kuramshin","email":"vladimir@kuramsh.in","username":"vkuramshin"},"change_message_id":"867c0659dbd658c8eb0a38ba7b38c7671facd541","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from kuryr_kubernetes import constants"},{"line_number":26,"context_line":"from kuryr_kubernetes import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_415df544","line":28,"updated":"2020-03-10 06:59:31.000000000","message":"I think we don\u0027t need this change","commit_id":"e82e104c237059e620dcb7bde8e75dbe1f3f68ce"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"989390273fed24bc51ebe148d5a1810b610a1bf0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from kuryr_kubernetes import constants"},{"line_number":26,"context_line":"from kuryr_kubernetes import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_575db344","line":28,"in_reply_to":"1fa4df85_415df544","updated":"2020-03-10 10:15:48.000000000","message":"We do :)","commit_id":"e82e104c237059e620dcb7bde8e75dbe1f3f68ce"},{"author":{"_account_id":27032,"name":"Maysa de Macedo Souza","email":"maysa.macedo95@gmail.com","username":"maysa"},"change_message_id":"21e32a6b94a36cce39628e2ae46898c727c5d460","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from kuryr_kubernetes import constants"},{"line_number":26,"context_line":"from kuryr_kubernetes import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1fa4df85_acee07b2","line":28,"updated":"2020-03-11 12:06:36.000000000","message":"Could you remove this blank line?","commit_id":"f7fc6ad0dbb4e38abce348e6cfac80f2e362821b"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"47ef9edf2e49b815537eb2f632e6ffd07e6502d4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from kuryr_kubernetes import constants"},{"line_number":26,"context_line":"from kuryr_kubernetes import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1fa4df85_b2689e87","line":28,"in_reply_to":"1fa4df85_acee07b2","updated":"2020-03-11 12:56:06.000000000","message":"By convention, import section should be visibly separated from other content. PEP8 explicitly says about 2 lines between the imports and function/sections, and nothing about separation between imports and module variables.\n\nNevertheless it\u0027s a common approach for separating imports from *anything* by two blank lines.","commit_id":"f7fc6ad0dbb4e38abce348e6cfac80f2e362821b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from kuryr_kubernetes import constants"},{"line_number":26,"context_line":"from kuryr_kubernetes import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"_BINDING_NAMESPACE \u003d \u0027kuryr_kubernetes.cni.binding\u0027"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_99447db9","line":28,"updated":"2020-03-13 15:10:23.000000000","message":"Seems unrelated?","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"}],"kuryr_kubernetes/cni/binding/vhostuser.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"83de656b64a677f077378009fffe5b87279efedf","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import os.path"},{"line_number":18,"context_line":"import stat"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from kuryr_kubernetes.cni.binding import base"},{"line_number":21,"context_line":"from kuryr_kubernetes import config"},{"line_number":22,"context_line":"from kuryr_kubernetes import exceptions as k_exc"},{"line_number":23,"context_line":"from kuryr_kubernetes.handlers import health"},{"line_number":24,"context_line":"from os_vif.objects import fields as osv_fields"},{"line_number":25,"context_line":"from oslo_config import cfg"},{"line_number":26,"context_line":"from oslo_log import log"},{"line_number":27,"context_line":"from oslo_serialization import jsonutils"},{"line_number":28,"context_line":"from vif_plug_ovs import constants"},{"line_number":29,"context_line":"from vif_plug_ovs import ovs"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_2579e791","line":29,"range":{"start_line":20,"start_character":0,"end_line":29,"end_character":28},"updated":"2018-09-20 08:47:25.000000000","message":"Please separate the imports according to [1].\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def _write_conf(cont_id, sock_dir, port_name, ifname, vif):"},{"line_number":49,"context_line":"    \"\"\"This function writes configuration file for application"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    inside container and for cleanup (disconnect) procedure."},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    vhost_conf \u003d {}"},{"line_number":54,"context_line":"    vhost_conf[\"vhostname\"] \u003d port_name"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_d57f9614","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":60},"updated":"2018-09-19 14:02:23.000000000","message":"This isn\u0027t correct docstring format, first line should be ended and not continued below. See [1].\n\n[1] https://www.python.org/dev/peps/pep-0257/#multi-line-docstrings","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    json_str \u003d f.read()"},{"line_number":66,"context_line":"    conf \u003d jsonutils.loads(json_str)"},{"line_number":67,"context_line":"    f.close()"},{"line_number":68,"context_line":"    LOG.debug(\"conf: %s\", conf)"},{"line_number":69,"context_line":"    return conf[\u0027vhostname\u0027]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_755a421e","line":68,"range":{"start_line":68,"start_character":4,"end_line":68,"end_character":31},"updated":"2018-09-19 14:02:23.000000000","message":"Not really descriptive log.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            LOG.debug(\"copy %s to %s\", src_vhu_sock, dst_vhu_sock)"},{"line_number":100,"context_line":"            os.rename(src_vhu_sock, dst_vhu_sock)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            LOG.error(\"file %s doesn\u0027t exists\", src_vhu_sock)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def disconnect(self, vif, ifname, netns, container_id):"},{"line_number":105,"context_line":"        \"\"\"This function removes configuration file and appropriate"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_954a7e24","line":102,"range":{"start_line":102,"start_character":12,"end_line":102,"end_character":61},"updated":"2018-09-19 14:02:23.000000000","message":"Shouldn\u0027t we raise an exception here?","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            LOG.error(\"file %s doesn\u0027t exists\", src_vhu_sock)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def disconnect(self, vif, ifname, netns, container_id):"},{"line_number":105,"context_line":"        \"\"\"This function removes configuration file and appropriate"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        socket file. Unfortunatelly Open vSwitch daemon can\u0027t remove"},{"line_number":108,"context_line":"        moved socket."},{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":"        # os_vif.unplug in base\u0027s disconnect should"},{"line_number":111,"context_line":"        # do all work, but socket which was relocated we need"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_b56e9a93","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":21},"updated":"2018-09-19 14:02:23.000000000","message":"This isn\u0027t correct doc string. First line should describe the method on high level, then follows a more descriptive comment.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                           ifname)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if not os.path.exists(conf_file_path):"},{"line_number":117,"context_line":"            LOG.info(\"Configuration file: %s doesn\u0027t exists!\", conf_file_path)"},{"line_number":118,"context_line":"            return"},{"line_number":119,"context_line":"        vhu_sock_path \u003d \u0027{}/{}\u0027.format(self.mount_path,"},{"line_number":120,"context_line":"                                       _get_vhu_sock(conf_file_path))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_15050ec2","line":117,"range":{"start_line":117,"start_character":16,"end_line":117,"end_character":20},"updated":"2018-09-19 14:02:23.000000000","message":"Shouldn\u0027t this be warning?","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def is_healthy(self):"},{"line_number":128,"context_line":"        try:"},{"line_number":129,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":130,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":131,"context_line":"        except Exception:"},{"line_number":132,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":133,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_35bfead0","line":130,"range":{"start_line":129,"start_character":0,"end_line":130,"end_character":53},"updated":"2018-09-19 14:02:23.000000000","message":"Might be nice to log that those directories doesn\u0027t exist when we get False from this statement.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":28396,"name":"Alexey Perevalov","email":"alexey.perevalov@huawei.com","username":"a.perevalov"},"change_message_id":"c1eea2178c62fd48b7e550cffc7ff921b0b6af63","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def is_healthy(self):"},{"line_number":128,"context_line":"        try:"},{"line_number":129,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":130,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":131,"context_line":"        except Exception:"},{"line_number":132,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":133,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_e13c5493","line":130,"range":{"start_line":129,"start_character":0,"end_line":130,"end_character":53},"in_reply_to":"3f79a3b5_35bfead0","updated":"2018-09-19 16:10:34.000000000","message":"ok, I\u0027ll add reason.","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":130,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":131,"context_line":"        except Exception:"},{"line_number":132,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":133,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_95211e50","line":132,"range":{"start_line":132,"start_character":12,"end_line":132,"end_character":54},"updated":"2018-09-19 14:02:23.000000000","message":"It would be great to explain why the driver is unhealthy. Also I would prefer using a warning here. Something like:\n\n LOG.warning(\u0027OVS or mount point directory not accessible.\u0027).","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    vhost_conf[\"vhostname\"] \u003d port_name"},{"line_number":57,"context_line":"    vhost_conf[\"vhostmac\"] \u003d vif.address"},{"line_number":58,"context_line":"    vhost_conf[\"mode\"] \u003d vif.mode"},{"line_number":59,"context_line":"    json \u003d jsonutils.dumps(vhost_conf)"},{"line_number":60,"context_line":"    conf_file_path \u003d \u0027{}/{}-{}\u0027.format(sock_dir, cont_id, ifname)"},{"line_number":61,"context_line":"    conf_file \u003d open(conf_file_path, \"w\")"},{"line_number":62,"context_line":"    conf_file.write(json)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_838008c1","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":38},"updated":"2020-03-05 16:10:35.000000000","message":"Just use jsonutils.dump to save to file directly.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":65,"context_line":"def _get_vhu_sock(conf_file_path):"},{"line_number":66,"context_line":"    f \u003d open(conf_file_path, \u0027r\u0027)"},{"line_number":67,"context_line":"    json_str \u003d f.read()"},{"line_number":68,"context_line":"    conf \u003d jsonutils.loads(json_str)"},{"line_number":69,"context_line":"    f.close()"},{"line_number":70,"context_line":"    LOG.debug(\"load configuration from %s: %s\", conf_file_path, conf)"},{"line_number":71,"context_line":"    return conf[\u0027vhostname\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_636b8c1d","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":36},"updated":"2020-03-05 16:10:35.000000000","message":"Same here, just use jsonutils.load.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    json_str \u003d f.read()"},{"line_number":68,"context_line":"    conf \u003d jsonutils.loads(json_str)"},{"line_number":69,"context_line":"    f.close()"},{"line_number":70,"context_line":"    LOG.debug(\"load configuration from %s: %s\", conf_file_path, conf)"},{"line_number":71,"context_line":"    return conf[\u0027vhostname\u0027]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_2371140d","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":69},"updated":"2020-03-05 16:10:35.000000000","message":"It needs more context - what type of configuration, etc.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            LOG.debug(\"copy %s to %s\", src_vhu_sock, dst_vhu_sock)"},{"line_number":102,"context_line":"            os.rename(src_vhu_sock, dst_vhu_sock)"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            error_msg \u003d \"file %s doesn\u0027t exists\".format(src_vhu_sock)"},{"line_number":105,"context_line":"            LOG.error(error_msg)"},{"line_number":106,"context_line":"            raise k_exc.CNIError(error_msg)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_8359e88e","line":104,"range":{"start_line":104,"start_character":0,"end_line":104,"end_character":69},"updated":"2020-03-05 16:10:35.000000000","message":"This needs context about where it comes from.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                           ifname)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if not os.path.exists(conf_file_path):"},{"line_number":116,"context_line":"            LOG.warning(\"Configuration file: %s doesn\u0027t exists!\","},{"line_number":117,"context_line":"                        conf_file_path)"},{"line_number":118,"context_line":"            return"},{"line_number":119,"context_line":"        vhu_sock_path \u003d \u0027{}/{}\u0027.format(self.mount_path,"},{"line_number":120,"context_line":"                                       _get_vhu_sock(conf_file_path))"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_a35e6473","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":39},"updated":"2020-03-05 16:10:35.000000000","message":"Same here.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        os.remove(conf_file_path)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def is_healthy(self):"},{"line_number":126,"context_line":"        try:"},{"line_number":127,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":128,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":129,"context_line":"        except Exception:"},{"line_number":130,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":131,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_e3cd3c31","line":131,"range":{"start_line":126,"start_character":0,"end_line":131,"end_character":24},"updated":"2020-03-05 16:10:35.000000000","message":"Let\u0027s make sure it logs why the driver is unhealthy. On warning level.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"989390273fed24bc51ebe148d5a1810b610a1bf0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    vhost_conf[\"vhostname\"] \u003d port_name"},{"line_number":57,"context_line":"    vhost_conf[\"vhostmac\"] \u003d vif.address"},{"line_number":58,"context_line":"    vhost_conf[\"mode\"] \u003d vif.mode"},{"line_number":59,"context_line":"    conf_file_path \u003d \u0027{}/{}-{}\u0027.format(sock_dir, cont_id, ifname)"},{"line_number":60,"context_line":"    with open(conf_file_path, \"w\") as f:"},{"line_number":61,"context_line":"        jsonutils.dump(vhost_conf, f)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1fa4df85_d751a337","line":59,"range":{"start_line":59,"start_character":21,"end_line":59,"end_character":38},"updated":"2020-03-10 10:15:48.000000000","message":"If you have to use strings instead of os.path.join, which is more appropriate for file paths, than please use f strings, i.e.\n\n    f\u0027{sock_dir}/{cont_id}-{ifname}\u0027\n\nthat said, for file paths IMHO it\u0027s better to use os.path.join:\n\n    os.path.join(sock_dir, f\u0027{cont_id}-{ifname}\u0027)\n\nSame goes for all the occurrences down there.","commit_id":"405dfccdfa9f324ad80fd32b2f877d518ed5f42e"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"989390273fed24bc51ebe148d5a1810b610a1bf0","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def connect(self, vif, ifname, netns, container_id):"},{"line_number":86,"context_line":"        port_name \u003d _get_vhostuser_port_name(vif)"},{"line_number":87,"context_line":"        _write_conf(container_id, self.mount_path, port_name, ifname, vif)"},{"line_number":88,"context_line":"        # no need to copy in case of SERVER mode"},{"line_number":89,"context_line":"        if vif.mode \u003d\u003d osv_fields.VIFVHostUserMode.SERVER:"},{"line_number":90,"context_line":"            LOG.debug(\"skip copying socket file!\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"1fa4df85_77446f74","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":19},"updated":"2020-03-10 10:15:48.000000000","message":"This function could be a method.","commit_id":"405dfccdfa9f324ad80fd32b2f877d518ed5f42e"},{"author":{"_account_id":27032,"name":"Maysa de Macedo Souza","email":"maysa.macedo95@gmail.com","username":"maysa"},"change_message_id":"21e32a6b94a36cce39628e2ae46898c727c5d460","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2018 Samsung Electronics Co., Ltd."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":19,"id":"1fa4df85_2c44571b","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2020-03-11 12:06:36.000000000","message":"2020","commit_id":"f7fc6ad0dbb4e38abce348e6cfac80f2e362821b"},{"author":{"_account_id":27032,"name":"Maysa de Macedo Souza","email":"maysa.macedo95@gmail.com","username":"maysa"},"change_message_id":"21e32a6b94a36cce39628e2ae46898c727c5d460","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        os.remove(vhu_sock_path)"},{"line_number":119,"context_line":"        os.remove(config_file_path)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def is_healthy(self):"},{"line_number":122,"context_line":"        try:"},{"line_number":123,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":124,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":125,"context_line":"        except Exception:"},{"line_number":126,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":127,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":19,"id":"1fa4df85_0c3f1b88","line":127,"range":{"start_line":121,"start_character":0,"end_line":127,"end_character":24},"updated":"2020-03-11 12:06:36.000000000","message":"Where is this function being used?\nIn case you want to perform health checks you could use  is_ready or/and is_alive functions.","commit_id":"f7fc6ad0dbb4e38abce348e6cfac80f2e362821b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return \u0027dpdkvhostuserclient\u0027"},{"line_number":38,"context_line":"    elif vif.mode \u003d\u003d osv_fields.VIFVHostUserMode.CLIENT:"},{"line_number":39,"context_line":"        return \u0027dpdkvhostuser\u0027"},{"line_number":40,"context_line":"    raise k_exc.IntegrityError(_(\"Unknown vhostuser mode %(vhostuser_mode)s\")"},{"line_number":41,"context_line":"                               % {\u0027vhostuser_mode\u0027: vif.mode})"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_3cfe9705","line":40,"range":{"start_line":40,"start_character":33,"end_line":40,"end_character":76},"updated":"2020-03-13 15:10:23.000000000","message":"Please add VIF id here.","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.mount_path \u003d config.CONF.vhostuser.mount_point"},{"line_number":64,"context_line":"        self.ovs_vu_path \u003d config.CONF.vhostuser.ovs_vhu_path"},{"line_number":65,"context_line":"        if not self.mount_path:"},{"line_number":66,"context_line":"            raise cfg.RequiredOptError(\u0027mount_point\u0027,"},{"line_number":67,"context_line":"                                       \u0027vhostuser\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _write_config(self, container_id, ifname, port_name, vif):"},{"line_number":70,"context_line":"        \"\"\"Write vhostuser configuration file"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_1c263bb9","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":51},"updated":"2020-03-13 15:10:23.000000000","message":"This can be in one line, it seems?","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if _check_sock_file(src_vhu_sock):"},{"line_number":96,"context_line":"            dst_vhu_sock \u003d os.path.join(vif.path, port_name)"},{"line_number":97,"context_line":"            LOG.debug(\"copy %s to %s\", src_vhu_sock, dst_vhu_sock)"},{"line_number":98,"context_line":"            os.rename(src_vhu_sock, dst_vhu_sock)"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            error_msg \u003d \"file %s doesn\u0027t exists\".format(src_vhu_sock)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_1c74fb98","line":97,"range":{"start_line":97,"start_character":22,"end_line":97,"end_character":37},"updated":"2020-03-13 15:10:23.000000000","message":"This doesn\u0027t seem like copying, just renaming? How about:\n\n\u0027Renaming %s to %s while processing VIF %s\u0027, src_vhu_sock, dst_vhu_sock, vif.id.","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            LOG.debug(\"copy %s to %s\", src_vhu_sock, dst_vhu_sock)"},{"line_number":98,"context_line":"            os.rename(src_vhu_sock, dst_vhu_sock)"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            error_msg \u003d \"file %s doesn\u0027t exists\".format(src_vhu_sock)"},{"line_number":101,"context_line":"            LOG.error(error_msg)"},{"line_number":102,"context_line":"            raise k_exc.CNIError(error_msg)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_dcaae3d0","line":100,"range":{"start_line":100,"start_character":24,"end_line":100,"end_character":48},"updated":"2020-03-13 15:10:23.000000000","message":"\"Socket %s required for VIF %s doesn\u0027t exist.\", src_vhu_sock, vif.id","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        config_file_path \u003d self._config_file_path(container_id, ifname)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if not os.path.exists(config_file_path):"},{"line_number":111,"context_line":"            LOG.warning(\"Configuration file: %s doesn\u0027t exists!\","},{"line_number":112,"context_line":"                        config_file_path)"},{"line_number":113,"context_line":"            return"},{"line_number":114,"context_line":"        vhu_sock_path \u003d os.path.join(self.mount_path,"},{"line_number":115,"context_line":"                                     _get_vhu_sock(config_file_path))"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_5c51130e","line":112,"range":{"start_line":111,"start_character":0,"end_line":112,"end_character":41},"updated":"2020-03-13 15:10:23.000000000","message":"Please log the vif id.","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":123,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":124,"context_line":"        except Exception:"},{"line_number":125,"context_line":"            LOG.debug(\"Reporting Driver not healthy.\")"},{"line_number":126,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_1c5b9b2e","line":126,"range":{"start_line":125,"start_character":0,"end_line":126,"end_character":24},"updated":"2020-03-13 15:10:23.000000000","message":"Please log this as error and with an information about why it is unhealthy.","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"78ad2b507d2aa7a35e870fdb99fc069d8eae358a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import os.path"},{"line_number":18,"context_line":"import stat"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from kuryr.lib._i18n import _"},{"line_number":21,"context_line":"from os_vif.objects import fields as osv_fields"},{"line_number":22,"context_line":"from oslo_config import cfg"},{"line_number":23,"context_line":"from oslo_log import log"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_b44e0e94","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":29},"updated":"2020-03-16 09:21:51.000000000","message":"We don\u0027t really have any translations at the moment, it\u0027s probably better to just skip using _(), but it\u0027s not a blocker, we use it in some other places…","commit_id":"60ed36806a560c1f7197103b7f7c7080c84781b6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"9efa33a8c42cdabf5ca9f26d1d62de9f107c078b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                      dst_vhu_sock, vif.id)"},{"line_number":100,"context_line":"            os.rename(src_vhu_sock, dst_vhu_sock)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            error_msg \u003d \"Socket %s required for VIF %s doesn\u0027t exists\".format("},{"line_number":103,"context_line":"                src_vhu_sock, vif.id)"},{"line_number":104,"context_line":"            LOG.error(error_msg)"},{"line_number":105,"context_line":"            raise k_exc.CNIError(error_msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_5acb41a4","line":102,"range":{"start_line":102,"start_character":63,"end_line":102,"end_character":69},"updated":"2020-03-16 10:54:05.000000000","message":"nit: I think it\u0027s without \"s\" with \"doesn\u0027t\", so \"doesn\u0027t exist\".","commit_id":"ac32c86cf6f2cadb9eacc378efa47153d3c56253"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"9efa33a8c42cdabf5ca9f26d1d62de9f107c078b","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        config_file_path \u003d self._config_file_path(container_id, ifname)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        if not os.path.exists(config_file_path):"},{"line_number":114,"context_line":"            LOG.warning(\"Configuration file: %s for VIF %s doesn\u0027t exists!\","},{"line_number":115,"context_line":"                        config_file_path, vif.id)"},{"line_number":116,"context_line":"            return"},{"line_number":117,"context_line":"        vhu_sock_path \u003d os.path.join(self.mount_path,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_7ace3db5","line":114,"range":{"start_line":114,"start_character":67,"end_line":114,"end_character":73},"updated":"2020-03-16 10:54:05.000000000","message":"Same here.","commit_id":"ac32c86cf6f2cadb9eacc378efa47153d3c56253"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"9efa33a8c42cdabf5ca9f26d1d62de9f107c078b","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        os.remove(config_file_path)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def is_alive(self):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":126,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":127,"context_line":"        except Exception as err:"},{"line_number":128,"context_line":"            LOG.error(\"Reporting Driver not healthy: %s\", err)"},{"line_number":129,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_5a5901fc","line":129,"range":{"start_line":124,"start_character":0,"end_line":129,"end_character":24},"updated":"2020-03-16 10:54:05.000000000","message":"That isn\u0027t helpful at all for the user. Something like this is needed:\n\n healthy \u003d False\n try:\n     healthy \u003d (os.path.exists(self.ovs_vu_path) and os.path.exists(self.mount_point))\n except Exception:\n     LOG.exception(\u0027Error when determining health status of vhostuser CNI driver.\u0027\n \n if not healthy:\n     LOG.error(\u0027Directory %s or %s does not exist, marking vhostuser binding driver as unhealthy.\u0027).\n \n return healthy","commit_id":"ac32c86cf6f2cadb9eacc378efa47153d3c56253"},{"author":{"_account_id":31502,"name":"Andrey Zaikin","email":"zed.0xff@gmail.com","username":"zed_0xff"},"change_message_id":"7b1691d96dff0eb283513b3d56fc69b50dd738b2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        os.remove(config_file_path)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def is_alive(self):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":126,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":127,"context_line":"        except Exception as err:"},{"line_number":128,"context_line":"            LOG.error(\"Reporting Driver not healthy: %s\", err)"},{"line_number":129,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_da7f31a9","line":129,"range":{"start_line":124,"start_character":0,"end_line":129,"end_character":24},"in_reply_to":"1fa4df85_5a5901fc","updated":"2020-03-16 11:27:21.000000000","message":"It will not throw an exception if directory not exists, either it will not throw if permissions are wrong.\nIt will only throw in some weird cases, I managed to get an exception \"ValueError: embedded null byte\" on os.path.exists(\"\\x00\")","commit_id":"ac32c86cf6f2cadb9eacc378efa47153d3c56253"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5f7d5a02add14a5b9c77547526335d3a3984ecca","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        os.remove(config_file_path)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def is_alive(self):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            return (os.path.exists(self.ovs_vu_path) and"},{"line_number":126,"context_line":"                    os.path.exists(self.mount_point))"},{"line_number":127,"context_line":"        except Exception as err:"},{"line_number":128,"context_line":"            LOG.error(\"Reporting Driver not healthy: %s\", err)"},{"line_number":129,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_456e0697","line":129,"range":{"start_line":124,"start_character":0,"end_line":129,"end_character":24},"in_reply_to":"1fa4df85_da7f31a9","updated":"2020-03-16 11:48:31.000000000","message":"Yes, I understand that and tried to write the code having that in mind - it defaults to unhealty and LOG.exception will log the traceback automatically. My main point is that we had numerous complaints about users being unable to tell why their kuryr-cni is in 0/1 status because drivers are not logging why they\u0027re unhealthy. That\u0027s why it\u0027s crucial to have a clear message when that happens.\n\nI guess you can modify my message to read \"does not exist or Kuryr has no permissions to access it\".","commit_id":"ac32c86cf6f2cadb9eacc378efa47153d3c56253"}],"kuryr_kubernetes/controller/drivers/vif_pool.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \u0027VIFMacvlanNested\u0027: \u0027nested-macvlan\u0027,"},{"line_number":101,"context_line":"    \u0027VIFSriov\u0027: \u0027sriov\u0027,"},{"line_number":102,"context_line":"    \u0027VIFDPDKNested\u0027: \u0027nested-dpdk\u0027,"},{"line_number":103,"context_line":"    \u0027VIFVHostUser\u0027: \u0027neutron-vif\u0027"},{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_23eef4b3","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":33},"updated":"2020-03-05 16:10:35.000000000","message":"Please add comma at the end, it simplifies future diffs.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \u0027VIFMacvlanNested\u0027: \u0027nested-macvlan\u0027,"},{"line_number":101,"context_line":"    \u0027VIFSriov\u0027: \u0027sriov\u0027,"},{"line_number":102,"context_line":"    \u0027VIFDPDKNested\u0027: \u0027nested-dpdk\u0027,"},{"line_number":103,"context_line":"    \u0027VIFVHostUser\u0027: \u0027neutron-vif\u0027"},{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_19e16dff","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":33},"in_reply_to":"1fa4df85_212ee2fa","updated":"2020-03-13 15:10:23.000000000","message":"But it\u0027s part of OpenStack style guidelines: https://docs.openstack.org/hacking/latest/user/hacking.html#dictionaries-lists.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"f5638b30f83d6a7503164a2dbc6634c479621f83","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \u0027VIFMacvlanNested\u0027: \u0027nested-macvlan\u0027,"},{"line_number":101,"context_line":"    \u0027VIFSriov\u0027: \u0027sriov\u0027,"},{"line_number":102,"context_line":"    \u0027VIFDPDKNested\u0027: \u0027nested-dpdk\u0027,"},{"line_number":103,"context_line":"    \u0027VIFVHostUser\u0027: \u0027neutron-vif\u0027"},{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_212ee2fa","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":33},"in_reply_to":"1fa4df85_23eef4b3","updated":"2020-03-06 09:50:03.000000000","message":"IMHO it doesn\u0027t simplify anything while provides unnecessary noise in the code.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"}],"kuryr_kubernetes/os_vif_util.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"375533e2a253fc5df7cf1480df0c3e08c84cb246","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    :param subnets: subnet mapping as returned by PodSubnetsDriver.get_subnets"},{"line_number":305,"context_line":"    :return: os-vif VIF object"},{"line_number":306,"context_line":"    \"\"\""},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    try:"},{"line_number":309,"context_line":"        mgr \u003d _VIF_MANAGERS[vif_translator]"},{"line_number":310,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_75a24241","side":"PARENT","line":307,"updated":"2018-09-19 14:02:23.000000000","message":"I guess this line removal is unrelated.","commit_id":"24e9100b3307dfeba67365e15002e9512cc2e30b"},{"author":{"_account_id":28396,"name":"Alexey Perevalov","email":"alexey.perevalov@huawei.com","username":"a.perevalov"},"change_message_id":"c1eea2178c62fd48b7e550cffc7ff921b0b6af63","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    :param subnets: subnet mapping as returned by PodSubnetsDriver.get_subnets"},{"line_number":305,"context_line":"    :return: os-vif VIF object"},{"line_number":306,"context_line":"    \"\"\""},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    try:"},{"line_number":309,"context_line":"        mgr \u003d _VIF_MANAGERS[vif_translator]"},{"line_number":310,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_41ec2828","side":"PARENT","line":307,"in_reply_to":"3f79a3b5_75a24241","updated":"2018-09-19 16:10:34.000000000","message":"yes","commit_id":"24e9100b3307dfeba67365e15002e9512cc2e30b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"83de656b64a677f077378009fffe5b87279efedf","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from kuryr_kubernetes import exceptions as k_exc"},{"line_number":32,"context_line":"from kuryr_kubernetes.objects import vif as k_vif"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from oslo_log import log as logging"},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_e5552ffa","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":35},"updated":"2018-09-20 08:47:25.000000000","message":"oslo_log should be placed along with other oslo imports, so in group above Kuryr\u0027s. See [1].\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template","commit_id":"5af32990f62f1f7c345cd2f5dbf31820600c1354"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    network.bridge \u003d ovs_bridge"},{"line_number":265,"context_line":"    vhostuser_mode \u003d details.get(\u0027vhostuser_mode\u0027, False)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    LOG.debug(\"vhostuser_mode: %s\", vhostuser_mode)"},{"line_number":268,"context_line":"    if vhostuser_mode:"},{"line_number":269,"context_line":"        # TODO(a.perevalov) obtain path to mount point from pod\u0027s mountVolumes"},{"line_number":270,"context_line":"        vhostuser_mount_point \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_83e488e1","line":267,"range":{"start_line":267,"start_character":0,"end_line":267,"end_character":51},"updated":"2020-03-05 16:10:35.000000000","message":"Doesn\u0027t seem too helpful, please either remove this log or make it more informative.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":31502,"name":"Andrey Zaikin","email":"zed.0xff@gmail.com","username":"zed_0xff"},"change_message_id":"87baad11a50d7032b0c6a78b60bdbb8f131ccf32","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    network.bridge \u003d ovs_bridge"},{"line_number":265,"context_line":"    vhostuser_mode \u003d details.get(\u0027vhostuser_mode\u0027, False)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    LOG.debug(\"vhostuser_mode: %s\", vhostuser_mode)"},{"line_number":268,"context_line":"    if vhostuser_mode:"},{"line_number":269,"context_line":"        # TODO(a.perevalov) obtain path to mount point from pod\u0027s mountVolumes"},{"line_number":270,"context_line":"        vhostuser_mount_point \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_04d3b4d6","line":267,"range":{"start_line":267,"start_character":0,"end_line":267,"end_character":51},"in_reply_to":"1fa4df85_83e488e1","updated":"2020-03-06 10:50:52.000000000","message":"\u003e Doesn\u0027t seem too helpful, please either remove this log or make it\n \u003e more informative.\n\nActually knowing detected mode is crucial here. For example for debugging any issues with container/host dpdk ports cannot connect to each other.\nHow can I make it more informative here?","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    LOG.debug(\"vhostuser_mode: %s\", vhostuser_mode)"},{"line_number":268,"context_line":"    if vhostuser_mode:"},{"line_number":269,"context_line":"        # TODO(a.perevalov) obtain path to mount point from pod\u0027s mountVolumes"},{"line_number":270,"context_line":"        vhostuser_mount_point \u003d ("},{"line_number":271,"context_line":"            config.CONF.vhostuser.mount_point)"},{"line_number":272,"context_line":"        if not vhostuser_mount_point:"},{"line_number":273,"context_line":"            raise oslo_cfg.RequiredOptError(\u0027vhostuser_mount_point\u0027,"},{"line_number":274,"context_line":"                                            \u0027neutron_defaults\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_43d21002","line":271,"range":{"start_line":270,"start_character":0,"end_line":271,"end_character":46},"updated":"2020-03-05 16:10:35.000000000","message":"Seems like you\u0027ll fit that in one line.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a8392b49d48f4af19895158cf80c77a69628f7de","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            raise oslo_cfg.RequiredOptError(\u0027vhostuser_mount_point\u0027,"},{"line_number":274,"context_line":"                                            \u0027neutron_defaults\u0027)"},{"line_number":275,"context_line":"        vif \u003d osv_vif.VIFVHostUser("},{"line_number":276,"context_line":"            id\u003dneutron_port[\u0027id\u0027],"},{"line_number":277,"context_line":"            address\u003dneutron_port[\u0027mac_address\u0027],"},{"line_number":278,"context_line":"            network\u003dnetwork,"},{"line_number":279,"context_line":"            has_traffic_filtering\u003ddetails.get(\u0027port_filter\u0027, False),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_e30c5ca6","line":276,"range":{"start_line":276,"start_character":15,"end_line":276,"end_character":27},"updated":"2020-03-05 16:10:35.000000000","message":"neutron_port will be an openstacksdk object now, so we prefer object notation: neutron_port.id. Same below.","commit_id":"68729cffb6b8b719be585ad6737d5d595d0dcc44"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"# TODO(a.perevalov) generalize it with get_veth_pair_names"},{"line_number":201,"context_line":"# but it reasonable if we\u0027re going to add vhostuser support"},{"line_number":202,"context_line":"# into kuryr project"},{"line_number":203,"context_line":"def _get_vhu_vif_name(port_id):"},{"line_number":204,"context_line":"    ifname \u003d osv_const.OVS_VHOSTUSER_PREFIX + port_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_b975b9ce","line":201,"range":{"start_line":201,"start_character":6,"end_line":201,"end_character":8},"updated":"2020-03-13 15:10:23.000000000","message":"it\u0027s?","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e680c619711b2929a8425abfa0f6cc59998f7d66","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    network.bridge \u003d ovs_bridge"},{"line_number":265,"context_line":"    vhostuser_mode \u003d details.get(\u0027vhostuser_mode\u0027, False)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    LOG.debug(\"vhostuser_mode: %s\", vhostuser_mode)"},{"line_number":268,"context_line":"    if vhostuser_mode:"},{"line_number":269,"context_line":"        # TODO(a.perevalov) obtain path to mount point from pod\u0027s mountVolumes"},{"line_number":270,"context_line":"        vhostuser_mount_point \u003d (config.CONF.vhostuser.mount_point)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1fa4df85_792d01a7","line":267,"range":{"start_line":267,"start_character":4,"end_line":267,"end_character":51},"updated":"2020-03-13 15:10:23.000000000","message":"\u0027Detected vhostuser_mode\u003d%s for port %s\u0027, vhostuser_mode, os_port.id","commit_id":"79d9b20cf59201d47b7c674c49b1969ca8f63fed"}],"kuryr_kubernetes/tests/unit/test_os_vif_util.py":[{"author":{"_account_id":25900,"name":"Vladimir Kuramshin","email":"vladimir@kuramsh.in","username":"vkuramshin"},"change_message_id":"fd01e285ad210469ca4fefdabbba08651792de0a","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        m_mk_vif.return_value \u003d vif"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        self.assertEqual(vif, ovu.neutron_to_osvif_vif_nested_vlan(port,"},{"line_number":373,"context_line":"                                                                   subnets, vlan_id))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        m_make_vif_network.assert_called_once_with(port, subnets)"},{"line_number":376,"context_line":"        m_is_port_active.assert_called_once_with(port)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_c16805f6","line":373,"range":{"start_line":373,"start_character":67,"end_line":373,"end_character":85},"updated":"2020-03-10 06:48:49.000000000","message":"This fails pep8 check","commit_id":"e82e104c237059e620dcb7bde8e75dbe1f3f68ce"}]}
