)]}'
{"doc/source/index.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"responder to the network and talking to"},{"line_number":14,"context_line":"`libvirt \u003chttps://en.wikipedia.org/wiki/Libvirt\u003e`_"},{"line_number":15,"context_line":"at the host vBMC is running at to manipulate virtual machines which pretend"},{"line_number":16,"context_line":"to be bare metal servers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Contents:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_4bfea005","line":16,"updated":"2018-06-11 16:29:14.000000000","message":"nit: unrelated change (this change is big enough without it..)","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":13,"context_line":"responder to the network and talking to"},{"line_number":14,"context_line":"`libvirt \u003chttps://en.wikipedia.org/wiki/Libvirt\u003e`_"},{"line_number":15,"context_line":"at the host vBMC is running at to manipulate virtual machines which pretend"},{"line_number":16,"context_line":"to be bare metal servers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Contents:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_807f7cdd","line":16,"in_reply_to":"5f7c97a3_4bfea005","updated":"2018-06-13 16:37:45.000000000","message":"Eh, it still improves the situation. But I agree, this is a huge patch. :(","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":13,"context_line":"responder to the network and talking to"},{"line_number":14,"context_line":"`libvirt \u003chttps://en.wikipedia.org/wiki/Libvirt\u003e`_"},{"line_number":15,"context_line":"at the host vBMC is running at to manipulate virtual machines which pretend"},{"line_number":16,"context_line":"to be bare metal servers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Contents:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_d29afc6d","line":16,"in_reply_to":"5f7c97a3_4bfea005","updated":"2018-06-15 12:38:43.000000000","message":"right, but it\u0027s too late now ;)","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":13,"context_line":"responder to the network and talking to"},{"line_number":14,"context_line":"`libvirt \u003chttps://en.wikipedia.org/wiki/Libvirt\u003e`_"},{"line_number":15,"context_line":"at the host vBMC is running at to manipulate virtual machines which pretend"},{"line_number":16,"context_line":"to be bare metal servers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Contents:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_3277b03e","line":16,"in_reply_to":"5f7c97a3_807f7cdd","updated":"2018-06-15 12:38:43.000000000","message":"I am sorry for it\u0027s being so huge. It is really hard to split it apart and keep things functional.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"doc/source/user/index.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2965c3e3aba8a7c828e62f3f493588762d99c8d9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":73,"context_line":"    | Domain name |   Admin/Status  | Address | Port |"},{"line_number":74,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":75,"context_line":"    |    node-0   | running/running |    ::   | 6230 |"},{"line_number":76,"context_line":"    |    node-1   | down/down       |    ::   | 6231 |"},{"line_number":77,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3f4b6375_22329411","line":75,"updated":"2017-10-23 10:03:41.000000000","message":"let\u0027s not make this change, it will break anyone reading the output","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"519509e0c6b4acde47a09013c4a9fc9510dac90e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":73,"context_line":"    | Domain name |   Admin/Status  | Address | Port |"},{"line_number":74,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":75,"context_line":"    |    node-0   | running/running |    ::   | 6230 |"},{"line_number":76,"context_line":"    |    node-1   | down/down       |    ::   | 6231 |"},{"line_number":77,"context_line":"    +-------------+-----------------+---------+------+"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"1f9dbf25_8c6c5c09","line":75,"in_reply_to":"3f4b6375_22329411","updated":"2018-02-28 15:32:18.000000000","message":"Done","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":12,"context_line":"client is merely a command-line tool sending commands to the server and"},{"line_number":13,"context_line":"rendering responses to the user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"You should set up your systemd to invoke the *vbmcd* server or you can"},{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"}],"source_content_type":"text/x-rst","patch_set":22,"id":"df7087c5_4bf4985b","line":15,"range":{"start_line":15,"start_character":23,"end_line":15,"end_character":30},"updated":"2018-03-12 12:50:45.000000000","message":"Let\u0027s add an example systemd unit file to the documentation?\nOr do we prefer not to, and add this in packaging?","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":12,"context_line":"client is merely a command-line tool sending commands to the server and"},{"line_number":13,"context_line":"rendering responses to the user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"You should set up your systemd to invoke the *vbmcd* server or you can"},{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"}],"source_content_type":"text/x-rst","patch_set":22,"id":"df7087c5_51f1aacc","line":15,"range":{"start_line":15,"start_character":23,"end_line":15,"end_character":30},"in_reply_to":"df7087c5_4bf4985b","updated":"2018-03-12 15:34:41.000000000","message":"Given how impossible this patch already is, I\u0027d propose to ship the actual systemd unit along with the tool as a followup patch.\n\nWDYT?","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"d63340f11a79b0862c58c9c4750f4a9f9b1bd167","unresolved":false,"context_lines":[{"line_number":12,"context_line":"client is merely a command-line tool sending commands to the server and"},{"line_number":13,"context_line":"rendering responses to the user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"You should set up your systemd to invoke the *vbmcd* server or you can"},{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"}],"source_content_type":"text/x-rst","patch_set":22,"id":"df7087c5_06167ba9","line":15,"range":{"start_line":15,"start_character":23,"end_line":15,"end_character":30},"in_reply_to":"df7087c5_51f1aacc","updated":"2018-03-13 09:04:53.000000000","message":"Yes, sounds good.","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":27,"context_line":"The ``vbmc`` is a CLI that lets users create, delete, list, start and stop"},{"line_number":28,"context_line":"virtual BMCs for controlling virtual machines using IPMI commands."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* In order to see all command options supporter by ``vbmc`` do::"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    $ vbmc --help"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"df7087c5_5995763f","line":30,"range":{"start_line":30,"start_character":38,"end_line":30,"end_character":47},"updated":"2018-03-12 12:50:45.000000000","message":"s/supporter/supported/","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"The ``vbmc`` is a CLI that lets users create, delete, list, start and stop"},{"line_number":28,"context_line":"virtual BMCs for controlling virtual machines using IPMI commands."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* In order to see all command options supporter by ``vbmc`` do::"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    $ vbmc --help"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"df7087c5_91d0a221","line":30,"range":{"start_line":30,"start_character":38,"end_line":30,"end_character":47},"in_reply_to":"df7087c5_5995763f","updated":"2018-03-12 15:34:41.000000000","message":"Done","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Configuring virtual servers"},{"line_number":25,"context_line":"---------------------------"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"The ``vbmc`` is a CLI that lets users create, delete, list, start and stop"},{"line_number":28,"context_line":"virtual BMCs for controlling virtual machines using IPMI commands."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* In order to see all command options supported by ``vbmc`` do::"}],"source_content_type":"text/x-rst","patch_set":28,"id":"df7087c5_1ba61b55","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":4},"updated":"2018-03-20 17:07:23.000000000","message":"nit: This reads awkwardly and is kind of redundant. Reading \"The thing is a CLI\" or \"Thing is a CLI\"\n\n*shrugs*","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Configuring virtual servers"},{"line_number":25,"context_line":"---------------------------"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"The ``vbmc`` is a CLI that lets users create, delete, list, start and stop"},{"line_number":28,"context_line":"virtual BMCs for controlling virtual machines using IPMI commands."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* In order to see all command options supported by ``vbmc`` do::"}],"source_content_type":"text/x-rst","patch_set":28,"id":"df7087c5_6c3d08dc","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":4},"in_reply_to":"df7087c5_1ba61b55","updated":"2018-03-21 11:46:13.000000000","message":"Done","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"How to use Virtual BMC"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"For the Virtual BMC tool to operate you first need to create libvirt"}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_44ad26e7","line":2,"updated":"2018-04-23 14:34:52.000000000","message":"nit: we seem to call it VirtualBMC","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"How to use Virtual BMC"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"For the Virtual BMC tool to operate you first need to create libvirt"}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_0fc4275e","line":2,"in_reply_to":"9f6a8fd7_44ad26e7","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"For the Virtual BMC tool to operate you first need to create libvirt"},{"line_number":6,"context_line":"domain(s) likely via ``virsh``. Or you can reuse any of the existing"},{"line_number":7,"context_line":"domains if you do not mind bringing them up and down by way of"},{"line_number":8,"context_line":"managing the simulated servers."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_e4b55a33","line":6,"updated":"2018-04-23 14:34:52.000000000","message":"nit: \"(for example, via ``virsh``).\"","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"For the Virtual BMC tool to operate you first need to create libvirt"},{"line_number":6,"context_line":"domain(s) likely via ``virsh``. Or you can reuse any of the existing"},{"line_number":7,"context_line":"domains if you do not mind bringing them up and down by way of"},{"line_number":8,"context_line":"managing the simulated servers."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_4f93ff5b","line":6,"in_reply_to":"9f6a8fd7_e4b55a33","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"Virtual BMC instances over the network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Configuring virtual servers"},{"line_number":25,"context_line":"---------------------------"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_04b3ae4e","line":23,"updated":"2018-04-23 14:34:52.000000000","message":"any help on starting the server?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"Virtual BMC instances over the network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Configuring virtual servers"},{"line_number":25,"context_line":"---------------------------"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"9f6a8fd7_cf1aafca","line":23,"in_reply_to":"9f6a8fd7_04b3ae4e","updated":"2018-04-23 18:12:10.000000000","message":"Are you referring to a systemd unit here?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":5,"context_line":"For the VirtualBMC tool to operate you first need to create libvirt"},{"line_number":6,"context_line":"domain(s) for example, via ``virsh``. Or you can reuse any of the existing"},{"line_number":7,"context_line":"domains if you do not mind bringing them up and down by way of"},{"line_number":8,"context_line":"managing the simulated servers."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"The VirtualBMC tool is a client-server system where ``vbmcd`` server"},{"line_number":11,"context_line":"does all the heavy-lifting (speaks IPMI, calls libvirt) while ``vbmc``"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_4819c685","line":8,"updated":"2018-06-11 16:29:14.000000000","message":"I\u0027d drop the second sentence, it\u0027s kind of obvious.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":5,"context_line":"For the VirtualBMC tool to operate you first need to create libvirt"},{"line_number":6,"context_line":"domain(s) for example, via ``virsh``. Or you can reuse any of the existing"},{"line_number":7,"context_line":"domains if you do not mind bringing them up and down by way of"},{"line_number":8,"context_line":"managing the simulated servers."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"The VirtualBMC tool is a client-server system where ``vbmcd`` server"},{"line_number":11,"context_line":"does all the heavy-lifting (speaks IPMI, calls libvirt) while ``vbmc``"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_2d13e666","line":8,"in_reply_to":"5f7c97a3_4819c685","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":12,"context_line":"client is merely a command-line tool sending commands to the server and"},{"line_number":13,"context_line":"rendering responses to the user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"You should set up your systemd to invoke the *vbmcd* server or you can"},{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_681e0271","line":15,"updated":"2018-06-11 16:29:14.000000000","message":"\"launch the ``vbmcd`` server on system start up\"","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":12,"context_line":"client is merely a command-line tool sending commands to the server and"},{"line_number":13,"context_line":"rendering responses to the user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"You should set up your systemd to invoke the *vbmcd* server or you can"},{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_d50e7c32","line":15,"in_reply_to":"5f7c97a3_681e0271","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_080f4e39","line":19,"updated":"2018-06-11 16:29:14.000000000","message":"Worth mentioning that ``vbmc`` only works on the same host as the server","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_9546c450","line":19,"in_reply_to":"5f7c97a3_080f4e39","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"26cda0368e98c7a70d786ad8a147418ed2792c25","unresolved":false,"context_lines":[{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_6357f75b","line":19,"in_reply_to":"5f7c97a3_080f4e39","updated":"2018-06-12 06:56:38.000000000","message":"Is this true? I use vbmc in a CentOS VM to manage libvirt domains on a Fedora server. Simply add ssh things to the --libvirt-uri option:\nvbmc add --port 6230 --libvirt-uri qemu+ssh://virtbmc@192.168.122.1/system os-ctl0\n\nThe virtbmc user on the kvm hypervisor have permissions to manage libvirt, and the user running vbmc\u0027s ssh key is in authorized_keys of virtbmc user on the hypervisor.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f3fe68a14e1597d26f8e77b139803637d6807533","unresolved":false,"context_lines":[{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_76b6d7fb","line":19,"in_reply_to":"5f7c97a3_6357f75b","updated":"2018-06-12 07:36:06.000000000","message":"I rather meant that vbmc and vbmcd have to be on the same machine. libvirt VMs can indeed be remote.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":16,"context_line":"just run ``vbmcd`` from command line if you do not need the tool running"},{"line_number":17,"context_line":"persistently on the system. Once the server is up and running, you can use"},{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_f5be18ff","line":19,"in_reply_to":"5f7c97a3_6357f75b","updated":"2018-06-15 12:38:43.000000000","message":"This is a useful hint, added to docs!","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Configuring virtual servers"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_28148a4c","line":21,"updated":"2018-06-11 16:29:14.000000000","message":"\"be able to manage VirtualBMC nodes via ``ipmitool``\"","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":18,"context_line":"the ``vbmc`` tool to configure your libvirt domains as if they were physical"},{"line_number":19,"context_line":"hardware servers."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"By this moment you should be able to have the ``ipmitool`` managing"},{"line_number":22,"context_line":"VirtualBMC instances over the network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Configuring virtual servers"}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_95bb240e","line":21,"in_reply_to":"5f7c97a3_28148a4c","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"In the past the ``vbmc`` tool was the only part of the vBMC system. To help"},{"line_number":125,"context_line":"users keeping their existing server-less workflows, the ``vbmc`` tool"},{"line_number":126,"context_line":"attempts to spawn the ``vbmcd`` piece whenever it figures server is not"},{"line_number":127,"context_line":"running."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_c80cf643","line":127,"updated":"2018-06-11 16:29:14.000000000","message":"Let\u0027s mention that we plan to remove it after Rocky","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":124,"context_line":"In the past the ``vbmc`` tool was the only part of the vBMC system. To help"},{"line_number":125,"context_line":"users keeping their existing server-less workflows, the ``vbmc`` tool"},{"line_number":126,"context_line":"attempts to spawn the ``vbmcd`` piece whenever it figures server is not"},{"line_number":127,"context_line":"running."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_95fec4ad","line":127,"in_reply_to":"5f7c97a3_4056445e","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":124,"context_line":"In the past the ``vbmc`` tool was the only part of the vBMC system. To help"},{"line_number":125,"context_line":"users keeping their existing server-less workflows, the ``vbmc`` tool"},{"line_number":126,"context_line":"attempts to spawn the ``vbmcd`` piece whenever it figures server is not"},{"line_number":127,"context_line":"running."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_f5f138e0","line":127,"in_reply_to":"5f7c97a3_c80cf643","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":124,"context_line":"In the past the ``vbmc`` tool was the only part of the vBMC system. To help"},{"line_number":125,"context_line":"users keeping their existing server-less workflows, the ``vbmc`` tool"},{"line_number":126,"context_line":"attempts to spawn the ``vbmcd`` piece whenever it figures server is not"},{"line_number":127,"context_line":"running."}],"source_content_type":"text/x-rst","patch_set":33,"id":"5f7c97a3_4056445e","line":127,"in_reply_to":"5f7c97a3_c80cf643","updated":"2018-06-13 16:37:45.000000000","message":"while not a client, it is cli behavior. I\u0027d lean for 2 cycles instead of 1... or 1, then add a big nasty error, then remove the following cycle.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"lower-constraints.txt":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"restructuredtext-lint\u003d\u003d1.1.1"},{"line_number":47,"context_line":"six\u003d\u003d1.10.0"},{"line_number":48,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":49,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":50,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"},{"line_number":51,"context_line":"stestr\u003d\u003d1.0.0"},{"line_number":52,"context_line":"stevedore\u003d\u003d1.20.0"}],"source_content_type":"text/plain","patch_set":33,"id":"5f7c97a3_6835a2f6","line":49,"updated":"2018-06-11 16:29:14.000000000","message":"unrelated (should be done separately)","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":46,"context_line":"restructuredtext-lint\u003d\u003d1.1.1"},{"line_number":47,"context_line":"six\u003d\u003d1.10.0"},{"line_number":48,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":49,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":50,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"},{"line_number":51,"context_line":"stestr\u003d\u003d1.0.0"},{"line_number":52,"context_line":"stevedore\u003d\u003d1.20.0"}],"source_content_type":"text/plain","patch_set":33,"id":"5f7c97a3_204788a5","line":49,"in_reply_to":"5f7c97a3_6835a2f6","updated":"2018-06-13 16:37:45.000000000","message":"++","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":46,"context_line":"restructuredtext-lint\u003d\u003d1.1.1"},{"line_number":47,"context_line":"six\u003d\u003d1.10.0"},{"line_number":48,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":49,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":50,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"},{"line_number":51,"context_line":"stestr\u003d\u003d1.0.0"},{"line_number":52,"context_line":"stevedore\u003d\u003d1.20.0"}],"source_content_type":"text/plain","patch_set":33,"id":"5f7c97a3_52958c31","line":49,"in_reply_to":"5f7c97a3_6835a2f6","updated":"2018-06-15 12:38:43.000000000","message":"Well, yes, next time. ;)","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"virtualbmc/cmd/vbmc.py":[{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def main():"},{"line_number":37,"context_line":"    parser \u003d argparse.ArgumentParser("},{"line_number":38,"context_line":"        prog\u003d\u0027Virtual BMC admin tool\u0027,"},{"line_number":39,"context_line":"        description\u003d\u0027A virtual BMC for controlling virtual instances\u0027,"},{"line_number":40,"context_line":"    )"},{"line_number":41,"context_line":"    parser.add_argument(\u0027--version\u0027,"},{"line_number":42,"context_line":"                        dest\u003d\u0027_version\u0027,"},{"line_number":43,"context_line":"                        action\u003d\u0027version\u0027,"},{"line_number":44,"context_line":"                        version\u003dvirtualbmc.__version__)"},{"line_number":45,"context_line":"    parser.add_argument(\u0027--no-daemon\u0027,"},{"line_number":46,"context_line":"                        dest\u003d\u0027_no_daemon\u0027,"},{"line_number":47,"context_line":"                        action\u003d\u0027store_true\u0027,"},{"line_number":48,"context_line":"                        default\u003dFalse,"},{"line_number":49,"context_line":"                        help\u003d\u0027Do not attempt to start vBMC daemon if not \u0027"},{"line_number":50,"context_line":"                             \u0027running\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    subparsers \u003d parser.add_subparsers(dest\u003d\u0027command\u0027)"},{"line_number":53,"context_line":"    subparsers.required \u003d True"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # http://bugs.python.org/issue9253#msg186387"},{"line_number":56,"context_line":"    subparsers.required \u003d True"},{"line_number":57,"context_line":"    subparsers.dest \u003d \u0027command\u0027"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # create the parser for the \"add\" command"},{"line_number":60,"context_line":"    parser_add \u003d subparsers.add_parser(\u0027add\u0027, help\u003d\u0027Add a new virtual BMC\u0027)"},{"line_number":61,"context_line":"    parser_add.add_argument(\u0027domain_name\u0027,"},{"line_number":62,"context_line":"                            help\u003d\u0027The name of the virtual machine\u0027)"},{"line_number":63,"context_line":"    parser_add.add_argument(\u0027--username\u0027,"},{"line_number":64,"context_line":"                            dest\u003d\u0027username\u0027,"},{"line_number":65,"context_line":"                            default\u003d\u0027admin\u0027,"},{"line_number":66,"context_line":"                            help\u003d\u0027The BMC username; defaults to \"admin\"\u0027)"},{"line_number":67,"context_line":"    parser_add.add_argument(\u0027--password\u0027,"},{"line_number":68,"context_line":"                            dest\u003d\u0027password\u0027,"},{"line_number":69,"context_line":"                            default\u003d\u0027password\u0027,"},{"line_number":70,"context_line":"                            help\u003d\u0027The BMC password; defaults to \"password\"\u0027)"},{"line_number":71,"context_line":"    parser_add.add_argument(\u0027--port\u0027,"},{"line_number":72,"context_line":"                            dest\u003d\u0027port\u0027,"},{"line_number":73,"context_line":"                            type\u003dint,"},{"line_number":74,"context_line":"                            default\u003d623,"},{"line_number":75,"context_line":"                            help\u003d\u0027Port to listen on; defaults to 623\u0027)"},{"line_number":76,"context_line":"    parser_add.add_argument(\u0027--address\u0027,"},{"line_number":77,"context_line":"                            dest\u003d\u0027address\u0027,"},{"line_number":78,"context_line":"                            default\u003d\u0027::\u0027,"},{"line_number":79,"context_line":"                            help\u003d(\u0027The address to bind to (IPv4 and IPv6 \u0027"},{"line_number":80,"context_line":"                                  \u0027are supported); defaults to ::\u0027))"},{"line_number":81,"context_line":"    parser_add.add_argument(\u0027--libvirt-uri\u0027,"},{"line_number":82,"context_line":"                            dest\u003d\u0027libvirt_uri\u0027,"},{"line_number":83,"context_line":"                            default\u003d\"qemu:///system\","},{"line_number":84,"context_line":"                            help\u003d(\u0027The libvirt URI; defaults to \u0027"},{"line_number":85,"context_line":"                                  \u0027\"qemu:///system\"\u0027))"},{"line_number":86,"context_line":"    parser_add.add_argument(\u0027--libvirt-sasl-username\u0027,"},{"line_number":87,"context_line":"                            dest\u003d\u0027libvirt_sasl_username\u0027,"},{"line_number":88,"context_line":"                            default\u003dNone,"},{"line_number":89,"context_line":"                            help\u003d(\u0027The libvirt SASL username; defaults to \u0027"},{"line_number":90,"context_line":"                                  \u0027None\u0027))"},{"line_number":91,"context_line":"    parser_add.add_argument(\u0027--libvirt-sasl-password\u0027,"},{"line_number":92,"context_line":"                            dest\u003d\u0027libvirt_sasl_password\u0027,"},{"line_number":93,"context_line":"                            default\u003dNone,"},{"line_number":94,"context_line":"                            help\u003d(\u0027The libvirt SASL password; defaults to \u0027"},{"line_number":95,"context_line":"                                  \u0027None\u0027))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    # create the parser for the \"delete\" command"},{"line_number":98,"context_line":"    parser_delete \u003d subparsers.add_parser(\u0027delete\u0027,"},{"line_number":99,"context_line":"                                          help\u003d\u0027Delete a virtual BMC\u0027)"},{"line_number":100,"context_line":"    parser_delete.add_argument(\u0027domain_names\u0027, nargs\u003d\u0027+\u0027,"},{"line_number":101,"context_line":"                               help\u003d\u0027A list of virtual machine names\u0027)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # create the parser for the \"start\" command"},{"line_number":104,"context_line":"    parser_start \u003d subparsers.add_parser(\u0027start\u0027, help\u003d\u0027Start a virtual BMC\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_c121bb4f","line":101,"range":{"start_line":37,"start_character":4,"end_line":101,"end_character":70},"updated":"2017-09-12 11:11:43.000000000","message":"nit (readability) make it a separate function to enhance the readability of the main function","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def main():"},{"line_number":37,"context_line":"    parser \u003d argparse.ArgumentParser("},{"line_number":38,"context_line":"        prog\u003d\u0027Virtual BMC admin tool\u0027,"},{"line_number":39,"context_line":"        description\u003d\u0027A virtual BMC for controlling virtual instances\u0027,"},{"line_number":40,"context_line":"    )"},{"line_number":41,"context_line":"    parser.add_argument(\u0027--version\u0027,"},{"line_number":42,"context_line":"                        dest\u003d\u0027_version\u0027,"},{"line_number":43,"context_line":"                        action\u003d\u0027version\u0027,"},{"line_number":44,"context_line":"                        version\u003dvirtualbmc.__version__)"},{"line_number":45,"context_line":"    parser.add_argument(\u0027--no-daemon\u0027,"},{"line_number":46,"context_line":"                        dest\u003d\u0027_no_daemon\u0027,"},{"line_number":47,"context_line":"                        action\u003d\u0027store_true\u0027,"},{"line_number":48,"context_line":"                        default\u003dFalse,"},{"line_number":49,"context_line":"                        help\u003d\u0027Do not attempt to start vBMC daemon if not \u0027"},{"line_number":50,"context_line":"                             \u0027running\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    subparsers \u003d parser.add_subparsers(dest\u003d\u0027command\u0027)"},{"line_number":53,"context_line":"    subparsers.required \u003d True"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # http://bugs.python.org/issue9253#msg186387"},{"line_number":56,"context_line":"    subparsers.required \u003d True"},{"line_number":57,"context_line":"    subparsers.dest \u003d \u0027command\u0027"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # create the parser for the \"add\" command"},{"line_number":60,"context_line":"    parser_add \u003d subparsers.add_parser(\u0027add\u0027, help\u003d\u0027Add a new virtual BMC\u0027)"},{"line_number":61,"context_line":"    parser_add.add_argument(\u0027domain_name\u0027,"},{"line_number":62,"context_line":"                            help\u003d\u0027The name of the virtual machine\u0027)"},{"line_number":63,"context_line":"    parser_add.add_argument(\u0027--username\u0027,"},{"line_number":64,"context_line":"                            dest\u003d\u0027username\u0027,"},{"line_number":65,"context_line":"                            default\u003d\u0027admin\u0027,"},{"line_number":66,"context_line":"                            help\u003d\u0027The BMC username; defaults to \"admin\"\u0027)"},{"line_number":67,"context_line":"    parser_add.add_argument(\u0027--password\u0027,"},{"line_number":68,"context_line":"                            dest\u003d\u0027password\u0027,"},{"line_number":69,"context_line":"                            default\u003d\u0027password\u0027,"},{"line_number":70,"context_line":"                            help\u003d\u0027The BMC password; defaults to \"password\"\u0027)"},{"line_number":71,"context_line":"    parser_add.add_argument(\u0027--port\u0027,"},{"line_number":72,"context_line":"                            dest\u003d\u0027port\u0027,"},{"line_number":73,"context_line":"                            type\u003dint,"},{"line_number":74,"context_line":"                            default\u003d623,"},{"line_number":75,"context_line":"                            help\u003d\u0027Port to listen on; defaults to 623\u0027)"},{"line_number":76,"context_line":"    parser_add.add_argument(\u0027--address\u0027,"},{"line_number":77,"context_line":"                            dest\u003d\u0027address\u0027,"},{"line_number":78,"context_line":"                            default\u003d\u0027::\u0027,"},{"line_number":79,"context_line":"                            help\u003d(\u0027The address to bind to (IPv4 and IPv6 \u0027"},{"line_number":80,"context_line":"                                  \u0027are supported); defaults to ::\u0027))"},{"line_number":81,"context_line":"    parser_add.add_argument(\u0027--libvirt-uri\u0027,"},{"line_number":82,"context_line":"                            dest\u003d\u0027libvirt_uri\u0027,"},{"line_number":83,"context_line":"                            default\u003d\"qemu:///system\","},{"line_number":84,"context_line":"                            help\u003d(\u0027The libvirt URI; defaults to \u0027"},{"line_number":85,"context_line":"                                  \u0027\"qemu:///system\"\u0027))"},{"line_number":86,"context_line":"    parser_add.add_argument(\u0027--libvirt-sasl-username\u0027,"},{"line_number":87,"context_line":"                            dest\u003d\u0027libvirt_sasl_username\u0027,"},{"line_number":88,"context_line":"                            default\u003dNone,"},{"line_number":89,"context_line":"                            help\u003d(\u0027The libvirt SASL username; defaults to \u0027"},{"line_number":90,"context_line":"                                  \u0027None\u0027))"},{"line_number":91,"context_line":"    parser_add.add_argument(\u0027--libvirt-sasl-password\u0027,"},{"line_number":92,"context_line":"                            dest\u003d\u0027libvirt_sasl_password\u0027,"},{"line_number":93,"context_line":"                            default\u003dNone,"},{"line_number":94,"context_line":"                            help\u003d(\u0027The libvirt SASL password; defaults to \u0027"},{"line_number":95,"context_line":"                                  \u0027None\u0027))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    # create the parser for the \"delete\" command"},{"line_number":98,"context_line":"    parser_delete \u003d subparsers.add_parser(\u0027delete\u0027,"},{"line_number":99,"context_line":"                                          help\u003d\u0027Delete a virtual BMC\u0027)"},{"line_number":100,"context_line":"    parser_delete.add_argument(\u0027domain_names\u0027, nargs\u003d\u0027+\u0027,"},{"line_number":101,"context_line":"                               help\u003d\u0027A list of virtual machine names\u0027)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # create the parser for the \"start\" command"},{"line_number":104,"context_line":"    parser_start \u003d subparsers.add_parser(\u0027start\u0027, help\u003d\u0027Start a virtual BMC\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_1cf931c7","line":101,"range":{"start_line":37,"start_character":4,"end_line":101,"end_character":70},"in_reply_to":"5f2577a7_c121bb4f","updated":"2018-03-04 20:24:04.000000000","message":"This code has been refactored into cliff:\n\nhttps://review.openstack.org/548594","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # create the parser for the \"start\" command"},{"line_number":104,"context_line":"    parser_start \u003d subparsers.add_parser(\u0027start\u0027, help\u003d\u0027Start a virtual BMC\u0027)"},{"line_number":105,"context_line":"    parser_start.add_argument(\u0027domain_names\u0027, nargs\u003d\u0027+\u0027,"},{"line_number":106,"context_line":"                              help\u003d\u0027The name of the virtual machine\u0027)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # create the parser for the \"stop\" command"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_c1dc1b76","line":105,"range":{"start_line":105,"start_character":42,"end_line":105,"end_character":56},"updated":"2017-09-12 11:11:43.000000000","message":"nit: add a note to some change-log about this CLI interface change","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # create the parser for the \"start\" command"},{"line_number":104,"context_line":"    parser_start \u003d subparsers.add_parser(\u0027start\u0027, help\u003d\u0027Start a virtual BMC\u0027)"},{"line_number":105,"context_line":"    parser_start.add_argument(\u0027domain_names\u0027, nargs\u003d\u0027+\u0027,"},{"line_number":106,"context_line":"                              help\u003d\u0027The name of the virtual machine\u0027)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    # create the parser for the \"stop\" command"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_f95a454e","line":105,"range":{"start_line":105,"start_character":42,"end_line":105,"end_character":56},"in_reply_to":"5f2577a7_c1dc1b76","updated":"2018-03-04 20:24:04.000000000","message":"there is no currently reno for virtualbmc, so I added that note to the commit message","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    args \u003d parser.parse_args()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    data_out \u003d {attr: getattr(args, attr)"},{"line_number":124,"context_line":"                for attr in dir(args) if not attr.startswith(\u0027_\u0027)}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    data_out \u003d json.dumps(data_out)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    server_socket \u003d CONF[\u0027default\u0027][\u0027server_sock\u0027]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    client_socket \u003d os.path.join("},{"line_number":131,"context_line":"        os.path.dirname(server_socket), str(os.getpid()) + \u0027.sock\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def talk_to_server(data_out):"},{"line_number":135,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_a147cf1d","line":132,"range":{"start_line":123,"start_character":4,"end_line":132,"end_character":5},"updated":"2017-09-12 11:11:43.000000000","message":"nit (readability): either put in a function or document what\u0027s the goal of this code (propagate the args to the server)","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    args \u003d parser.parse_args()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    data_out \u003d {attr: getattr(args, attr)"},{"line_number":124,"context_line":"                for attr in dir(args) if not attr.startswith(\u0027_\u0027)}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    data_out \u003d json.dumps(data_out)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    server_socket \u003d CONF[\u0027default\u0027][\u0027server_sock\u0027]"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    client_socket \u003d os.path.join("},{"line_number":131,"context_line":"        os.path.dirname(server_socket), str(os.getpid()) + \u0027.sock\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def talk_to_server(data_out):"},{"line_number":135,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_7934f5fb","line":132,"range":{"start_line":123,"start_character":4,"end_line":132,"end_character":5},"in_reply_to":"5f2577a7_a147cf1d","updated":"2018-03-04 20:24:04.000000000","message":"This has been refactored into ZMQ transport what removed this code in further commits.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            try:"},{"line_number":145,"context_line":"                server.close()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_016d8303","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":20},"updated":"2017-09-12 11:11:43.000000000","message":"probably log the error at least","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            try:"},{"line_number":145,"context_line":"                server.close()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_393e6dda","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":20},"in_reply_to":"5f2577a7_016d8303","updated":"2018-03-04 20:24:04.000000000","message":"This has been refactored into ZMQ transport what removed this code in further commits.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_617d67b0","line":154,"range":{"start_line":153,"start_character":12,"end_line":154,"end_character":20},"updated":"2017-09-12 11:11:43.000000000","message":"maybe debug level log the exception to help locate issues...","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        os.path.dirname(server_socket), str(os.getpid()) + \u0027.sock\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def talk_to_server(data_out):"},{"line_number":135,"context_line":"        try:"},{"line_number":136,"context_line":"            server \u003d socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)"},{"line_number":137,"context_line":"            server.settimeout(SERVER_TIMEOUT)"},{"line_number":138,"context_line":"            server.bind(client_socket)"},{"line_number":139,"context_line":"            server.connect(server_socket)"},{"line_number":140,"context_line":"            server.send(data_out.encode(\u0027utf-8\u0027))"},{"line_number":141,"context_line":"            return server.recv(8192)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        finally:"},{"line_number":144,"context_line":"            try:"},{"line_number":145,"context_line":"                server.close()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_c1f89bc5","line":154,"range":{"start_line":134,"start_character":2,"end_line":154,"end_character":20},"updated":"2017-09-12 11:11:43.000000000","message":"nit (readability): to avoid disturbing the flow of reading of the code, would be nicer to have it as a \"private\" function in the module, probably a def _talk_to_server?","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_d92429c9","line":154,"range":{"start_line":153,"start_character":12,"end_line":154,"end_character":20},"in_reply_to":"5f2577a7_617d67b0","updated":"2018-03-04 20:24:04.000000000","message":"This has been refactored into ZMQ transport what removed this code in further commits.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        os.path.dirname(server_socket), str(os.getpid()) + \u0027.sock\u0027"},{"line_number":132,"context_line":"    )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def talk_to_server(data_out):"},{"line_number":135,"context_line":"        try:"},{"line_number":136,"context_line":"            server \u003d socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)"},{"line_number":137,"context_line":"            server.settimeout(SERVER_TIMEOUT)"},{"line_number":138,"context_line":"            server.bind(client_socket)"},{"line_number":139,"context_line":"            server.connect(server_socket)"},{"line_number":140,"context_line":"            server.send(data_out.encode(\u0027utf-8\u0027))"},{"line_number":141,"context_line":"            return server.recv(8192)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        finally:"},{"line_number":144,"context_line":"            try:"},{"line_number":145,"context_line":"                server.close()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"            except Exception:"},{"line_number":148,"context_line":"                pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            try:"},{"line_number":151,"context_line":"                os.remove(client_socket)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_f91fa56d","line":154,"range":{"start_line":134,"start_character":2,"end_line":154,"end_character":20},"in_reply_to":"5f2577a7_c1f89bc5","updated":"2018-03-04 20:24:04.000000000","message":"The function in question has been in-lined.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            LOG.debug(\u0027Server at %(sock)s connection error: \u0027"},{"line_number":163,"context_line":"                      \u0027%(error)s\u0027, {\u0027sock\u0027: server_socket, \u0027error\u0027: ex})"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            if args._no_daemon:"},{"line_number":166,"context_line":"                return 1"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        args._no_daemon \u003d True"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_619b2772","line":166,"range":{"start_line":165,"start_character":11,"end_line":166,"end_character":24},"updated":"2017-09-12 11:11:43.000000000","message":"I\u0027d LOG.info the user that you\u0027re not forking the daemon (anymore) so just exiting.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            LOG.debug(\u0027Server at %(sock)s connection error: \u0027"},{"line_number":163,"context_line":"                      \u0027%(error)s\u0027, {\u0027sock\u0027: server_socket, \u0027error\u0027: ex})"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            if args._no_daemon:"},{"line_number":166,"context_line":"                return 1"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        args._no_daemon \u003d True"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_791dd571","line":166,"range":{"start_line":165,"start_character":11,"end_line":166,"end_character":24},"in_reply_to":"5f2577a7_619b2772","updated":"2018-03-04 20:24:04.000000000","message":"Done","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"},{"line_number":158,"context_line":"            data_in \u003d talk_to_server(data_out)"},{"line_number":159,"context_line":"            break"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        except socket.error as ex:"},{"line_number":162,"context_line":"            LOG.debug(\u0027Server at %(sock)s connection error: \u0027"},{"line_number":163,"context_line":"                      \u0027%(error)s\u0027, {\u0027sock\u0027: server_socket, \u0027error\u0027: ex})"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            if args._no_daemon:"},{"line_number":166,"context_line":"                return 1"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        args._no_daemon \u003d True"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        LOG.debug(\"Attempting to start vBMC daemon behind the scenes...\")"},{"line_number":171,"context_line":"        LOG.debug(\"Please, configure your system to manage vbmcd by systemd!\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # attempt to start and daemonize the server"},{"line_number":174,"context_line":"        if os.fork() \u003d\u003d 0:"},{"line_number":175,"context_line":"            # this will also fork and detach properly"},{"line_number":176,"context_line":"            vbmcd.main([])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        time.sleep(1)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    try:"},{"line_number":181,"context_line":"        data_in \u003d json.loads(data_in.decode(\u0027utf-8\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_411a6b7d","line":178,"range":{"start_line":156,"start_character":3,"end_line":178,"end_character":21},"updated":"2017-09-12 11:11:43.000000000","message":"this block loops and does couple of things, maybe would be good to put in a function: def send_maybe_spawn? ;)","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            except Exception:"},{"line_number":154,"context_line":"                pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    while True:"},{"line_number":157,"context_line":"        try:"},{"line_number":158,"context_line":"            data_in \u003d talk_to_server(data_out)"},{"line_number":159,"context_line":"            break"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        except socket.error as ex:"},{"line_number":162,"context_line":"            LOG.debug(\u0027Server at %(sock)s connection error: \u0027"},{"line_number":163,"context_line":"                      \u0027%(error)s\u0027, {\u0027sock\u0027: server_socket, \u0027error\u0027: ex})"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            if args._no_daemon:"},{"line_number":166,"context_line":"                return 1"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        args._no_daemon \u003d True"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        LOG.debug(\"Attempting to start vBMC daemon behind the scenes...\")"},{"line_number":171,"context_line":"        LOG.debug(\"Please, configure your system to manage vbmcd by systemd!\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # attempt to start and daemonize the server"},{"line_number":174,"context_line":"        if os.fork() \u003d\u003d 0:"},{"line_number":175,"context_line":"            # this will also fork and detach properly"},{"line_number":176,"context_line":"            vbmcd.main([])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        time.sleep(1)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    try:"},{"line_number":181,"context_line":"        data_in \u003d json.loads(data_in.decode(\u0027utf-8\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_1914d14d","line":178,"range":{"start_line":156,"start_character":3,"end_line":178,"end_character":21},"in_reply_to":"5f2577a7_411a6b7d","updated":"2018-03-04 20:24:04.000000000","message":"Hmm, I\u0027d probably lean towards leaving it as-is. May be it is not that unreadable after refactoring?","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    rc \u003d data_in.get(\u0027rc\u0027)"},{"line_number":188,"context_line":"    if rc:"},{"line_number":189,"context_line":"        print(\u0027ERROR (%(rc)s): %(msg)s\u0027 % {"},{"line_number":190,"context_line":"            \u0027rc\u0027: rc,"},{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_e18717d7","line":192,"range":{"start_line":189,"start_character":8,"end_line":192,"end_character":10},"updated":"2017-09-12 11:11:43.000000000","message":"nit-ish: this seems like reinventing the LOG.error but if the goal is to maintain the status-quo I\u0027m OK. Just the formatting won\u0027t be configurable as opposed to oslo.log (timestamps etc.) maybe it\u0027s OK though","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    rc \u003d data_in.get(\u0027rc\u0027)"},{"line_number":188,"context_line":"    if rc:"},{"line_number":189,"context_line":"        print(\u0027ERROR (%(rc)s): %(msg)s\u0027 % {"},{"line_number":190,"context_line":"            \u0027rc\u0027: rc,"},{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_340c343a","line":192,"range":{"start_line":189,"start_character":8,"end_line":192,"end_character":10},"in_reply_to":"5f2577a7_e18717d7","updated":"2018-03-04 20:24:04.000000000","message":"Oh, yes! The goal is to preserve the call interface as much as we can... Or CI hell breaks loose...","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        time.sleep(1)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    try:"},{"line_number":181,"context_line":"        data_in \u003d json.loads(data_in.decode(\u0027utf-8\u0027))"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    except json.JSONDecodeError as ex:"},{"line_number":184,"context_line":"        print(\u0027Server response parsing error %(error)s\u0027 % {\u0027error\u0027: ex})"},{"line_number":185,"context_line":"        return 1"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    rc \u003d data_in.get(\u0027rc\u0027)"},{"line_number":188,"context_line":"    if rc:"},{"line_number":189,"context_line":"        print(\u0027ERROR (%(rc)s): %(msg)s\u0027 % {"},{"line_number":190,"context_line":"            \u0027rc\u0027: rc,"},{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"},{"line_number":196,"context_line":"    if msg:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_fc08de28","line":193,"range":{"start_line":180,"start_character":0,"end_line":193,"end_character":17},"updated":"2017-09-12 11:11:43.000000000","message":"this as well may be worth a function as it deals specifically with receiving and decoding part of the protocol.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        time.sleep(1)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    try:"},{"line_number":181,"context_line":"        data_in \u003d json.loads(data_in.decode(\u0027utf-8\u0027))"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    except json.JSONDecodeError as ex:"},{"line_number":184,"context_line":"        print(\u0027Server response parsing error %(error)s\u0027 % {\u0027error\u0027: ex})"},{"line_number":185,"context_line":"        return 1"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    rc \u003d data_in.get(\u0027rc\u0027)"},{"line_number":188,"context_line":"    if rc:"},{"line_number":189,"context_line":"        print(\u0027ERROR (%(rc)s): %(msg)s\u0027 % {"},{"line_number":190,"context_line":"            \u0027rc\u0027: rc,"},{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"},{"line_number":196,"context_line":"    if msg:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_d412b058","line":193,"range":{"start_line":180,"start_character":0,"end_line":193,"end_character":17},"in_reply_to":"5f2577a7_fc08de28","updated":"2018-03-04 20:24:04.000000000","message":"Is not it reasonably tiny? Too many small functions make your mind jumping back and forth what may hurt readability in the end...","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            ptable \u003d PrettyTable(header)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            for row in data_in.get(\u0027rows\u0027, ()):"},{"line_number":205,"context_line":"                ptable.add_row(row)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"            print(ptable.get_string(sortby\u003dheader[0]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        except Exception as ex:"},{"line_number":210,"context_line":"            print(\u0027Error formatting response table: \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_21ccff33","line":207,"range":{"start_line":204,"start_character":11,"end_line":207,"end_character":54},"updated":"2017-09-12 11:11:43.000000000","message":"Nit: this can be handled by the OSC lib[1] Maybe considered as a future (follow-up) enhancement...\n\n[1] https://github.com/openstack/osc-lib","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            ptable \u003d PrettyTable(header)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            for row in data_in.get(\u0027rows\u0027, ()):"},{"line_number":205,"context_line":"                ptable.add_row(row)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"            print(ptable.get_string(sortby\u003dheader[0]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        except Exception as ex:"},{"line_number":210,"context_line":"            print(\u0027Error formatting response table: \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_f40d6c35","line":207,"range":{"start_line":204,"start_character":11,"end_line":207,"end_character":54},"in_reply_to":"5f2577a7_21ccff33","updated":"2018-03-04 20:24:04.000000000","message":"This has been refactored into using `cliff` which wraps `PrettyTable`.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"feca743d53854025ade6bc4f7dee5cffccdde943","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"},{"line_number":196,"context_line":"    if msg:"},{"line_number":197,"context_line":"        print(\u0027%(msg)s\u0027 % {\u0027msg\u0027: \u0027\\n\u0027.join(msg)})"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    header \u003d data_in.get(\u0027header\u0027)"},{"line_number":200,"context_line":"    if header:"},{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            ptable \u003d PrettyTable(header)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            for row in data_in.get(\u0027rows\u0027, ()):"},{"line_number":205,"context_line":"                ptable.add_row(row)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"            print(ptable.get_string(sortby\u003dheader[0]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        except Exception as ex:"},{"line_number":210,"context_line":"            print(\u0027Error formatting response table: \u0027"},{"line_number":211,"context_line":"                  \u0027%(error)s\u0027 % {\u0027error\u0027: ex})"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    return rc"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_3cff8602","line":210,"range":{"start_line":194,"start_character":0,"end_line":210,"end_character":53},"updated":"2017-09-12 11:11:43.000000000","message":"nit: this seems worth a function cause it deals specifically with the output formatting","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2f344d0a21e7cd9eda165099624f8ad3c1ff58fb","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            \u0027msg\u0027: \u0027\\n\u0027.join(data_in.get(\u0027msg\u0027, ()))"},{"line_number":192,"context_line":"        })"},{"line_number":193,"context_line":"        return rc"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    msg \u003d data_in.get(\u0027msg\u0027)"},{"line_number":196,"context_line":"    if msg:"},{"line_number":197,"context_line":"        print(\u0027%(msg)s\u0027 % {\u0027msg\u0027: \u0027\\n\u0027.join(msg)})"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    header \u003d data_in.get(\u0027header\u0027)"},{"line_number":200,"context_line":"    if header:"},{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            ptable \u003d PrettyTable(header)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"            for row in data_in.get(\u0027rows\u0027, ()):"},{"line_number":205,"context_line":"                ptable.add_row(row)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"            print(ptable.get_string(sortby\u003dheader[0]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        except Exception as ex:"},{"line_number":210,"context_line":"            print(\u0027Error formatting response table: \u0027"},{"line_number":211,"context_line":"                  \u0027%(error)s\u0027 % {\u0027error\u0027: ex})"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    return rc"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f9dbf25_941c286b","line":210,"range":{"start_line":194,"start_character":0,"end_line":210,"end_character":53},"in_reply_to":"5f2577a7_3cff8602","updated":"2018-03-04 20:24:04.000000000","message":"This has been refactored into using `cliff` which wraps `PrettyTable`.","commit_id":"5dfe4c38ddce8ff9d86470e3b398a831d3f71cde"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e32624e7057acf39062109296faaeb8decc0de12","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import argparse"},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from prettytable import PrettyTable"}],"source_content_type":"text/x-python","patch_set":24,"id":"df7087c5_995c3c7f","line":18,"updated":"2018-03-12 23:11:55.000000000","message":"pep8 error: unused import","commit_id":"ec4728c7513aff559f18d621644a3f424dad8211"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"c04a65c700dfa6ff8e6dca718a5a9459c9644204","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import argparse"},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":"import sys"},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from prettytable import PrettyTable"}],"source_content_type":"text/x-python","patch_set":24,"id":"df7087c5_d706ee1c","line":18,"in_reply_to":"df7087c5_995c3c7f","updated":"2018-03-13 10:31:31.000000000","message":"Ah, this is what happens when one keeps coding during the meeting... Fixed.","commit_id":"ec4728c7513aff559f18d621644a3f424dad8211"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            context \u003d zmq.Context()"},{"line_number":56,"context_line":"            socket \u003d context.socket(zmq.REQ)"},{"line_number":57,"context_line":"            socket.setsockopt(zmq.LINGER, 5)"},{"line_number":58,"context_line":"            socket.connect(\"tcp://localhost:%s\" % server_port)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"            poller \u003d zmq.Poller()"},{"line_number":61,"context_line":"            poller.register(socket, zmq.POLLIN)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_16459243","line":58,"range":{"start_line":58,"start_character":34,"end_line":58,"end_character":43},"updated":"2018-03-20 17:07:23.000000000","message":"This should ideally be 127.0.0.1 instead of the string localhost as some deployments/systems/tools require \"localhost\" to be on the primary interface instead of the loopback. Totally the wrong way, and it is a broken behavior, but best to explicitly bind to the loopback instead of bind to what we think is the loopback.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            context \u003d zmq.Context()"},{"line_number":56,"context_line":"            socket \u003d context.socket(zmq.REQ)"},{"line_number":57,"context_line":"            socket.setsockopt(zmq.LINGER, 5)"},{"line_number":58,"context_line":"            socket.connect(\"tcp://localhost:%s\" % server_port)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"            poller \u003d zmq.Poller()"},{"line_number":61,"context_line":"            poller.register(socket, zmq.POLLIN)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_cc069421","line":58,"range":{"start_line":58,"start_character":34,"end_line":58,"end_character":43},"in_reply_to":"df7087c5_16459243","updated":"2018-03-21 11:46:13.000000000","message":"Done","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"LOG \u003d log.get_logger()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ZmqClient(object):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    SERVER_TIMEOUT \u003d 5000  # milliseconds"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_c4a136fa","line":37,"updated":"2018-04-23 14:34:52.000000000","message":"do we have this protocol documented somewhere? at least in a docstring?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":34,"context_line":"LOG \u003d log.get_logger()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class ZmqClient(object):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    SERVER_TIMEOUT \u003d 5000  # milliseconds"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_ded7beed","line":37,"in_reply_to":"9f6a8fd7_c4a136fa","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    if no_daemon:"},{"line_number":80,"context_line":"                        msg \u003d (\u0027Server at %(port)s may be dead, will not \u0027"},{"line_number":81,"context_line":"                               \u0027try to revive it\u0027 % {\u0027port\u0027: server_port})"},{"line_number":82,"context_line":"                        LOG.info(msg)"},{"line_number":83,"context_line":"                        raise VirtualBMCError(msg)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"                no_daemon \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_64a2aafe","line":82,"updated":"2018-04-23 14:34:52.000000000","message":"s/info/error/ ?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    if no_daemon:"},{"line_number":80,"context_line":"                        msg \u003d (\u0027Server at %(port)s may be dead, will not \u0027"},{"line_number":81,"context_line":"                               \u0027try to revive it\u0027 % {\u0027port\u0027: server_port})"},{"line_number":82,"context_line":"                        LOG.info(msg)"},{"line_number":83,"context_line":"                        raise VirtualBMCError(msg)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"                no_daemon \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_7e023271","line":82,"in_reply_to":"9f6a8fd7_64a2aafe","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # this will also fork and detach properly"},{"line_number":95,"context_line":"                    vbmcd.main([])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"                time.sleep(3)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":100,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_84a7be0b","line":97,"updated":"2018-04-23 14:34:52.000000000","message":"this does not look too robust. let\u0027s at least leave a TODO to replace it with a looping call?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # this will also fork and detach properly"},{"line_number":95,"context_line":"                    vbmcd.main([])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"                time.sleep(3)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":100,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_9e638642","line":97,"in_reply_to":"9f6a8fd7_84a7be0b","updated":"2018-04-23 18:12:10.000000000","message":"Done.\n\nThough I am not sure what you have in in mind here -- try to re-send the original message (ZMQ should guarantee the delivery though)? Or just wait for longer?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    and `rows` attributes pointing to lists of cell values."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    SERVER_TIMEOUT \u003d 5000  # milliseconds"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def communicate(self, command, args, no_daemon\u003dFalse):"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_c82396bd","line":53,"updated":"2018-06-11 16:29:14.000000000","message":"make configurable?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2dc8329a1429e9e321c9c0e656082a86d62f841f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    and `rows` attributes pointing to lists of cell values."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    SERVER_TIMEOUT \u003d 5000  # milliseconds"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def communicate(self, command, args, no_daemon\u003dFalse):"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_fb9b3514","line":53,"in_reply_to":"5f7c97a3_c82396bd","updated":"2018-06-18 09:38:02.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def communicate(self, command, args, no_daemon\u003dFalse):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        data_out \u003d {attr: getattr(args, attr)"},{"line_number":58,"context_line":"                    for attr in dir(args) if not attr.startswith(\u0027_\u0027)}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        data_out.update(command\u003dcommand)"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_e820d2b2","line":58,"updated":"2018-06-11 16:29:14.000000000","message":"nit: I\u0027d prefer something like args.to_dict() even if it ends up doing the same","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"35fc0ac246ec00c502353f29bb6de401be7a4ab1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def communicate(self, command, args, no_daemon\u003dFalse):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        data_out \u003d {attr: getattr(args, attr)"},{"line_number":58,"context_line":"                    for attr in dir(args) if not attr.startswith(\u0027_\u0027)}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        data_out.update(command\u003dcommand)"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_3611c4b0","line":58,"in_reply_to":"5f7c97a3_e820d2b2","updated":"2018-06-18 10:25:35.000000000","message":"I do not see a built-in method for that being offered by cliff. Meanwhile I\u0027ve moved that dict comp into a staticmethod in hope for better clarity.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"                LOG.debug(\"Attempting to start vBMC daemon behind the \""},{"line_number":102,"context_line":"                          \"scenes...\")"},{"line_number":103,"context_line":"                LOG.debug(\"Please, configure your system to manage vbmcd \""},{"line_number":104,"context_line":"                          \"by systemd!\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"                # attempt to start and daemonize the server"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_88291e9d","line":103,"updated":"2018-06-11 16:29:14.000000000","message":"s/debug/warning/ and I\u0027d suggest merging the two messages and mentioning something about removing this behaviour eventualy","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"                LOG.debug(\"Attempting to start vBMC daemon behind the \""},{"line_number":102,"context_line":"                          \"scenes...\")"},{"line_number":103,"context_line":"                LOG.debug(\"Please, configure your system to manage vbmcd \""},{"line_number":104,"context_line":"                          \"by systemd!\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"                # attempt to start and daemonize the server"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_52426c6a","line":103,"in_reply_to":"5f7c97a3_88291e9d","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"                LOG.debug(\"Attempting to start vBMC daemon behind the \""},{"line_number":102,"context_line":"                          \"scenes...\")"},{"line_number":103,"context_line":"                LOG.debug(\"Please, configure your system to manage vbmcd \""},{"line_number":104,"context_line":"                          \"by systemd!\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"                # attempt to start and daemonize the server"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_a0e9587f","line":103,"in_reply_to":"5f7c97a3_88291e9d","updated":"2018-06-13 16:37:45.000000000","message":"I can agree with this.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"                LOG.debug(\"Attempting to start vBMC daemon behind the \""},{"line_number":102,"context_line":"                          \"scenes...\")"},{"line_number":103,"context_line":"                LOG.debug(\"Please, configure your system to manage vbmcd \""},{"line_number":104,"context_line":"                          \"by systemd!\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"                # attempt to start and daemonize the server"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_72476879","line":103,"in_reply_to":"5f7c97a3_a0e9587f","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                    vbmcd.main([])"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"                # TODO(etingof): perform some more retries"},{"line_number":112,"context_line":"                time.sleep(3)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":115,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_a8265aca","line":112,"updated":"2018-06-11 16:29:14.000000000","message":"make configurable?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2dc8329a1429e9e321c9c0e656082a86d62f841f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                    vbmcd.main([])"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"                # TODO(etingof): perform some more retries"},{"line_number":112,"context_line":"                time.sleep(3)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":115,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_fbb49584","line":112,"in_reply_to":"5f7c97a3_a8265aca","updated":"2018-06-18 09:38:02.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                    vbmcd.main([])"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"                # TODO(etingof): perform some more retries"},{"line_number":112,"context_line":"                time.sleep(3)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":115,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_c09574e5","line":112,"in_reply_to":"5f7c97a3_a8265aca","updated":"2018-06-13 16:37:45.000000000","message":"I remember thinking about this deeply... ?four? months ago. I think there was some sanity behind the hard timeout zMQ wise... but I just don\u0027t remember at this point.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2dc8329a1429e9e321c9c0e656082a86d62f841f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                    vbmcd.main([])"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"                # TODO(etingof): perform some more retries"},{"line_number":112,"context_line":"                time.sleep(3)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"                # MQ will deliver the original message to the daemon"},{"line_number":115,"context_line":"                # we\u0027ve started"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_1bbab16d","line":112,"in_reply_to":"5f7c97a3_c09574e5","updated":"2018-06-18 09:38:02.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"virtualbmc/cmd/vbmcd.py":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        with open(pid_file, \u0027w\u0027) as f:"},{"line_number":62,"context_line":"            f.write(str(pid))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_6b6e3c96","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":38},"updated":"2018-03-12 12:50:45.000000000","message":"We should create the path to the pid_file specified in CONF.\nIOError: [Errno 2] No such file or directory: \u0027/root/.vbmc/master.pid\u0027","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        with open(pid_file, \u0027w\u0027) as f:"},{"line_number":62,"context_line":"            f.write(str(pid))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_3ff4fd85","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":38},"in_reply_to":"df7087c5_6b6e3c96","updated":"2018-03-12 15:34:41.000000000","message":"Done","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    parser.add_argument(\u0027--foreground\u0027,"},{"line_number":39,"context_line":"                        action\u003d\u0027store_true\u0027,"},{"line_number":40,"context_line":"                        default\u003dFalse,"},{"line_number":41,"context_line":"                        help\u003d\u0027Do not daemonize\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    args \u003d parser.parse_args(argv)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_048c0e7d","line":41,"updated":"2018-04-23 14:34:52.000000000","message":"I feel like somewhere here we need to configure the logging. and maybe add --debug to show debug logs?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    parser.add_argument(\u0027--foreground\u0027,"},{"line_number":39,"context_line":"                        action\u003d\u0027store_true\u0027,"},{"line_number":40,"context_line":"                        default\u003dFalse,"},{"line_number":41,"context_line":"                        help\u003d\u0027Do not daemonize\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    args \u003d parser.parse_args(argv)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_77f575ec","line":41,"in_reply_to":"9f6a8fd7_048c0e7d","updated":"2018-04-23 18:12:10.000000000","message":"There is already some logging configuration being done through the .ini file.\n\nWe have agreed on the irc channel to either leave it alone or improve somehow in the follow-up patch.","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.error(\u0027server PID #%(pid)d still running\u0027 % {\u0027pid\u0027: pid})"},{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        dir_name \u003d os.path.dirname(pid_file)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not os.path.exists(dir_name):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_08366e03","line":60,"updated":"2018-06-11 16:29:14.000000000","message":"I wonder if there is a lib to do this all for us..","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"a25ba2c4f949eb725c53856aae4f170a5a86647e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.error(\u0027server PID #%(pid)d still running\u0027 % {\u0027pid\u0027: pid})"},{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        dir_name \u003d os.path.dirname(pid_file)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not os.path.exists(dir_name):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_fd7909c5","line":60,"in_reply_to":"5f7c97a3_08366e03","updated":"2018-06-15 13:04:56.000000000","message":"I can\u0027t see one so far. There are the `pidfile` and `daemon` packages that do this though. There is probably something suitable in `oslo.concurrency.lockutils`, but we do not have oslo dependency atm.\n\nThoughts?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.error(\u0027server PID #%(pid)d still running\u0027 % {\u0027pid\u0027: pid})"},{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        dir_name \u003d os.path.dirname(pid_file)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not os.path.exists(dir_name):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_e0667029","line":60,"in_reply_to":"5f7c97a3_08366e03","updated":"2018-06-13 16:37:45.000000000","message":"I feel like there is a built-in to do it.... but this is also fairly minimal code, and if there is not a built-in I\u0027d prefer to avoid another dependency if we don\u0027t absolutely need it.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"a25ba2c4f949eb725c53856aae4f170a5a86647e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.error(\u0027server PID #%(pid)d still running\u0027 % {\u0027pid\u0027: pid})"},{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        dir_name \u003d os.path.dirname(pid_file)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not os.path.exists(dir_name):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_5d37ddff","line":60,"in_reply_to":"5f7c97a3_e0667029","updated":"2018-06-15 13:04:56.000000000","message":"The thing about such code is that it\u0027s hard to do right from security perspective. To illustrate the point, this code is vulnerable against the symlink attack. :-(\n\nMay be I should try to fix that in the followups...","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"905b315edc08d6db8d90dc4d9e7f86e1a7b41f65","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.error(\u0027server PID #%(pid)d still running\u0027 % {\u0027pid\u0027: pid})"},{"line_number":58,"context_line":"        return 1"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def wrap_with_pidfile(func, pid):"},{"line_number":61,"context_line":"        dir_name \u003d os.path.dirname(pid_file)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        if not os.path.exists(dir_name):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_25e0c326","line":60,"in_reply_to":"5f7c97a3_fd7909c5","updated":"2018-06-15 15:42:28.000000000","message":"But at least I\u0027ve migrated this to the `tempfile`:\n\nhttps://review.openstack.org/575775","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            func()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        except Exception as e:"},{"line_number":73,"context_line":"            LOG.error(\u0027%(error)s. \u0027, {\u0027error\u0027: e})"},{"line_number":74,"context_line":"            return 1"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_283b2aea","line":73,"updated":"2018-06-11 16:29:14.000000000","message":"nit: redundant space after dot?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            func()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        except Exception as e:"},{"line_number":73,"context_line":"            LOG.error(\u0027%(error)s. \u0027, {\u0027error\u0027: e})"},{"line_number":74,"context_line":"            return 1"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_5d059d0f","line":73,"in_reply_to":"5f7c97a3_283b2aea","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"virtualbmc/config.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                os.path.expanduser(\u0027~\u0027), \u0027.vbmc\u0027"},{"line_number":40,"context_line":"            ),"},{"line_number":41,"context_line":"            \u0027pid_file\u0027: os.path.join("},{"line_number":42,"context_line":"                os.path.expanduser(\u0027~\u0027), \u0027.vbmc\u0027, \u0027master.pid\u0027"},{"line_number":43,"context_line":"            ),"},{"line_number":44,"context_line":"            \u0027server_port\u0027: 50891,"},{"line_number":45,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_24b03243","line":42,"updated":"2018-04-23 14:34:52.000000000","message":"side note: meh, I hate these defaults...","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                os.path.expanduser(\u0027~\u0027), \u0027.vbmc\u0027"},{"line_number":40,"context_line":"            ),"},{"line_number":41,"context_line":"            \u0027pid_file\u0027: os.path.join("},{"line_number":42,"context_line":"                os.path.expanduser(\u0027~\u0027), \u0027.vbmc\u0027, \u0027master.pid\u0027"},{"line_number":43,"context_line":"            ),"},{"line_number":44,"context_line":"            \u0027server_port\u0027: 50891,"},{"line_number":45,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_37493d30","line":42,"in_reply_to":"9f6a8fd7_24b03243","updated":"2018-04-23 18:12:10.000000000","message":"Hey, how can I make your life more enjoyable? ;-)\n\nExplicit c/l option for the .pid file?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"}],"virtualbmc/control.py":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def main_loop(vbmc_manager, handle_command):"},{"line_number":36,"context_line":"    \"\"\"Server part of the CLI control interface"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    Receives JSON messages from ZMQ socket, calls the"},{"line_number":39,"context_line":"    command handler and sends JSON response back to the client."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    server_port \u003d CONF[\u0027default\u0027][\u0027server_port\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_5f1d3a64","line":38,"updated":"2018-03-12 12:50:45.000000000","message":"nit: linebreak at 72 chars for docstrings? We can do a couple more words before breaking here?","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def main_loop(vbmc_manager, handle_command):"},{"line_number":36,"context_line":"    \"\"\"Server part of the CLI control interface"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    Receives JSON messages from ZMQ socket, calls the"},{"line_number":39,"context_line":"    command handler and sends JSON response back to the client."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    server_port \u003d CONF[\u0027default\u0027][\u0027server_port\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_3f495dcf","line":38,"in_reply_to":"df7087c5_5f1d3a64","updated":"2018-03-12 15:34:41.000000000","message":"Done","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":180,"context_line":"def application():"},{"line_number":181,"context_line":"    \"\"\"vBMC application entry point"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    Initializes, serves, cleans up everything"},{"line_number":184,"context_line":"    infinitely."},{"line_number":185,"context_line":"    \"\"\""},{"line_number":186,"context_line":"    while True:"},{"line_number":187,"context_line":"        vbmc_manager \u003d VirtualBMCManager()"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_fc177c50","line":184,"range":{"start_line":183,"start_character":45,"end_line":184,"end_character":15},"updated":"2018-03-12 12:50:45.000000000","message":"nit: Do we need linebreak here?","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":180,"context_line":"def application():"},{"line_number":181,"context_line":"    \"\"\"vBMC application entry point"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    Initializes, serves, cleans up everything"},{"line_number":184,"context_line":"    infinitely."},{"line_number":185,"context_line":"    \"\"\""},{"line_number":186,"context_line":"    while True:"},{"line_number":187,"context_line":"        vbmc_manager \u003d VirtualBMCManager()"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_bf0ecd8a","line":184,"range":{"start_line":183,"start_character":45,"end_line":184,"end_character":15},"in_reply_to":"df7087c5_fc177c50","updated":"2018-03-12 15:34:41.000000000","message":"Done","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"d63340f11a79b0862c58c9c4750f4a9f9b1bd167","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        def kill_children(*args):"},{"line_number":192,"context_line":"            vbmc_manager.periodic(shutdown\u003dTrue)"},{"line_number":193,"context_line":"            sys.exit(1)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        # SIGTERM does not seem to propagate to multiprocessing"},{"line_number":196,"context_line":"        signal.signal(signal.SIGTERM, kill_children)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df7087c5_615e4113","line":193,"range":{"start_line":193,"start_character":21,"end_line":193,"end_character":22},"updated":"2018-03-13 09:04:53.000000000","message":"Exit with \u00270\u0027 here. This is a controlled shutdown on receiving SIGTERM signal so we should not return an error unless there is an error when manager is killing one or more children.\n\nAs it is now, on clean shutdown systemd reports the service as failed state, it should go to inactive state.","commit_id":"ec4728c7513aff559f18d621644a3f424dad8211"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"c04a65c700dfa6ff8e6dca718a5a9459c9644204","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        def kill_children(*args):"},{"line_number":192,"context_line":"            vbmc_manager.periodic(shutdown\u003dTrue)"},{"line_number":193,"context_line":"            sys.exit(1)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        # SIGTERM does not seem to propagate to multiprocessing"},{"line_number":196,"context_line":"        signal.signal(signal.SIGTERM, kill_children)"}],"source_content_type":"text/x-python","patch_set":24,"id":"df7087c5_773042e9","line":193,"range":{"start_line":193,"start_character":21,"end_line":193,"end_character":22},"in_reply_to":"df7087c5_615e4113","updated":"2018-03-13 10:31:31.000000000","message":"Done","commit_id":"ec4728c7513aff559f18d621644a3f424dad8211"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        context \u003d zmq.Context()"},{"line_number":47,"context_line":"        socket \u003d context.socket(zmq.REP)"},{"line_number":48,"context_line":"        socket.setsockopt(zmq.LINGER, 5)"},{"line_number":49,"context_line":"        socket.bind(\"tcp://*:%s\" % server_port)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        poller \u003d zmq.Poller()"},{"line_number":52,"context_line":"        poller.register(socket, zmq.POLLIN)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_36977693","line":49,"range":{"start_line":49,"start_character":27,"end_line":49,"end_character":28},"updated":"2018-03-20 17:07:23.000000000","message":"would this not make this service remotely accessible? This seems like a potential security issue to me. Perhaps explicitly bind to the loopback IP address?","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        context \u003d zmq.Context()"},{"line_number":47,"context_line":"        socket \u003d context.socket(zmq.REP)"},{"line_number":48,"context_line":"        socket.setsockopt(zmq.LINGER, 5)"},{"line_number":49,"context_line":"        socket.bind(\"tcp://*:%s\" % server_port)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        poller \u003d zmq.Poller()"},{"line_number":52,"context_line":"        poller.register(socket, zmq.POLLIN)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_27364be9","line":49,"range":{"start_line":49,"start_character":27,"end_line":49,"end_character":28},"in_reply_to":"df7087c5_36977693","updated":"2018-03-21 11:46:13.000000000","message":"Done","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"\"\"Server part of the CLI control interface"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    Receives JSON messages from ZMQ socket, calls the command handler and"},{"line_number":39,"context_line":"    sends JSON response back to the client."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    server_port \u003d CONF[\u0027default\u0027][\u0027server_port\u0027]"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_a485225c","line":39,"updated":"2018-04-23 14:34:52.000000000","message":"probably the protocol description should go here","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"\"\"Server part of the CLI control interface"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    Receives JSON messages from ZMQ socket, calls the command handler and"},{"line_number":39,"context_line":"    sends JSON response back to the client."},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    server_port \u003d CONF[\u0027default\u0027][\u0027server_port\u0027]"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_17faf9bb","line":39,"in_reply_to":"9f6a8fd7_a485225c","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                data_in \u003d json.loads(message.decode(\u0027utf-8\u0027))"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"            except ValueError as ex:"},{"line_number":66,"context_line":"                LOG.info("},{"line_number":67,"context_line":"                    \u0027Control server request deserialization error: \u0027"},{"line_number":68,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":69,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_c48a9668","line":66,"updated":"2018-04-23 14:34:52.000000000","message":"s/info/warning/","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                data_in \u003d json.loads(message.decode(\u0027utf-8\u0027))"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"            except ValueError as ex:"},{"line_number":66,"context_line":"                LOG.info("},{"line_number":67,"context_line":"                    \u0027Control server request deserialization error: \u0027"},{"line_number":68,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":69,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_5725d15a","line":66,"in_reply_to":"9f6a8fd7_c48a9668","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    \u0027Control server request deserialization error: \u0027"},{"line_number":68,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":69,"context_line":"                )"},{"line_number":70,"context_line":"                continue"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"            try:"},{"line_number":73,"context_line":"                data_out \u003d handle_command(vbmc_manager, data_in)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_647b8a7a","line":70,"updated":"2018-04-23 14:34:52.000000000","message":"maybe log what we\u0027re about to do at DEBUG level?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                    \u0027Control server request deserialization error: \u0027"},{"line_number":68,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":69,"context_line":"                )"},{"line_number":70,"context_line":"                continue"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"            try:"},{"line_number":73,"context_line":"                data_out \u003d handle_command(vbmc_manager, data_in)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_37ce1d82","line":70,"in_reply_to":"9f6a8fd7_647b8a7a","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"            except exception.VirtualBMCError as ex:"},{"line_number":76,"context_line":"                msg \u003d \u0027Command failed: %(error)s\u0027 % {\u0027error\u0027: ex}"},{"line_number":77,"context_line":"                LOG.info(msg)"},{"line_number":78,"context_line":"                data_out \u003d {"},{"line_number":79,"context_line":"                    \u0027rc\u0027: 1,"},{"line_number":80,"context_line":"                    \u0027msg\u0027: [msg]"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_84801e48","line":77,"updated":"2018-04-23 14:34:52.000000000","message":"s/info/error/ ?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"            except exception.VirtualBMCError as ex:"},{"line_number":76,"context_line":"                msg \u003d \u0027Command failed: %(error)s\u0027 % {\u0027error\u0027: ex}"},{"line_number":77,"context_line":"                LOG.info(msg)"},{"line_number":78,"context_line":"                data_out \u003d {"},{"line_number":79,"context_line":"                    \u0027rc\u0027: 1,"},{"line_number":80,"context_line":"                    \u0027msg\u0027: [msg]"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_77ad7599","line":77,"in_reply_to":"9f6a8fd7_84801e48","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                data_out \u003d {"},{"line_number":79,"context_line":"                    \u0027rc\u0027: 1,"},{"line_number":80,"context_line":"                    \u0027msg\u0027: [msg]"},{"line_number":81,"context_line":"                }"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                message \u003d json.dumps(data_out)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_249912c3","line":81,"updated":"2018-04-23 14:34:52.000000000","message":"maybe log something with DEBUG level on success as well?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                data_out \u003d {"},{"line_number":79,"context_line":"                    \u0027rc\u0027: 1,"},{"line_number":80,"context_line":"                    \u0027msg\u0027: [msg]"},{"line_number":81,"context_line":"                }"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                message \u003d json.dumps(data_out)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_37ca9d4d","line":81,"in_reply_to":"9f6a8fd7_249912c3","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                message \u003d json.dumps(data_out)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            except ValueError as ex:"},{"line_number":87,"context_line":"                LOG.info("},{"line_number":88,"context_line":"                    \u0027Control server response serialization error: \u0027"},{"line_number":89,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":90,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_44968695","line":87,"updated":"2018-04-23 14:34:52.000000000","message":"s/info/warning/?","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                message \u003d json.dumps(data_out)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            except ValueError as ex:"},{"line_number":87,"context_line":"                LOG.info("},{"line_number":88,"context_line":"                    \u0027Control server response serialization error: \u0027"},{"line_number":89,"context_line":"                    \u0027%(error)s\u0027, {\u0027error\u0027: ex}"},{"line_number":90,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_f798a575","line":87,"in_reply_to":"9f6a8fd7_44968695","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3f944b07d7516f3b9c530444ed4e4885303745a5","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    Initializes, serves, cleans up everything infinitely."},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    while True:"},{"line_number":186,"context_line":"        vbmc_manager \u003d VirtualBMCManager()"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        vbmc_manager.periodic()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_e48eba77","line":185,"updated":"2018-04-23 14:34:52.000000000","message":"what is this main loop doing? it looks like it will just loop forever if there is a fault. I don\u0027t think we should do it - let\u0027s leave it to packagers.","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b52482d53420f9251367c7b2d44eca2eb66efd10","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    Initializes, serves, cleans up everything infinitely."},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    while True:"},{"line_number":186,"context_line":"        vbmc_manager \u003d VirtualBMCManager()"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        vbmc_manager.periodic()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f6a8fd7_f742e5aa","line":185,"in_reply_to":"9f6a8fd7_e48eba77","updated":"2018-04-23 18:12:10.000000000","message":"Done","commit_id":"ca2d17640e2ff9804360ae84051f1f46a9a80746"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.get_logger()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"TIMER_PERIOD \u003d 3000  # milliseconds"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def main_loop(vbmc_manager, handle_command):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_e809b230","line":31,"updated":"2018-06-11 16:29:14.000000000","message":"make configurable?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"2dc8329a1429e9e321c9c0e656082a86d62f841f","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.get_logger()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"TIMER_PERIOD \u003d 3000  # milliseconds"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def main_loop(vbmc_manager, handle_command):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_5b65891c","line":31,"in_reply_to":"5f7c97a3_e809b230","updated":"2018-06-18 09:38:02.000000000","message":"I am not sure it makes sense here... Why the user may ever want to change this mainloop running period?\n\nOn the flip side, we introduce an obscure option to the configuration/documentation.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        data_out \u003d [vbmc_manager.delete(domain_name)"},{"line_number":144,"context_line":"                    for domain_name in data_in[\u0027domain_names\u0027]]"},{"line_number":145,"context_line":"        return {"},{"line_number":146,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":147,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"},{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_88027e0b","line":146,"updated":"2018-06-11 16:29:14.000000000","message":"nit: redundant []","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"35fc0ac246ec00c502353f29bb6de401be7a4ab1","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        data_out \u003d [vbmc_manager.delete(domain_name)"},{"line_number":144,"context_line":"                    for domain_name in data_in[\u0027domain_names\u0027]]"},{"line_number":145,"context_line":"        return {"},{"line_number":146,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":147,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"},{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_961bf8c8","line":146,"in_reply_to":"5f7c97a3_88027e0b","updated":"2018-06-18 10:25:35.000000000","message":"Well, I can probably offer a counterargument that a generator is a tidbit slower than a list on small numbers. ;-)\n\nChanged anyway.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_a8ff3a00","line":151,"updated":"2018-06-11 16:29:14.000000000","message":"let\u0027s maybe be future-proof and accept several names?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b406aa30f107ec77409b21463292be9a1b6e9cc5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_4160380e","line":151,"in_reply_to":"5f7c97a3_3affb434","updated":"2018-06-18 11:29:23.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"03904ed8cb3a8ca7a902e9576639814e35bdf8fd","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_3dd80e7d","line":151,"in_reply_to":"5f7c97a3_3affb434","updated":"2018-06-13 19:02:51.000000000","message":"I just preserved the original cli notation. I\u0027d be happy to change the start command, though I\u0027m wondering why it\u0027s made asymmetrical in the first place. Could be to be able to pass some domain-specific parameters? Just guessing...","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b406aa30f107ec77409b21463292be9a1b6e9cc5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_6165341d","line":151,"in_reply_to":"5f7c97a3_3dd80e7d","updated":"2018-06-18 11:29:23.000000000","message":"...and the original single-argument call signature is still operational.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b406aa30f107ec77409b21463292be9a1b6e9cc5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_e1ab841b","line":151,"in_reply_to":"5f7c97a3_a8ff3a00","updated":"2018-06-18 11:29:23.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_eb50910c","line":151,"in_reply_to":"5f7c97a3_a8ff3a00","updated":"2018-06-13 16:37:45.000000000","message":"What would be the use case in doing so? I\u0027m not sure we\u0027re solving a problem if we do that, and we would be potentially needlessly increasing complexity if we don\u0027t actually do that.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"b406aa30f107ec77409b21463292be9a1b6e9cc5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_a1a58c49","line":151,"in_reply_to":"5f7c97a3_eb50910c","updated":"2018-06-18 11:29:23.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"aa09df4246181859d9991f88c29eac1f0801326f","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    elif command \u003d\u003d \u0027start\u0027:"},{"line_number":151,"context_line":"        data_out \u003d [vbmc_manager.start(data_in[\u0027domain_name\u0027])]"},{"line_number":152,"context_line":"        return {"},{"line_number":153,"context_line":"            \u0027rc\u0027: max([rc for rc, msg in data_out]),"},{"line_number":154,"context_line":"            \u0027msg\u0027: [msg for rc, msg in data_out if msg],"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_3affb434","line":151,"in_reply_to":"5f7c97a3_eb50910c","updated":"2018-06-13 18:41:35.000000000","message":"I just find it confusing that stop and delete accept several domains, but start accepts only one.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"virtualbmc/manager.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            show_passwords \u003d CONF[\u0027default\u0027][\u0027show_passwords\u0027]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            if show_passwords:"},{"line_number":121,"context_line":"                show_options \u003d bmc_config"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                show_options \u003d utils.mask_dict_password(bmc_config)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            try:"},{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_d6395aa3","line":123,"range":{"start_line":118,"start_character":0,"end_line":123,"end_character":67},"updated":"2018-03-20 17:07:23.000000000","message":"I\u0027m of the strong opinion we should always mask sensitive details such as passwords","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f29bbe06210cab95d62dee490bacd222391567d0","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            show_passwords \u003d CONF[\u0027default\u0027][\u0027show_passwords\u0027]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            if show_passwords:"},{"line_number":121,"context_line":"                show_options \u003d bmc_config"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                show_options \u003d utils.mask_dict_password(bmc_config)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            try:"},{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_b84bb9ae","line":123,"range":{"start_line":118,"start_character":0,"end_line":123,"end_character":67},"in_reply_to":"df7087c5_a79d7bbc","updated":"2018-03-23 17:01:55.000000000","message":"That is a very valid point, I\u0027m fine with a follow-up to remove revealing the password.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f29bbe06210cab95d62dee490bacd222391567d0","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            show_passwords \u003d CONF[\u0027default\u0027][\u0027show_passwords\u0027]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            if show_passwords:"},{"line_number":121,"context_line":"                show_options \u003d bmc_config"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                show_options \u003d utils.mask_dict_password(bmc_config)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            try:"},{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_b872d910","line":123,"range":{"start_line":118,"start_character":0,"end_line":123,"end_character":67},"in_reply_to":"df7087c5_a79d7bbc","updated":"2018-03-23 17:01:55.000000000","message":"That is a very vlaid point","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            show_passwords \u003d CONF[\u0027default\u0027][\u0027show_passwords\u0027]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"            if show_passwords:"},{"line_number":121,"context_line":"                show_options \u003d bmc_config"},{"line_number":122,"context_line":"            else:"},{"line_number":123,"context_line":"                show_options \u003d utils.mask_dict_password(bmc_config)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            try:"},{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_a79d7bbc","line":123,"range":{"start_line":118,"start_character":0,"end_line":123,"end_character":67},"in_reply_to":"df7087c5_d6395aa3","updated":"2018-03-21 11:46:13.000000000","message":"If you think we should remove the option of showing passwords, I\u0027d propose to do that as a followup patch.\n\nMy argument is that this option existed before this change and removing it within this patch looks irrelevant to the topic of this change.\n\nWDYT?","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            except Exception as ex:"},{"line_number":129,"context_line":"                LOG.error("},{"line_number":130,"context_line":"                    \u0027Error running vBMC with configuration \u0027"},{"line_number":131,"context_line":"                    \u0027%(opts)s: %(error)s\u0027 % {\u0027opts\u0027: show_options,"},{"line_number":132,"context_line":"                                             \u0027error\u0027: ex}"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_d6071ac9","line":129,"updated":"2018-03-20 17:07:23.000000000","message":"should we be masking prior to logging instead of prior to instantiating the instance of VirtualBMC.  I guess I\u0027m not sure how the two would work.\n\nThe possibility of unmasked credentials is worrisome to me, especially if they are logged.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f29bbe06210cab95d62dee490bacd222391567d0","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            except Exception as ex:"},{"line_number":129,"context_line":"                LOG.error("},{"line_number":130,"context_line":"                    \u0027Error running vBMC with configuration \u0027"},{"line_number":131,"context_line":"                    \u0027%(opts)s: %(error)s\u0027 % {\u0027opts\u0027: show_options,"},{"line_number":132,"context_line":"                                             \u0027error\u0027: ex}"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_1e564d08","line":129,"in_reply_to":"df7087c5_a7bedbd1","updated":"2018-03-23 17:01:55.000000000","message":"I guess my point is that under no circumstances should we log any credential data.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                vbmc \u003d VirtualBMC(**bmc_config)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            except Exception as ex:"},{"line_number":129,"context_line":"                LOG.error("},{"line_number":130,"context_line":"                    \u0027Error running vBMC with configuration \u0027"},{"line_number":131,"context_line":"                    \u0027%(opts)s: %(error)s\u0027 % {\u0027opts\u0027: show_options,"},{"line_number":132,"context_line":"                                             \u0027error\u0027: ex}"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_a7bedbd1","line":129,"in_reply_to":"df7087c5_d6071ac9","updated":"2018-03-21 11:46:13.000000000","message":"As I read the code, when we do the masking we create a copy of `bmc_config` under the name of `show_options`. The instantiation still uses the original `bmc_config` so masking does not affect the instantiation.\n\nThe reason to do the masking early is that we have two options logging statements down the code. So we kill both birds by one stone.\n\nDoes it sound sane?","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        else:"},{"line_number":220,"context_line":"            show_options[\u0027status\u0027] \u003d DOWN"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return show_options"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def periodic(self, shutdown\u003dFalse):"},{"line_number":225,"context_line":"        self._sync_vbmc_states(shutdown)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_1616f2f2","line":222,"updated":"2018-03-20 17:07:23.000000000","message":"Slightly less concerned about user-interactive need, as opposed to logging.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        else:"},{"line_number":220,"context_line":"            show_options[\u0027status\u0027] \u003d DOWN"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return show_options"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def periodic(self, shutdown\u003dFalse):"},{"line_number":225,"context_line":"        self._sync_vbmc_states(shutdown)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_226e3996","line":222,"in_reply_to":"df7087c5_1616f2f2","updated":"2018-03-21 11:46:13.000000000","message":"I agree! I\u0027d also remove passwords from the logs unconditionally. But I\u0027d probably do that in a followup patch as well...\n\nWDYT?","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f29bbe06210cab95d62dee490bacd222391567d0","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        else:"},{"line_number":220,"context_line":"            show_options[\u0027status\u0027] \u003d DOWN"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return show_options"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def periodic(self, shutdown\u003dFalse):"},{"line_number":225,"context_line":"        self._sync_vbmc_states(shutdown)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_be46414f","line":222,"in_reply_to":"df7087c5_226e3996","updated":"2018-03-23 17:01:55.000000000","message":"I\u0027m okay with that as long as we do it quickly :)","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        config \u003d configparser.ConfigParser()"},{"line_number":77,"context_line":"        config.add_section(DEFAULT_SECTION)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        for option, value in sorted(options.items()):"},{"line_number":80,"context_line":"            if value is not None:"},{"line_number":81,"context_line":"                config.set(DEFAULT_SECTION, option, six.text_type(value))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_6b035c0e","line":79,"updated":"2018-06-11 16:29:14.000000000","message":"why do you need it sorted?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"35fc0ac246ec00c502353f29bb6de401be7a4ab1","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        config \u003d configparser.ConfigParser()"},{"line_number":77,"context_line":"        config.add_section(DEFAULT_SECTION)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        for option, value in sorted(options.items()):"},{"line_number":80,"context_line":"            if value is not None:"},{"line_number":81,"context_line":"                config.set(DEFAULT_SECTION, option, six.text_type(value))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_b63dd4bd","line":79,"in_reply_to":"5f7c97a3_6b035c0e","updated":"2018-06-18 10:25:35.000000000","message":"My original intention was to keep the config files stable. But I just figured that they fixed that since Py2.7 so my effort is not needed anymore. ;)","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Walks over vBMC instances configuration, starts"},{"line_number":112,"context_line":"        enabled but dead instances, kills non-configured"},{"line_number":113,"context_line":"        but alive ones."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_0b042813","line":113,"updated":"2018-06-11 16:29:14.000000000","message":"This looks like a new feature.. I\u0027d prefer it separate","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Walks over vBMC instances configuration, starts"},{"line_number":112,"context_line":"        enabled but dead instances, kills non-configured"},{"line_number":113,"context_line":"        but alive ones."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_cb84b560","line":113,"in_reply_to":"5f7c97a3_0b042813","updated":"2018-06-13 16:37:45.000000000","message":"Semi logical scope creep I think. It actually kind of makes sense.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Walks over vBMC instances configuration, starts"},{"line_number":112,"context_line":"        enabled but dead instances, kills non-configured"},{"line_number":113,"context_line":"        but alive ones."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_5d56fdd0","line":113,"in_reply_to":"5f7c97a3_0b042813","updated":"2018-06-15 12:38:43.000000000","message":"Which one you refer to here?\n\nMy take on this would be that whatever new behaviour slips in accidentally, it\u0027s mostly a side-effect of the radically new design of the tool.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Walks over vBMC instances configuration, starts"},{"line_number":112,"context_line":"        enabled but dead instances, kills non-configured"},{"line_number":113,"context_line":"        but alive ones."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        def vbmc_runner(bmc_config):"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_1d708573","line":113,"in_reply_to":"5f7c97a3_cb84b560","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                if not instance:"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"                    instance \u003d multiprocessing.Process("},{"line_number":173,"context_line":"                        name\u003d\u0027xxx\u0027,"},{"line_number":174,"context_line":"                        target\u003dvbmc_runner,"},{"line_number":175,"context_line":"                        args\u003d(bmc_config,)"},{"line_number":176,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_2b09e429","line":173,"updated":"2018-06-11 16:29:14.000000000","message":"add meaningful name based on domain?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                if not instance:"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"                    instance \u003d multiprocessing.Process("},{"line_number":173,"context_line":"                        name\u003d\u0027xxx\u0027,"},{"line_number":174,"context_line":"                        target\u003dvbmc_runner,"},{"line_number":175,"context_line":"                        args\u003d(bmc_config,)"},{"line_number":176,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_2b42093c","line":173,"in_reply_to":"5f7c97a3_2b09e429","updated":"2018-06-13 16:37:45.000000000","message":"+1","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"35fc0ac246ec00c502353f29bb6de401be7a4ab1","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                if not instance:"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"                    instance \u003d multiprocessing.Process("},{"line_number":173,"context_line":"                        name\u003d\u0027xxx\u0027,"},{"line_number":174,"context_line":"                        target\u003dvbmc_runner,"},{"line_number":175,"context_line":"                        args\u003d(bmc_config,)"},{"line_number":176,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_f6582c8b","line":173,"in_reply_to":"5f7c97a3_2b09e429","updated":"2018-06-18 10:25:35.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"35fc0ac246ec00c502353f29bb6de401be7a4ab1","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                if not instance:"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"                    instance \u003d multiprocessing.Process("},{"line_number":173,"context_line":"                        name\u003d\u0027xxx\u0027,"},{"line_number":174,"context_line":"                        target\u003dvbmc_runner,"},{"line_number":175,"context_line":"                        args\u003d(bmc_config,)"},{"line_number":176,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_165e0876","line":173,"in_reply_to":"5f7c97a3_2b42093c","updated":"2018-06-18 10:25:35.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"08dd24beb84d3534f096287acbb9f860a3f8c6d1","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"            if instance and not instance.is_alive():"},{"line_number":198,"context_line":"                del self._running_domains[domain_name]"},{"line_number":199,"context_line":"                LOG.info("},{"line_number":200,"context_line":"                    \u0027Reaped vBMC instance for domain %(domain)s \u0027"},{"line_number":201,"context_line":"                    \u0027(rc %(rc)s)\u0027 % {\u0027domain\u0027: domain_name,"},{"line_number":202,"context_line":"                                     \u0027rc\u0027: instance.exitcode}"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_cb115055","line":199,"updated":"2018-06-11 16:29:14.000000000","message":"This action is about some internal state, I think we should remove the logging or demote it to DEBUG","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"            if instance and not instance.is_alive():"},{"line_number":198,"context_line":"                del self._running_domains[domain_name]"},{"line_number":199,"context_line":"                LOG.info("},{"line_number":200,"context_line":"                    \u0027Reaped vBMC instance for domain %(domain)s \u0027"},{"line_number":201,"context_line":"                    \u0027(rc %(rc)s)\u0027 % {\u0027domain\u0027: domain_name,"},{"line_number":202,"context_line":"                                     \u0027rc\u0027: instance.exitcode}"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_bdeab10b","line":199,"in_reply_to":"5f7c97a3_6b6561e0","updated":"2018-06-15 12:38:43.000000000","message":"Why is that important to the operator, given we told them that vbmc instance is terminated at line #192?","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"d0156c8a60e45aa48b2fc45cf4ca6e6073a6af39","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"            if instance and not instance.is_alive():"},{"line_number":198,"context_line":"                del self._running_domains[domain_name]"},{"line_number":199,"context_line":"                LOG.info("},{"line_number":200,"context_line":"                    \u0027Reaped vBMC instance for domain %(domain)s \u0027"},{"line_number":201,"context_line":"                    \u0027(rc %(rc)s)\u0027 % {\u0027domain\u0027: domain_name,"},{"line_number":202,"context_line":"                                     \u0027rc\u0027: instance.exitcode}"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_1dd96583","line":199,"in_reply_to":"5f7c97a3_cb115055","updated":"2018-06-15 12:38:43.000000000","message":"Done","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43ccea468edabccf8c95a620e2ba450be5948026","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"            if instance and not instance.is_alive():"},{"line_number":198,"context_line":"                del self._running_domains[domain_name]"},{"line_number":199,"context_line":"                LOG.info("},{"line_number":200,"context_line":"                    \u0027Reaped vBMC instance for domain %(domain)s \u0027"},{"line_number":201,"context_line":"                    \u0027(rc %(rc)s)\u0027 % {\u0027domain\u0027: domain_name,"},{"line_number":202,"context_line":"                                     \u0027rc\u0027: instance.exitcode}"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_6b6561e0","line":199,"in_reply_to":"5f7c97a3_cb115055","updated":"2018-06-13 16:37:45.000000000","message":"I\u0027d almost have it as a warning, at least from my POV with my operations hat on.","commit_id":"7ace4293e9bbeb49c787d85949d7f0fe568c8beb"}],"virtualbmc/tests/unit/cmd/test_vbmc.py":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"7fda3cec88aad247db44f55e947b82f8160a21ef","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import zmq"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from virtualbmc.cmd import vbmc"},{"line_number":25,"context_line":"from virtualbmc.tests.unit import base"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_ffcf6ead","line":22,"range":{"start_line":16,"start_character":0,"end_line":22,"end_character":10},"updated":"2018-03-12 12:50:45.000000000","message":"nit: remove linebreaks and sort alphabetically?","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"af0c61427cdad0da313c308a75fc5afc8de092c5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import zmq"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from virtualbmc.cmd import vbmc"},{"line_number":25,"context_line":"from virtualbmc.tests.unit import base"}],"source_content_type":"text/x-python","patch_set":22,"id":"df7087c5_5f8e91d0","line":22,"range":{"start_line":16,"start_character":0,"end_line":22,"end_character":10},"in_reply_to":"df7087c5_ffcf6ead","updated":"2018-03-12 15:34:41.000000000","message":"Done","commit_id":"f23d4d7157369097d84ad963c6026a125dc8594f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"896ba206f52303e75e51e4afffb652971c596be5","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(VBMCTestCase, self).setUp()"},{"line_number":33,"context_line":"        self.domain \u003d test_utils.get_domain()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @mock.patch.object(zmq, \u0027Context\u0027)"},{"line_number":36,"context_line":"    @mock.patch.object(zmq, \u0027Poller\u0027)"},{"line_number":37,"context_line":"    def test_main_add(self, mock_zmq_poller, mock_zmq_context):"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_f6c81e75","line":34,"updated":"2018-03-20 17:07:23.000000000","message":"What happens if the service is running but times out?","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"61191fe1d80571cb051c18f12c8ecd0337027176","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(VBMCTestCase, self).setUp()"},{"line_number":33,"context_line":"        self.domain \u003d test_utils.get_domain()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @mock.patch.object(zmq, \u0027Context\u0027)"},{"line_number":36,"context_line":"    @mock.patch.object(zmq, \u0027Poller\u0027)"},{"line_number":37,"context_line":"    def test_main_add(self, mock_zmq_poller, mock_zmq_context):"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7087c5_6210b1a9","line":34,"in_reply_to":"df7087c5_f6c81e75","updated":"2018-03-21 11:46:13.000000000","message":"Added test case for server response time out.","commit_id":"80a4420fcb63d7be692dadafd5bad300414824cc"}]}
