)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7555,"name":"Matthew Farrellee","email":"matt@redhat.com","username":"farrellee"},"change_message_id":"60cde7cdbd5e1c5998e6c0e149a36b6a1a055f21","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Wrapping ssh calls into subprocesses"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Eventlet does not work properly with Paramiko when several connections"},{"line_number":10,"context_line":"are opened concurrently. The fix moves ssh calls from main code to"},{"line_number":11,"context_line":"subprocess to avoid the issue."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAASn%2F%2FL6Y%3D","line":9,"updated":"2013-09-10 12:14:39.000000000","message":"Please be more specific than \"does not work properly\" - what are the symptoms?\n\nProvide enough information so others can evaluate the severity of the issue and understand the issue enough to reevaluate this change in the future, say if Paramiko is fixed or an alternative library is chosen","commit_id":"89a1a8bc46a60e4ca5eefe8788ca53a72e96b48f"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"5f0ea1a6f4470712f4dbec61a182370cf461c8d6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Wrapping ssh calls into subprocesses"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Eventlet does not work properly with Paramiko when several connections"},{"line_number":10,"context_line":"are opened concurrently (see bug #1212341). The fix moves ssh calls"},{"line_number":11,"context_line":"from main code to subprocess to avoid the issue."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Also changed:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2FLZc%3D","line":10,"updated":"2013-09-10 15:15:45.000000000","message":"Matthew, I\u0027ve referenced a bug here. Is it enough?","commit_id":"da7fa4515e23ef92af3f746fe33c1290c0294bfe"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"1a1973b93384ecae854fcc032619d517f314c646","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Wrapping ssh calls into subprocesses"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Eventlet does not work properly with Paramiko when several connections"},{"line_number":10,"context_line":"are opened concurrently (see bug #1212341). The fix moves ssh calls"},{"line_number":11,"context_line":"from main code to subprocess to avoid the issue."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Also changed:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAASn%2F%2FLTY%3D","line":10,"updated":"2013-09-10 15:41:47.000000000","message":"Matthew, I\u0027ve referenced a bug here. Is it enough?","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":7555,"name":"Matthew Farrellee","email":"matt@redhat.com","username":"farrellee"},"change_message_id":"e935d66e7bb0400cbddbb8d26cda03539b48ad33","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Wrapping ssh calls into subprocesses"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Eventlet does not work properly with Paramiko when several connections"},{"line_number":10,"context_line":"are opened concurrently (see bug #1212341). The fix moves ssh calls"},{"line_number":11,"context_line":"from main code to subprocess to avoid the issue."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Also changed:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAASn%2F%2FLPs%3D","line":10,"in_reply_to":"AAAASn%2F%2FLTY%3D","updated":"2013-09-10 15:56:52.000000000","message":"Yes, thanks for pointing that out!","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"}],"savanna/cli/savanna_subprocess.py":[{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e8a729a488d262f94113c496c31d8720ebef7c19","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import traceback"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def main():"},{"line_number":24,"context_line":"    # NOTE(dmitryme): since we do not read stderr in main process,"},{"line_number":25,"context_line":"    # we need to flush it somewhere, otherwise both processes might"},{"line_number":26,"context_line":"    # hang because of i/o buffer overflow."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FOKE%3D","line":23,"updated":"2013-09-09 18:50:39.000000000","message":"it\u0027ll  be great to provide some default message for case if someone runs directly this endpoint.","commit_id":"89a1a8bc46a60e4ca5eefe8788ca53a72e96b48f"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"ffd6d9130a4760a771f1137402b9deb46db03548","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import traceback"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def main():"},{"line_number":24,"context_line":"    # NOTE(dmitryme): since we do not read stderr in main process,"},{"line_number":25,"context_line":"    # we need to flush it somewhere, otherwise both processes might"},{"line_number":26,"context_line":"    # hang because of i/o buffer overflow."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FL1o%3D","line":23,"in_reply_to":"AAAASn%2F%2FOKE%3D","updated":"2013-09-10 12:39:34.000000000","message":"Seems like that is impossible, since main process communicates with subprocess via stdin/stdout. That means we can\u0027t print anything into stdout and we can\u0027t detect if user called the script directly.","commit_id":"89a1a8bc46a60e4ca5eefe8788ca53a72e96b48f"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e8a729a488d262f94113c496c31d8720ebef7c19","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            sys.stdout.flush()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":46,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FOLU%3D","line":45,"updated":"2013-09-09 18:50:39.000000000","message":"There\u0027s no need to add such section.","commit_id":"89a1a8bc46a60e4ca5eefe8788ca53a72e96b48f"}],"savanna/plugins/hdp/hadoopserver.py":[{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e8a729a488d262f94113c496c31d8720ebef7c19","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            self._setup_and_start_ambari_agent(ambari_info.host.internal_ip)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @savannautils.inject_remote(\u0027r\u0027)"},{"line_number":43,"context_line":"    def install_rpms(self, r):"},{"line_number":44,"context_line":"        LOG.info("},{"line_number":45,"context_line":"            \"{0}: Installing rpm\u0027s ...\".format(self.instance.hostname))"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FOK8%3D","line":43,"updated":"2013-09-09 18:50:39.000000000","message":"I think it\u0027ll be better to use default param name or just inject to the last arg like mock.","commit_id":"89a1a8bc46a60e4ca5eefe8788ca53a72e96b48f"}],"savanna/plugins/hdp/savannautils.py":[{"author":{"_account_id":8304,"name":"John Speidel","email":"jspeidel@hortonworks.com","username":"jspeidel"},"change_message_id":"7273be74cac5a819125f4996b15b2e56e1b76430","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return host.node_group.node_processes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def inject_remote(param_name):"},{"line_number":32,"context_line":"    def handle(func):"},{"line_number":33,"context_line":"        def call(self, *args, **kwargs):"},{"line_number":34,"context_line":"            with self.instance.remote as r:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FK3Y%3D","line":31,"updated":"2013-09-10 17:54:52.000000000","message":"Doesn\u0027t seem appropriate that this low level code for getting a remote for an instance should be specific to the HDP plugin.\nObtaining a remote should be done via the Savanna SPI.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e76b20440299b2ccb97e5636d505c5d43e7d4851","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return host.node_group.node_processes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def inject_remote(param_name):"},{"line_number":32,"context_line":"    def handle(func):"},{"line_number":33,"context_line":"        def call(self, *args, **kwargs):"},{"line_number":34,"context_line":"            with self.instance.remote as r:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FKdw%3D","line":31,"in_reply_to":"AAAASn%2F%2FK3Y%3D","updated":"2013-09-10 19:45:44.000000000","message":"This code has been added only for use in HDP plugin due to the connection caching used in it.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"1929b02746618dfd021f123750ea79e3619a2b3c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return host.node_group.node_processes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def inject_remote(param_name):"},{"line_number":32,"context_line":"    def handle(func):"},{"line_number":33,"context_line":"        def call(self, *args, **kwargs):"},{"line_number":34,"context_line":"            with self.instance.remote as r:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FJBI%3D","line":31,"in_reply_to":"AAAASn%2F%2FKdw%3D","updated":"2013-09-11 08:32:52.000000000","message":"The method is HDP-plugin specific, because it is based on knowledge that \u0027self\u0027 has \u0027instance\u0027 field. That is not applicable in case of Vanilla plugin.\n\nOn the other hand I would not call this method low-level, it is rather a helper which uses instance.remote method of SPI.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"}],"savanna/tests/integration/base.py":[{"author":{"_account_id":7125,"name":"Alexander Ignatov","email":"aignatov@mirantis.com","username":"aignatov"},"change_message_id":"ed4ce6682ef195b489ced8c5b5f91240c82b4de7","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        data \u003d data[object_type]"},{"line_number":471,"context_line":"        return data[\u0027id\u0027]"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    def _read_paramimko_stream(self, recv_func):"},{"line_number":474,"context_line":"        result \u003d \u0027\u0027"},{"line_number":475,"context_line":"        buf \u003d recv_func(1024)"},{"line_number":476,"context_line":"        while buf !\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FLRY%3D","line":473,"updated":"2013-09-10 15:52:50.000000000","message":"Looking at changes in this file, I think that the same changes have to be done in new refactored integration tests. Please see this patch: https://review.openstack.org/#/c/43925/\n\nNot sure when it should be done, after merging this patch or that one.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":7125,"name":"Alexander Ignatov","email":"aignatov@mirantis.com","username":"aignatov"},"change_message_id":"2c5587d77ef6e526789ea0ae23b7bd66381355ab","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        data \u003d data[object_type]"},{"line_number":471,"context_line":"        return data[\u0027id\u0027]"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    def _read_paramimko_stream(self, recv_func):"},{"line_number":474,"context_line":"        result \u003d \u0027\u0027"},{"line_number":475,"context_line":"        buf \u003d recv_func(1024)"},{"line_number":476,"context_line":"        while buf !\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FLPI%3D","line":473,"in_reply_to":"AAAASn%2F%2FLPU%3D","updated":"2013-09-10 16:00:32.000000000","message":"ok, +2","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"bb0c1c53dd956af396b61aad5a51192cd8bc6a96","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        data \u003d data[object_type]"},{"line_number":471,"context_line":"        return data[\u0027id\u0027]"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    def _read_paramimko_stream(self, recv_func):"},{"line_number":474,"context_line":"        result \u003d \u0027\u0027"},{"line_number":475,"context_line":"        buf \u003d recv_func(1024)"},{"line_number":476,"context_line":"        while buf !\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FLPU%3D","line":473,"in_reply_to":"AAAASn%2F%2FLRY%3D","updated":"2013-09-10 15:59:59.000000000","message":"I think, it\u0027ll be fixed in integration tests change request.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"}],"savanna/utils/remote.py":[{"author":{"_account_id":8304,"name":"John Speidel","email":"jspeidel@hortonworks.com","username":"jspeidel"},"change_message_id":"7273be74cac5a819125f4996b15b2e56e1b76430","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    _execute_command(cmd)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _execute_on_vm_interactive(cmd, matcher):"},{"line_number":138,"context_line":"    global _ssh"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    buf \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FK2A%3D","line":137,"updated":"2013-09-10 17:54:52.000000000","message":"Where is the \u0027interface\u0027 definition for what a matcher is?  How would a user know how to define a matcher class?  The definition should be part of the SPI.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e76b20440299b2ccb97e5636d505c5d43e7d4851","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    _execute_command(cmd)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _execute_on_vm_interactive(cmd, matcher):"},{"line_number":138,"context_line":"    global _ssh"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    buf \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FKdc%3D","line":137,"in_reply_to":"AAAASn%2F%2FK2A%3D","updated":"2013-09-10 19:45:44.000000000","message":"Agreed, interface should be defined. Additionally, it looks like it\u0027ll be better to use generator instead of class.","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"02e534934ae0238a1075df365ea78cfc4b76d0a4","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    _execute_command(cmd)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _execute_on_vm_interactive(cmd, matcher):"},{"line_number":138,"context_line":"    global _ssh"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    buf \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FIqg%3D","line":137,"in_reply_to":"AAAASn%2F%2FKdc%3D","updated":"2013-09-11 11:11:21.000000000","message":"I\u0027ve defined the interface in the patchset #4 in InstanceInteropHelper. As for the generator, it is not applicable here since we would need to pass some value inside on each next() call","commit_id":"db3628c9003e85f79a12230a18ce71543d69bfc6"},{"author":{"_account_id":7109,"name":"Dmitry Mescheryakov (dmitryme)","email":"dmescheryakov@mirantis.com","username":"dmitryme"},"change_message_id":"bd2200483ce2eceba6f7c1bc6011d24aedcccd74","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"_ssh \u003d None"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2FIrY%3D","line":49,"updated":"2013-09-11 11:00:30.000000000","message":"Since all these high-level methods below are private, maybe I should move them to the end of file to bring the interface functions on top?","commit_id":"a57790da420f296ff4a184fd610cb7a516721d86"}]}
