)]}'
{"cni.Dockerfile":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8a6408b9b0166323077971c4280e315c5e89ae1a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"ARG OSLO_LOCK_PATH\u003d/var/kuryr-lock"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RUN yum install -y epel-release https://rdoproject.org/repos/rdo-release.rpm \\"},{"line_number":8,"context_line":"    \u0026\u0026 yum install -y --setopt\u003dtsflags\u003dnodocs python-pip iproute bridge-utils openvswitch sudo libstdc++ \\"},{"line_number":9,"context_line":"    \u0026\u0026 yum install -y --setopt\u003dtsflags\u003dnodocs gcc python-devel git"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"COPY . /opt/kuryr-kubernetes"}],"source_content_type":"text/x-dockerfile","patch_set":18,"id":"dfbec78f_fb5ab780","line":8,"range":{"start_line":8,"start_character":95,"end_line":8,"end_character":104},"updated":"2019-05-15 12:29:21.000000000","message":"Do we need this to run Kuryr or just for installation of Python dependencies using pip? If the latter, it should go into the second yum install - those are things we remove after installation.","commit_id":"e2b5efc4e7778f6d90fde14423435d12e49a46a6"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"117d0e37bbf298a91f1d76a22b185cc56761701b","unresolved":false,"context_lines":[{"line_number":5,"context_line":"ARG OSLO_LOCK_PATH\u003d/var/kuryr-lock"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RUN yum install -y epel-release https://rdoproject.org/repos/rdo-release.rpm \\"},{"line_number":8,"context_line":"    \u0026\u0026 yum install -y --setopt\u003dtsflags\u003dnodocs python-pip iproute bridge-utils openvswitch sudo libstdc++ \\"},{"line_number":9,"context_line":"    \u0026\u0026 yum install -y --setopt\u003dtsflags\u003dnodocs gcc python-devel git"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"COPY . /opt/kuryr-kubernetes"}],"source_content_type":"text/x-dockerfile","patch_set":18,"id":"dfbec78f_dbafb327","line":8,"range":{"start_line":8,"start_character":95,"end_line":8,"end_character":104},"in_reply_to":"dfbec78f_fb5ab780","updated":"2019-05-15 12:45:18.000000000","message":"It\u0027s a run-time dependency for the compiled grpc module. Without it \u0027import grpc\u0027 will fail with:\n\n  File \"/usr/local/lib/python3.6/site-packages/kuryr_kubernetes/pod_resources/client.py\", line 18, in \u003cmodule\u003e\n    import grpc\n  File \"/usr/local/lib64/python3.6/site-packages/grpc/__init__.py\", line 22, in \u003cmodule\u003e\n    from grpc._cython import cygrpc as _cygrpc\n  ImportError: libstdc++.so.6: cannot open shared object file: No such file or directory\n\nSo it should stay.\n\nActually, centos image already has libstdc++ installed, but fedora has not. Keeping the dependency here for centos just to not depend on the base container image.","commit_id":"e2b5efc4e7778f6d90fde14423435d12e49a46a6"}],"kuryr_kubernetes/clients.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c3dbc41b21cbece697f5d297d6413f872927f732","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def setup_clients():"},{"line_number":53,"context_line":"    setup_neutron_client()"},{"line_number":54,"context_line":"    setup_kubernetes_client()"},{"line_number":55,"context_line":"    setup_openstacksdk()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def setup_neutron_client():"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_bd8c44d7","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":24},"updated":"2019-04-19 10:43:18.000000000","message":"Don\u0027t you need to add setup_pod_resources_client() here?","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"44b6747bed1c6c312ee929aa64e4cdfa056270fa","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def setup_clients():"},{"line_number":53,"context_line":"    setup_neutron_client()"},{"line_number":54,"context_line":"    setup_kubernetes_client()"},{"line_number":55,"context_line":"    setup_openstacksdk()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def setup_neutron_client():"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_9d7dc8b3","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":24},"in_reply_to":"3fce034c_bd8c44d7","updated":"2019-04-19 11:06:31.000000000","message":"PodResources service provided by kubelet and not available on controller node. \u0027setup_clients\u0027 used by controller only.","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"caa71871ee029b0d416b02dc786de7a1caf75aa9","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def setup_pod_resources_client():"},{"line_number":82,"context_line":"    root_dir \u003d config.CONF.sriov.kubelet_root_dir"},{"line_number":83,"context_line":"    _clients[_POD_RESOURCES_CLIENT] \u003d pr_client.PodResourcesClient(root_dir)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bfb3d3c7_9369c226","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":32},"updated":"2019-05-20 10:06:42.000000000","message":"why inside sriov conf? could any other (future) driver make use of this? in affirmative case, better to make it general, right? If not, please dismiss","commit_id":"ba62832d029e0830f8ceb3a1245ffd83e008093a"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"1843862b5a9beed7a222ce4a646c50af6a95579b","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def setup_pod_resources_client():"},{"line_number":82,"context_line":"    root_dir \u003d config.CONF.sriov.kubelet_root_dir"},{"line_number":83,"context_line":"    _clients[_POD_RESOURCES_CLIENT] \u003d pr_client.PodResourcesClient(root_dir)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bfb3d3c7_9e3d49bd","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":32},"in_reply_to":"bfb3d3c7_9369c226","updated":"2019-05-20 10:28:04.000000000","message":"Michał Dulko suggested to place it here. I think that it\u0027s unlikely that we\u0027ll have any other driver that will need to use pod resources directly. SRIOV is kind of exceptional case because we have to know what device was allocated by the device-plugin. So, it\u0027s probably makes sense to keep the config in sriov section.","commit_id":"ba62832d029e0830f8ceb3a1245ffd83e008093a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"b7d1d883a8bf3bdfe16c60c094756d279b816715","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"def setup_pod_resources_client():"},{"line_number":82,"context_line":"    root_dir \u003d config.CONF.sriov.kubelet_root_dir"},{"line_number":83,"context_line":"    _clients[_POD_RESOURCES_CLIENT] \u003d pr_client.PodResourcesClient(root_dir)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bfb3d3c7_9843c56c","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":32},"in_reply_to":"bfb3d3c7_9e3d49bd","updated":"2019-05-24 07:00:06.000000000","message":"fine with me then","commit_id":"ba62832d029e0830f8ceb3a1245ffd83e008093a"}],"kuryr_kubernetes/config.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2fd80e4961c09e579522fc9ddf212940bdfce81a","unresolved":false,"context_lines":[{"line_number":252,"context_line":"sriov_opts \u003d ["},{"line_number":253,"context_line":"    cfg.StrOpt(\u0027kubelet_root_dir\u0027,"},{"line_number":254,"context_line":"               help\u003d_(\"The root directory of the Kubelet daemon\"),"},{"line_number":255,"context_line":"               default\u003d\u0027/var/lib/kubelet\u0027),"},{"line_number":256,"context_line":"    cfg.DictOpt(\u0027default_physnet_subnets\u0027,"},{"line_number":257,"context_line":"                help\u003d_(\"A mapping of default subnets for certain physnets \""},{"line_number":258,"context_line":"                       \"in a form of physnet-name:\u003cSUBNET-ID\u003e\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_20434b6e","line":255,"range":{"start_line":255,"start_character":23,"end_line":255,"end_character":41},"updated":"2019-04-19 13:14:35.000000000","message":"I\u0027m pretty sure /var/lib is not really a kubelet root directory, /var stands for variable files. I think the best way would be to just put full socket path here (what if kubelet is in container - like in Magnum, and we need to connect to daemon through TCP?) and name it accordingly, e.g. pod_resources_daemon_socket.","commit_id":"454af21ee05096867143637fdce072e281ce2bd5"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"db390d54c344115420940217d3678e4c3401ac57","unresolved":false,"context_lines":[{"line_number":252,"context_line":"sriov_opts \u003d ["},{"line_number":253,"context_line":"    cfg.StrOpt(\u0027kubelet_root_dir\u0027,"},{"line_number":254,"context_line":"               help\u003d_(\"The root directory of the Kubelet daemon\"),"},{"line_number":255,"context_line":"               default\u003d\u0027/var/lib/kubelet\u0027),"},{"line_number":256,"context_line":"    cfg.DictOpt(\u0027default_physnet_subnets\u0027,"},{"line_number":257,"context_line":"                help\u003d_(\"A mapping of default subnets for certain physnets \""},{"line_number":258,"context_line":"                       \"in a form of physnet-name:\u003cSUBNET-ID\u003e\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"ffb9cba7_1b7ae423","line":255,"range":{"start_line":255,"start_character":23,"end_line":255,"end_character":41},"in_reply_to":"3fce034c_20434b6e","updated":"2019-04-22 07:08:04.000000000","message":"If you\u0027ll look at kubelet, you\u0027ll see that /var/lib/kubelet is the default RootDirectory for it:\n\n    cmd/kubelet/app/options/options.go:48:const defaultRootDir \u003d \"/var/lib/kubelet\"\n    cmd/kubelet/app/options/options.go:226:         RootDirectory:                       defaultRootDir,\n    cmd/kubelet/app/options/options.go:403: fs.StringVar(\u0026f.RootDirectory, \"root-dir\", f.RootDirectory, \"Directory path for managing kubelet files (volume mounts,etc).\")\n\nHowever, they have probably a bit different understanding of what is the root directory. But it\u0027s definitely named root-dir and passed to the kubelet via \u0027--root-dir\u0027 cmdline option.\n\n\nPodResources service has the same interface as k8s device plugins. Device plugins communicate with kubelet via unix domain sockets in /var/lib/kubelet/device-plugins/. For that purpose all the device plugins that works inside pods mounts the /var/lib/kubelet/device-plugins directory. For example: https://github.com/intel/sriov-network-device-plugin/blob/master/deployments/pod-sriovdp.yaml . In case where kubelet works inside the container there must be ability to still share this directory with other containers on the same node, otherwise device plugins will not be able to work without additional proxying their unix domain sockets to some TCP connections. Situation with pod-resources is equal here.","commit_id":"454af21ee05096867143637fdce072e281ce2bd5"}],"kuryr_kubernetes/pod_resources/client.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c3dbc41b21cbece697f5d297d6413f872927f732","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"POD_RESOURCE_SOCKET \u003d \u0027unix:/var/lib/kubelet/pod-resources/kubelet.sock\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class PodResourcesClient(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_3dba946d","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":72},"updated":"2019-04-19 10:43:18.000000000","message":"Any reason why this should be hardcoded and not configurable?","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"44b6747bed1c6c312ee929aa64e4cdfa056270fa","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"POD_RESOURCE_SOCKET \u003d \u0027unix:/var/lib/kubelet/pod-resources/kubelet.sock\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class PodResourcesClient(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_604e3370","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":72},"in_reply_to":"3fce034c_3dba946d","updated":"2019-04-19 11:06:31.000000000","message":"You\u0027re right. rootDirectory is configurable for kubelet, so it should be configurable for kuryr-kubernetes. I\u0027ll add \u0027kubelet_root_dir\u0027 option and will construct the socket path from it.","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"}],"requirements.txt":[{"author":{"_account_id":28396,"name":"Alexey Perevalov","email":"alexey.perevalov@huawei.com","username":"a.perevalov"},"change_message_id":"3f1d26a079e076035691d29ca8b37fd7d3d3d08f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":23,"context_line":"six\u003e\u003d1.10.0 # MIT"},{"line_number":24,"context_line":"stevedore\u003e\u003d1.20.0 # Apache-2.0"},{"line_number":25,"context_line":"grpcio\u003e\u003d1.12.0 # Apache-2.0"},{"line_number":26,"context_line":"protobuf\u003e\u003d3.5.2 # 3-Clause BSD"}],"source_content_type":"text/plain","patch_set":6,"id":"3fce034c_cec76345","line":25,"updated":"2019-04-16 16:29:02.000000000","message":"can you please also check grpc in clean environment,\nlooks like it also required?","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"3b072f11498db757cbdd43a73042c1dc11813b34","unresolved":false,"context_lines":[{"line_number":22,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":23,"context_line":"six\u003e\u003d1.10.0 # MIT"},{"line_number":24,"context_line":"stevedore\u003e\u003d1.20.0 # Apache-2.0"},{"line_number":25,"context_line":"grpcio\u003e\u003d1.12.0 # Apache-2.0"},{"line_number":26,"context_line":"protobuf\u003e\u003d3.5.2 # 3-Clause BSD"}],"source_content_type":"text/plain","patch_set":6,"id":"3fce034c_9d9b8871","line":25,"in_reply_to":"3fce034c_cec76345","updated":"2019-04-19 09:41:34.000000000","message":"grpcio provides grpc package:\n\n    /tmp$ virtualenv venv\n    New python executable in /tmp/venv/bin/python\n    Installing setuptools, pip, wheel...done.\n    /tmp$ . ./venv/bin/activate\n    \n    (venv) /tmp$ python\n    \u003e\u003e\u003e import grpc\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n    ImportError: No module named grpc\n    \n    (venv) /tmp$ pip install grpcio\n    Installing collected packages: enum34, six, futures, grpcio\n    Successfully installed enum34-1.1.6 futures-3.2.0 grpcio-1.20.0 six-1.12.0\n    \n    (venv) /tmp$ python\n    \u003e\u003e\u003e import grpc\n    \u003e\u003e\u003e grpc\n    \u003cmodule \u0027grpc\u0027 from \u0027/tmp/venv/local/lib/python2.7/site-packages/grpc/__init__.pyc\u0027\u003e","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"}],"tox.ini":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c3dbc41b21cbece697f5d297d6413f872927f732","unresolved":false,"context_lines":[{"line_number":59,"context_line":"enable-extensions \u003d H106,H203"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"# TODO(dougw) neutron/tests/unit/vmware exclusion is a temporary services split hack"},{"line_number":62,"context_line":"exclude \u003d .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios,neutron/tests/unit/vmware*,releasenotes,kuryr_kubernetes/pod_resources/api_pb2*"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"[testenv:pylint]"},{"line_number":65,"context_line":"basepython \u003d python3"}],"source_content_type":"text/x-properties","patch_set":6,"id":"3fce034c_5dbf6060","line":62,"range":{"start_line":62,"start_character":134,"end_line":62,"end_character":173},"updated":"2019-04-19 10:43:18.000000000","message":"Why is that needed? Because code is autogenerated?","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"},{"author":{"_account_id":30247,"name":"Ilya Maximets","email":"i.maximets@ovn.org","username":"i.maximets"},"change_message_id":"44b6747bed1c6c312ee929aa64e4cdfa056270fa","unresolved":false,"context_lines":[{"line_number":59,"context_line":"enable-extensions \u003d H106,H203"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"# TODO(dougw) neutron/tests/unit/vmware exclusion is a temporary services split hack"},{"line_number":62,"context_line":"exclude \u003d .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios,neutron/tests/unit/vmware*,releasenotes,kuryr_kubernetes/pod_resources/api_pb2*"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"[testenv:pylint]"},{"line_number":65,"context_line":"basepython \u003d python3"}],"source_content_type":"text/x-properties","patch_set":6,"id":"3fce034c_2054abfd","line":62,"range":{"start_line":62,"start_character":134,"end_line":62,"end_character":173},"in_reply_to":"3fce034c_5dbf6060","updated":"2019-04-19 11:06:31.000000000","message":"Yes. The code is autogenerated and breaks a lot of PEP8 rules.","commit_id":"74f83b8834f5b988ee63f02330b03f1a9afa2a68"}]}
