)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"cd65c60be91b4456e1c2fd32dd3fcf3e07f768d8","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the ability to measure network downtime during live"},{"line_number":10,"context_line":"migration process. There were added functions to start and stop"},{"line_number":11,"context_line":"a background pinger process and also read status from it."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I83c6a5d49f5d4da05deb677907e5048ecdd2242b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"36413b2c_523786a5","line":11,"range":{"start_line":11,"start_character":19,"end_line":11,"end_character":20},"updated":"2022-02-10 11:59:04.000000000","message":"if you\u0027d need a respin, maybe worth mentioning that the downtime measurement has 0.01 seconds granularity.","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":29350,"name":"Roman Safronov","email":"rsafrono@redhat.com","username":"rsafrono"},"change_message_id":"51be4ad7caf3f8cff361b8cdadcbae379d401213","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the ability to measure network downtime during live"},{"line_number":10,"context_line":"migration process. There were added functions to start and stop"},{"line_number":11,"context_line":"a background pinger process and also read status from it."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I83c6a5d49f5d4da05deb677907e5048ecdd2242b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"94fb7ad9_35ff9597","line":11,"range":{"start_line":11,"start_character":19,"end_line":11,"end_character":20},"in_reply_to":"36413b2c_523786a5","updated":"2022-02-13 17:00:07.000000000","message":"Done","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c2c1eabb9cb243c7e50fcfcf0d8c335dc97768da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"801c46cd_0d7f5672","updated":"2022-04-13 16:15:39.000000000","message":"Roman, do you plan to revisit the patch? Do you need any help?\nLet me know if you still take care of this test case. Thanks.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":29350,"name":"Roman Safronov","email":"rsafrono@redhat.com","username":"rsafrono"},"change_message_id":"f3a3121f2ed9e551f794b85bde1433f16d602f7b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"15aac465_da0ee511","in_reply_to":"801c46cd_0d7f5672","updated":"2022-04-18 20:05:01.000000000","message":"Not sure, I am busy with more urgent stuff for that moment.\nIIUC, Eduardo from our team is planning to work on this soon. I\u0027ve seen he also created an alternative test for our downstream tempest plugin.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"9b602669e05b153cd687baf1ef0f72674ec351e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"cdb66c0b_e862a546","updated":"2022-04-21 14:33:30.000000000","message":"recheck","commit_id":"c6fa8b0e2169699719433df0003a779b2371b57a"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"550fa0bd8efbe9b7890ea9a9f61489aa77d92fc9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"550cdc70_7561ff7c","updated":"2022-05-09 08:55:42.000000000","message":"could you please add also a releasenote as this adds a new option? After a release it will be then highlighted in the documentation. Also I wrote a few inline comments.","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"2871bb4e2f99fc1343620854dde2359436f2db35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e4c05596_851c3124","updated":"2022-05-04 18:24:58.000000000","message":"recheck","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"77484cd218d4303a33d860d25547cd27bc501cb0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"12e7b193_870d56fe","in_reply_to":"550cdc70_7561ff7c","updated":"2022-05-09 15:34:28.000000000","message":"done","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"7ba769dfffdd98c6a7edb7482e23b9f5c6ffbb75","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"d4c10176_4dafb682","updated":"2022-05-19 12:11:42.000000000","message":"looks good, we can also see the measured downtime (debug info) in https://7659ec502e6b972c0d68-4df890513c600f8ddccd838c558cc008.ssl.cf2.rackcdn.com/828686/13/check/tempest-slow-py3/ee81e83/controller/logs/tempest_log.txt","commit_id":"6af436f0cc565cf996f440eccb1a9ee42174c983"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"3e460a2e66f3d9f650b7bd5942ffe80749d33bff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"629edb73_0ac943d0","updated":"2022-06-01 07:30:33.000000000","message":"I\u0027ve verified it\u0027s working as expected, +w","commit_id":"72575889c834b9e93923102e4f5ee82e1031276f"},{"author":{"_account_id":30674,"name":"Lukas Piwowarski","email":"lpiwowar@redhat.com","username":"lukas-piwowarski"},"change_message_id":"8551ceaa5c569797310f29a71660fe22b9d2e624","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"8f567d65_a94a9d90","updated":"2022-05-26 09:29:33.000000000","message":"Looks good to me","commit_id":"72575889c834b9e93923102e4f5ee82e1031276f"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"8e9b71aff15d00237c47720ece87bfa6a009278e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"45bb27e2_88d5389e","updated":"2022-05-26 06:32:59.000000000","message":"looks good to me","commit_id":"72575889c834b9e93923102e4f5ee82e1031276f"}],"tempest/common/utils/net_downtime.py":[{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"2802854c70a0f56d0be84cb5f1c1625a8f61972b","unresolved":true,"context_lines":[{"line_number":36,"context_line":"        self.start_background_pinger()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def start_background_pinger(self):"},{"line_number":39,"context_line":"        cmd \u003d [\u0027ping\u0027, \u0027-q\u0027, \u0027-s1\u0027]"},{"line_number":40,"context_line":"        cmd.append(\u0027-i{}\u0027.format(self.interval))"},{"line_number":41,"context_line":"        cmd.append(self.dest_ip)"},{"line_number":42,"context_line":"        LOG.debug(\"Starting background pinger to \u0027{}\u0027 with interval {}\".format("}],"source_content_type":"text/x-python","patch_set":11,"id":"0f038c98_9583e243","line":39,"updated":"2022-05-09 16:10:07.000000000","message":"Looks like we should be able to extend it to other commands as curl , wget and more ... (at least having this option)\nIMO it should be more object oriended style and allow to extend this class to other commands ..\n\nsomethnig like:\nBaseDowntimeMeter(fixture.Fixture):\ndef  __init__ ... \ndef  start_background_command(self, command)\ndef get_downtime(....)\n\nthe command parser should be a function in the class\ndef _parse_command(self):\n.....\n\nclass PingDownMeter(BaseDowntimeMeter):\n# add your code here\ndef _parse_command(self):\n\nclass WgetDownMeter(BaseDowntimeMeter):\ndef _parse_command(self):\n\n\nIn this way your code will be opened for extention and you will be able to add more capabilites ....","commit_id":"505cfb1205c7e8de79ee9493cfd67008f4dea510"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"695a393af4d7dfd5ddf0d75e6d37d5b90dab5df4","unresolved":true,"context_lines":[{"line_number":36,"context_line":"        self.start_background_pinger()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def start_background_pinger(self):"},{"line_number":39,"context_line":"        cmd \u003d [\u0027ping\u0027, \u0027-q\u0027, \u0027-s1\u0027]"},{"line_number":40,"context_line":"        cmd.append(\u0027-i{}\u0027.format(self.interval))"},{"line_number":41,"context_line":"        cmd.append(self.dest_ip)"},{"line_number":42,"context_line":"        LOG.debug(\"Starting background pinger to \u0027{}\u0027 with interval {}\".format("}],"source_content_type":"text/x-python","patch_set":11,"id":"c6708020_cbfe4fa8","line":39,"in_reply_to":"0f038c98_9583e243","updated":"2022-05-11 09:01:21.000000000","message":"I planned to measure downtime between two instances [1] (in this test we measure downtime from the test machine to the instance), but it is not possible using cirros, so we\u0027ll have to implement that test on neutron-tempest-plugin.\nIn this case, I would need to support sending pings from an ssh session, instead of a local process, so I\u0027d have to extend the BaseDowntimeMeter class.\n\n\nHowever, I think this can be done on a separate patch and in any case I don\u0027t plan to implement support for other meters.\n\n\n\n[1] https://review.opendev.org/c/openstack/tempest/+/838518","commit_id":"505cfb1205c7e8de79ee9493cfd67008f4dea510"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"7ba769dfffdd98c6a7edb7482e23b9f5c6ffbb75","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from tempest import config"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5ca02960_f4f9bee4","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":4},"updated":"2022-05-19 12:11:42.000000000","message":"seems this is not used","commit_id":"5928ff9bf84e3494aa8bde4843d544b6ae4ceeee"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"78e179a72639029a277843b64f082367fee6b973","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from tempest import config"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"a6fe3ffb_e627ff7a","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":4},"in_reply_to":"5ca02960_f4f9bee4","updated":"2022-05-19 13:08:38.000000000","message":"Done","commit_id":"5928ff9bf84e3494aa8bde4843d544b6ae4ceeee"}],"tempest/common/utils/pingers.py":[{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"51d145d10408f609b8dd1040e087d93587ee081c","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            self.ping_process.terminate()"},{"line_number":53,"context_line":"        self.ping_process \u003d None"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def stop_pinger_and_get_downtime(self):"},{"line_number":56,"context_line":"        self.ping_process.send_signal(signal.SIGQUIT)"},{"line_number":57,"context_line":"        # Example of the expected output:"},{"line_number":58,"context_line":"        # 264/274 packets, 3% loss"}],"source_content_type":"text/x-python","patch_set":5,"id":"623b8ec3_9b51547b","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":36},"updated":"2022-04-21 08:26:12.000000000","message":"the name of this function is not accurate - the pinger process is not really stopped by the SIGQUIT signal\nI\u0027m sending a patch to correct this","commit_id":"d03886a4305981983f15d1cc255506d82e58e7d2"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"46856421a53de86fc165e8f6038b53775813f5cb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            self.ping_process.terminate()"},{"line_number":53,"context_line":"        self.ping_process \u003d None"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def stop_pinger_and_get_downtime(self):"},{"line_number":56,"context_line":"        self.ping_process.send_signal(signal.SIGQUIT)"},{"line_number":57,"context_line":"        # Example of the expected output:"},{"line_number":58,"context_line":"        # 264/274 packets, 3% loss"}],"source_content_type":"text/x-python","patch_set":5,"id":"f5500fb5_6dc5a321","line":55,"range":{"start_line":55,"start_character":8,"end_line":55,"end_character":36},"in_reply_to":"623b8ec3_9b51547b","updated":"2022-04-21 09:24:58.000000000","message":"Done","commit_id":"d03886a4305981983f15d1cc255506d82e58e7d2"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"090852fcdfdff6fd2290d13396a9d393e6834612","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        # 264/274 packets, 3% loss"},{"line_number":59,"context_line":"        output \u003d self.ping_process.stderr.readline().strip()"},{"line_number":60,"context_line":"        if output:"},{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"}],"source_content_type":"text/x-python","patch_set":8,"id":"01d6c5fb_ac94a599","line":61,"updated":"2022-05-03 16:16:43.000000000","message":"when is it \u0027str\u0027? I believe readline() will always return a bytes object.","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"a35fdaa4f490cd35bb6d600c22fda8e533ae18c4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # 264/274 packets, 3% loss"},{"line_number":59,"context_line":"        output \u003d self.ping_process.stderr.readline().strip()"},{"line_number":60,"context_line":"        if output:"},{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"}],"source_content_type":"text/x-python","patch_set":8,"id":"42bdbfe6_5b3d0786","line":61,"in_reply_to":"01d6c5fb_ac94a599","updated":"2022-05-04 09:43:24.000000000","message":"it was needed for the extension of this patch I\u0027m working on, which uses ssh_client.exec_command, but it makes no sense in this patch, you are right 😊","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"090852fcdfdff6fd2290d13396a9d393e6834612","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        if output:"},{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"}],"source_content_type":"text/x-python","patch_set":8,"id":"47833d52_d051de9f","line":63,"range":{"start_line":63,"start_character":15,"end_line":63,"end_character":38},"updated":"2022-05-03 16:16:43.000000000","message":"AFAIU this is the same as just checking that \"output\" is not empty. In this case, just \u0027if output\u0027","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"a35fdaa4f490cd35bb6d600c22fda8e533ae18c4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        if output:"},{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"}],"source_content_type":"text/x-python","patch_set":8,"id":"15d3001b_f32dab33","line":63,"range":{"start_line":63,"start_character":15,"end_line":63,"end_character":38},"in_reply_to":"47833d52_d051de9f","updated":"2022-05-04 09:43:24.000000000","message":"Done","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"090852fcdfdff6fd2290d13396a9d393e6834612","unresolved":true,"context_lines":[{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"},{"line_number":67,"context_line":"            LOG.warning(\u0027Unexpected output obtained from the pinger: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7d76a0a9_410a4c62","line":64,"range":{"start_line":64,"start_character":20,"end_line":64,"end_character":48},"updated":"2022-05-03 16:16:43.000000000","message":"store it somewhere so that you don\u0027t need to call it the second time the next line","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"6d3fdd2c7c6dc4011310b9e5f2627b56a956de86","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"},{"line_number":67,"context_line":"            LOG.warning(\u0027Unexpected output obtained from the pinger: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"b3fc40d3_4a66850e","line":64,"range":{"start_line":64,"start_character":20,"end_line":64,"end_character":48},"in_reply_to":"7d76a0a9_410a4c62","updated":"2022-05-04 09:43:58.000000000","message":"I tried this, but it fails on pep8 verification:\n        if output and len(res:\u003doutput.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:              \n            succ, total \u003d res                                                   \n            return (int(total) - int(succ)) * float(self.interval)              \n\nApparently, it\u0027s only available from python 3.8 onwards:\nhttps://peps.python.org/pep-0572/\n\nSo, I think it\u0027s ok as it is.","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"35cc0cb2f92e46de108782131a3467b38d78778e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            if type(output) !\u003d str:"},{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"},{"line_number":67,"context_line":"            LOG.warning(\u0027Unexpected output obtained from the pinger: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"2bda70cb_aff3d6ce","line":64,"range":{"start_line":64,"start_character":20,"end_line":64,"end_character":48},"in_reply_to":"b3fc40d3_4a66850e","updated":"2022-05-05 01:47:23.000000000","message":"I was not aware of res:\u003d notation. :) just thought you could store the result in a variable to avoid doing the same thing twice. obviously it\u0027s not that important since this code is not performance critical, I just dislike copy-paste, even when that tiny. :)\n\nI thought something like:\n\nif output:\n   res \u003d ...split(...)\n   if len(res) \u003d\u003d 2:\n       succ, total \u003d res\n\nAgain, not critical, just pet peeve.","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"090852fcdfdff6fd2290d13396a9d393e6834612","unresolved":true,"context_lines":[{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"},{"line_number":67,"context_line":"            LOG.warning(\u0027Unexpected output obtained from the pinger: %s\u0027,"},{"line_number":68,"context_line":"                        output)"}],"source_content_type":"text/x-python","patch_set":8,"id":"db015f42_26c607be","line":65,"updated":"2022-05-03 16:16:43.000000000","message":"I think this would be more explicit:\n\nsucc, total \u003d ...split(\u0027/\u0027)\n\nAnd then you can use the names in the next line; the formula would look slightly easier to read","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"a35fdaa4f490cd35bb6d600c22fda8e533ae18c4","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                output \u003d output.decode(\u0027utf-8\u0027)"},{"line_number":63,"context_line":"            if len(output.split()) \u003e 0 and len("},{"line_number":64,"context_line":"                    output.split()[0].split(\u0027/\u0027)) \u003d\u003d 2:"},{"line_number":65,"context_line":"                res \u003d output.split()[0].split(\u0027/\u0027)"},{"line_number":66,"context_line":"                return (int(res[1]) - int(res[0])) * float(self.interval)"},{"line_number":67,"context_line":"            LOG.warning(\u0027Unexpected output obtained from the pinger: %s\u0027,"},{"line_number":68,"context_line":"                        output)"}],"source_content_type":"text/x-python","patch_set":8,"id":"752629d8_cfbb9121","line":65,"in_reply_to":"db015f42_26c607be","updated":"2022-05-04 09:43:24.000000000","message":"Done","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":11075,"name":"Benny Kopilov","email":"bkopilov@redhat.com","username":"bkopilov"},"change_message_id":"cc962a05efb4ebc9f4c08734d94dbd9dad4ba6dd","unresolved":true,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Pinger(fixtures.Fixture):"},{"line_number":29,"context_line":"    def __init__(self, dest_ip, interval\u003d\u00270.2\u0027):"},{"line_number":30,"context_line":"        self.dest_ip \u003d dest_ip"},{"line_number":31,"context_line":"        # Note: for intervals lower than 0.2 ping requires root privileges"}],"source_content_type":"text/x-python","patch_set":9,"id":"05632da3_226a328a","line":28,"updated":"2022-05-04 11:03:13.000000000","message":"Hi Questions.\non tempest there is a ping util def ping_host(self, host, count\u003dNone, size\u003dNone, nic\u003dNone) under remote_client .. asking if its possible to extend it a little bit.\nsomething like ping host \u0026 (and you can catch the job id) it will run in parallel and you can kill it.","commit_id":"164967145fc4a1d6304567f3147be41311ba5f55"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"550fa0bd8efbe9b7890ea9a9f61489aa77d92fc9","unresolved":true,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Pinger(fixtures.Fixture):"},{"line_number":29,"context_line":"    def __init__(self, dest_ip, interval\u003d\u00270.2\u0027):"},{"line_number":30,"context_line":"        self.dest_ip \u003d dest_ip"},{"line_number":31,"context_line":"        # Note: for intervals lower than 0.2 ping requires root privileges"}],"source_content_type":"text/x-python","patch_set":10,"id":"7666a31e_177f9628","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":12},"updated":"2022-05-09 08:55:42.000000000","message":"maybe NetDowntimeMeasure, NetDowntime, GetNetDowntime would be more appropriate names? Pinger is too generic and it collides a bit with the ping_host method Benny mentioned - this class offers much more than just a ping.","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"77484cd218d4303a33d860d25547cd27bc501cb0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Pinger(fixtures.Fixture):"},{"line_number":29,"context_line":"    def __init__(self, dest_ip, interval\u003d\u00270.2\u0027):"},{"line_number":30,"context_line":"        self.dest_ip \u003d dest_ip"},{"line_number":31,"context_line":"        # Note: for intervals lower than 0.2 ping requires root privileges"}],"source_content_type":"text/x-python","patch_set":10,"id":"c6b2cc77_16917e54","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":12},"in_reply_to":"7666a31e_177f9628","updated":"2022-05-09 15:34:28.000000000","message":"Done","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"}],"tempest/config.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":975,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":976,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":977,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":978,"context_line":"               default\u003d5,"},{"line_number":979,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":980,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":981,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"7fe984c4_3181cd77","line":978,"updated":"2022-02-16 17:26:51.000000000","message":"I\u0027d start with something more conservative... like 30. Some backends may be slow.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5aa845572480975c7657934847baab85273dfc02","unresolved":false,"context_lines":[{"line_number":975,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":976,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":977,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":978,"context_line":"               default\u003d5,"},{"line_number":979,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":980,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":981,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"23c61202_19c5bc2a","line":978,"in_reply_to":"5a929238_5c3ff5fa","updated":"2022-04-13 16:14:46.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5aa845572480975c7657934847baab85273dfc02","unresolved":false,"context_lines":[{"line_number":975,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":976,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":977,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":978,"context_line":"               default\u003d5,"},{"line_number":979,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":980,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":981,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"99aa9b5d_046c9327","line":978,"in_reply_to":"5a929238_5c3ff5fa","updated":"2022-04-13 16:14:46.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"621c56994988efc9952fa7b6d92f395b6022d364","unresolved":true,"context_lines":[{"line_number":975,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":976,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":977,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":978,"context_line":"               default\u003d5,"},{"line_number":979,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":980,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":981,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a929238_5c3ff5fa","line":978,"in_reply_to":"7fe984c4_3181cd77","updated":"2022-02-16 17:41:21.000000000","message":"on second thought, maybe scrap that. 5 is reasonable and I see ovn succeeded in 1 sec, as per logs, so there\u0027s plenty of room. If it\u0027s not enough for some, there\u0027s an easy way to bump it.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"428f56d5c09e24d1731d8b83d789859747e6973a","unresolved":true,"context_lines":[{"line_number":978,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":979,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":980,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":981,"context_line":"               default\u003d5,"},{"line_number":982,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":983,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":984,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":8,"id":"9e75219e_23738b72","line":981,"range":{"start_line":981,"start_character":15,"end_line":981,"end_character":24},"updated":"2022-05-03 15:11:59.000000000","message":"the get_downtime() function seems to return a float.\nPerhaps this would be better as a float for consistency but also in case we want more granularity (eg. 0.5 or 1.5)","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"a35fdaa4f490cd35bb6d600c22fda8e533ae18c4","unresolved":false,"context_lines":[{"line_number":978,"context_line":"               help\u003d\u0027Type of key to use for ssh connections. \u0027"},{"line_number":979,"context_line":"                    \u0027Valid types are rsa, ecdsa\u0027),"},{"line_number":980,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":981,"context_line":"               default\u003d5,"},{"line_number":982,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":983,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":984,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":8,"id":"4e93bbf6_e4dcb1ba","line":981,"range":{"start_line":981,"start_character":15,"end_line":981,"end_character":24},"in_reply_to":"9e75219e_23738b72","updated":"2022-05-04 09:43:24.000000000","message":"Done","commit_id":"9f282534a4338304196a5b8c448d0fa0c282d1a6"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"550fa0bd8efbe9b7890ea9a9f61489aa77d92fc9","unresolved":true,"context_lines":[{"line_number":980,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":981,"context_line":"               default\u003d5.0,"},{"line_number":982,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":983,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":984,"context_line":"]"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"volume_group \u003d cfg.OptGroup(name\u003d\u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"2e50043f_ccd4bf43","line":983,"range":{"start_line":983,"start_character":42,"end_line":983,"end_character":44},"updated":"2022-05-09 08:55:42.000000000","message":"could we add also a brief description of what happens when downtime will be greater than allowed_network_downtime? It would provide an easier understanding of what the value does for the users.","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"77484cd218d4303a33d860d25547cd27bc501cb0","unresolved":false,"context_lines":[{"line_number":980,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":981,"context_line":"               default\u003d5.0,"},{"line_number":982,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":983,"context_line":"                    \"migration, in seconds.\"),"},{"line_number":984,"context_line":"]"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"volume_group \u003d cfg.OptGroup(name\u003d\u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"11c40634_b9d4e1bd","line":983,"range":{"start_line":983,"start_character":42,"end_line":983,"end_character":44},"in_reply_to":"2e50043f_ccd4bf43","updated":"2022-05-09 15:34:28.000000000","message":"Done","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":30674,"name":"Lukas Piwowarski","email":"lpiwowar@redhat.com","username":"lukas-piwowarski"},"change_message_id":"8551ceaa5c569797310f29a71660fe22b9d2e624","unresolved":true,"context_lines":[{"line_number":968,"context_line":"    cfg.IntOpt(\u0027allowed_network_downtime\u0027,"},{"line_number":969,"context_line":"               default\u003d5.0,"},{"line_number":970,"context_line":"               help\u003d\"Allowed VM network connection downtime during live \""},{"line_number":971,"context_line":"                    \"migration, in seconds. \""},{"line_number":972,"context_line":"                    \"When the measured downtime exceeds this value, an \""},{"line_number":973,"context_line":"                    \"exception is raised.\"),"},{"line_number":974,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":15,"id":"45e79d57_7cdc9788","line":971,"range":{"start_line":971,"start_character":43,"end_line":971,"end_character":45},"updated":"2022-05-26 09:29:33.000000000","message":"This is really a nit. Making this a continuous line would look better, I think. So it is consistent with the rest of the config.py.","commit_id":"72575889c834b9e93923102e4f5ee82e1031276f"}],"tempest/scenario/manager.py":[{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"cd65c60be91b4456e1c2fd32dd3fcf3e07f768d8","unresolved":true,"context_lines":[{"line_number":1553,"context_line":"    @staticmethod"},{"line_number":1554,"context_line":"    def start_background_pinger(ip_address, interval\u003d0.01):"},{"line_number":1555,"context_line":"        # For intervals lower than 0.2 ping requires root privileges"},{"line_number":1556,"context_line":"        cmd \u003d [\u0027sudo\u0027, \u0027ping\u0027, \u0027-q\u0027]"},{"line_number":1557,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"},{"line_number":1558,"context_line":"        cmd.append(ip_address)"},{"line_number":1559,"context_line":"        LOG.debug("},{"line_number":1560,"context_line":"            \"Starting background pinger to \u0027{}\u0027 with interval {}\".format("}],"source_content_type":"text/x-python","patch_set":1,"id":"0440051b_5f69e381","line":1557,"range":{"start_line":1556,"start_character":0,"end_line":1557,"end_character":43},"updated":"2022-02-10 11:59:04.000000000","message":"the root part is not too bad, it\u0027s used in other places.\nYou could also do \n\nif interval \u003c 0.2:\n    cmd.insert(0, \u0027sudo\u0027)\n\nBut then it\u0027d complicate the process kill","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":29350,"name":"Roman Safronov","email":"rsafrono@redhat.com","username":"rsafrono"},"change_message_id":"51be4ad7caf3f8cff361b8cdadcbae379d401213","unresolved":true,"context_lines":[{"line_number":1553,"context_line":"    @staticmethod"},{"line_number":1554,"context_line":"    def start_background_pinger(ip_address, interval\u003d0.01):"},{"line_number":1555,"context_line":"        # For intervals lower than 0.2 ping requires root privileges"},{"line_number":1556,"context_line":"        cmd \u003d [\u0027sudo\u0027, \u0027ping\u0027, \u0027-q\u0027]"},{"line_number":1557,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"},{"line_number":1558,"context_line":"        cmd.append(ip_address)"},{"line_number":1559,"context_line":"        LOG.debug("},{"line_number":1560,"context_line":"            \"Starting background pinger to \u0027{}\u0027 with interval {}\".format("}],"source_content_type":"text/x-python","patch_set":1,"id":"8e1c8a36_4539c6cc","line":1557,"range":{"start_line":1556,"start_character":0,"end_line":1557,"end_character":43},"in_reply_to":"0440051b_5f69e381","updated":"2022-02-13 17:00:07.000000000","message":"Decided to leave as is for now since some additional code probably will be needed for proper cleanup.","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"46856421a53de86fc165e8f6038b53775813f5cb","unresolved":true,"context_lines":[{"line_number":1553,"context_line":"    @staticmethod"},{"line_number":1554,"context_line":"    def start_background_pinger(ip_address, interval\u003d0.01):"},{"line_number":1555,"context_line":"        # For intervals lower than 0.2 ping requires root privileges"},{"line_number":1556,"context_line":"        cmd \u003d [\u0027sudo\u0027, \u0027ping\u0027, \u0027-q\u0027]"},{"line_number":1557,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"},{"line_number":1558,"context_line":"        cmd.append(ip_address)"},{"line_number":1559,"context_line":"        LOG.debug("},{"line_number":1560,"context_line":"            \"Starting background pinger to \u0027{}\u0027 with interval {}\".format("}],"source_content_type":"text/x-python","patch_set":1,"id":"11f38cc3_451b12ce","line":1557,"range":{"start_line":1556,"start_character":0,"end_line":1557,"end_character":43},"in_reply_to":"8e1c8a36_4539c6cc","updated":"2022-04-21 09:24:58.000000000","message":"is it ok to leave this restriction (interval\u003e\u003d0.2) for the moment?","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"cd65c60be91b4456e1c2fd32dd3fcf3e07f768d8","unresolved":true,"context_lines":[{"line_number":1555,"context_line":"        # For intervals lower than 0.2 ping requires root privileges"},{"line_number":1556,"context_line":"        cmd \u003d [\u0027sudo\u0027, \u0027ping\u0027, \u0027-q\u0027]"},{"line_number":1557,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"},{"line_number":1558,"context_line":"        cmd.append(ip_address)"},{"line_number":1559,"context_line":"        LOG.debug("},{"line_number":1560,"context_line":"            \"Starting background pinger to \u0027{}\u0027 with interval {}\".format("},{"line_number":1561,"context_line":"                ip_address, interval))"}],"source_content_type":"text/x-python","patch_set":1,"id":"816885ab_2d4c389f","line":1558,"range":{"start_line":1558,"start_character":0,"end_line":1558,"end_character":30},"updated":"2022-02-10 11:59:04.000000000","message":"What about reducing the overall bandwidth used by adding \n\u0027-s 1\u0027 to the ping command?\n\n$ ping 127.0.0.1 -s 1\nPING 127.0.0.1 (127.0.0.1) 1(29) bytes of data.\n\n\n$ ping 127.0.0.1\nPING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.\n\n\n\n$ tcpdump: verbose output suppressed, use -v or -vv for full protocol decode\nlistening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes\n11:57:50.613971 IP localhost \u003e localhost: ICMP echo request, id 5, seq 12, length 64\n\n11:57:54.042920 IP localhost \u003e localhost: ICMP echo request, id 6, seq 1, length 9","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":29350,"name":"Roman Safronov","email":"rsafrono@redhat.com","username":"rsafrono"},"change_message_id":"51be4ad7caf3f8cff361b8cdadcbae379d401213","unresolved":false,"context_lines":[{"line_number":1555,"context_line":"        # For intervals lower than 0.2 ping requires root privileges"},{"line_number":1556,"context_line":"        cmd \u003d [\u0027sudo\u0027, \u0027ping\u0027, \u0027-q\u0027]"},{"line_number":1557,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"},{"line_number":1558,"context_line":"        cmd.append(ip_address)"},{"line_number":1559,"context_line":"        LOG.debug("},{"line_number":1560,"context_line":"            \"Starting background pinger to \u0027{}\u0027 with interval {}\".format("},{"line_number":1561,"context_line":"                ip_address, interval))"}],"source_content_type":"text/x-python","patch_set":1,"id":"30c8bc4b_57ce4abf","line":1558,"range":{"start_line":1558,"start_character":0,"end_line":1558,"end_character":30},"in_reply_to":"816885ab_2d4c389f","updated":"2022-02-13 17:00:07.000000000","message":"agree, makes sense","commit_id":"a9d1ba7a7b3e48872537d8ee371bdd29e0b708e9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1201,"context_line":"        return self.create_volume(name\u003dname, imageRef\u003dimage_id, **kwargs)"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"class NetworkScenarioTest(ScenarioTest):"},{"line_number":1205,"context_line":"    \"\"\"Base class for network scenario tests."},{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"    This class provide helpers for network scenario tests, using the neutron"}],"source_content_type":"text/x-python","patch_set":3,"id":"7e870b80_95284b6b","line":1204,"updated":"2022-02-16 17:26:51.000000000","message":"this class seems to be a kitchen sink for misc functions / helpers. Since pinger doesn\u0027t have any dependencies on the class, I\u0027d suggest to move the new functions to module level (also see the idea about introducing a separate class, that would also reside on module level, here or in a separate tiny module pinger.py).","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"fbb5bb94655c3cbe016774c370f6de6a7d2c06b2","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"        return self.create_volume(name\u003dname, imageRef\u003dimage_id, **kwargs)"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"class NetworkScenarioTest(ScenarioTest):"},{"line_number":1205,"context_line":"    \"\"\"Base class for network scenario tests."},{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"    This class provide helpers for network scenario tests, using the neutron"}],"source_content_type":"text/x-python","patch_set":3,"id":"3c121f1d_c3c423b2","line":1204,"in_reply_to":"7e870b80_95284b6b","updated":"2022-04-19 09:47:13.000000000","message":"Done.\nThe new module pingers.py will probably include in a later patch code to test downtime during live migration sending pings between VMs (east/west)","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1552,"context_line":"        return network, subnet, router"},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":"    @staticmethod"},{"line_number":1555,"context_line":"    def start_background_pinger(ip_address, interval\u003d0.2):"},{"line_number":1556,"context_line":"        # Note: for intervals lower than 0.2 ping requires root privileges"},{"line_number":1557,"context_line":"        cmd \u003d [\u0027ping\u0027, \u0027-q\u0027, \u0027-s1\u0027]"},{"line_number":1558,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"}],"source_content_type":"text/x-python","patch_set":3,"id":"8b290ad5_21cdec4b","line":1555,"range":{"start_line":1555,"start_character":53,"end_line":1555,"end_character":56},"updated":"2022-02-16 17:26:51.000000000","message":"Does python guarantee that str(0.2) will result in \u00270.2\u0027 string? Can it perhaps generate e.g. \u00270.199999999998\u0027 that would be below the limit you stated ping has for rootless operation (0.2).\n\nMaybe using a string literal is a better idea if we are not sure python always normalizes float-to-string conversion result.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"fbb5bb94655c3cbe016774c370f6de6a7d2c06b2","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"        return network, subnet, router"},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":"    @staticmethod"},{"line_number":1555,"context_line":"    def start_background_pinger(ip_address, interval\u003d0.2):"},{"line_number":1556,"context_line":"        # Note: for intervals lower than 0.2 ping requires root privileges"},{"line_number":1557,"context_line":"        cmd \u003d [\u0027ping\u0027, \u0027-q\u0027, \u0027-s1\u0027]"},{"line_number":1558,"context_line":"        cmd.append(\u0027-i{}\u0027.format(interval))"}],"source_content_type":"text/x-python","patch_set":3,"id":"b3151407_d88703c2","line":1555,"range":{"start_line":1555,"start_character":53,"end_line":1555,"end_character":56},"in_reply_to":"8b290ad5_21cdec4b","updated":"2022-04-19 09:47:13.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1565,"context_line":"            preexec_fn\u003dos.setsid)"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"    @staticmethod"},{"line_number":1568,"context_line":"    def get_pinger_downtime(process, probes_per_second\u003d5):"},{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6bc5801_fafb32c3","line":1568,"range":{"start_line":1568,"start_character":37,"end_line":1568,"end_character":56},"updated":"2022-02-16 17:26:51.000000000","message":"nit: this seems like a derivative of the interval\u003d argument that is passed to start_background_pinger: int(1/interval))\n\nI\u0027d suggest to wrap the pinger into a class that would store the interval used to start it internally, then this argument would not be needed. Smth like:\n\nclass Pinger:\n    def __init__(ip_address, interval\u003d\u00270.2\u0027):\n        self.interval\u003dfloat(interval)\n        self.start_background_pinger(ip_address, interval)\n\n    @property\n    def frequency(self):\n        return 1 / self.interval\n\n    def start_background_pinger(...):\n        ...\n        self.__process \u003d subprocess.Popen(...)\n\n    @property\n    def downtime(self):\n        ...","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"fbb5bb94655c3cbe016774c370f6de6a7d2c06b2","unresolved":false,"context_lines":[{"line_number":1565,"context_line":"            preexec_fn\u003dos.setsid)"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"    @staticmethod"},{"line_number":1568,"context_line":"    def get_pinger_downtime(process, probes_per_second\u003d5):"},{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f26b2b9e_cfe800a2","line":1568,"range":{"start_line":1568,"start_character":37,"end_line":1568,"end_character":56},"in_reply_to":"b6bc5801_fafb32c3","updated":"2022-04-19 09:47:13.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"},{"line_number":1572,"context_line":"            res \u003d output.strip().decode(\u0027utf-8\u0027).split()[0].split(\u0027/\u0027)"},{"line_number":1573,"context_line":"            return (int(res[1]) - int(res[0])) / probes_per_second"},{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fbedb6b_9bbef9e2","line":1572,"range":{"start_line":1572,"start_character":56,"end_line":1572,"end_character":59},"updated":"2022-02-16 17:26:51.000000000","message":"nit: for code correctness, it would probably be better to first check that the result of the first split() is not an empty list.\n\nSame for the second split result.","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"},{"line_number":1572,"context_line":"            res \u003d output.strip().decode(\u0027utf-8\u0027).split()[0].split(\u0027/\u0027)"},{"line_number":1573,"context_line":"            return (int(res[1]) - int(res[0])) / probes_per_second"},{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"d7fa8ed8_3b2fff29","line":1572,"updated":"2022-02-16 17:26:51.000000000","message":"please add an example of the output in a comment to ease life for the future reader. E.g.\n\n# 0/13 packets, 100% loss","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"46856421a53de86fc165e8f6038b53775813f5cb","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"},{"line_number":1572,"context_line":"            res \u003d output.strip().decode(\u0027utf-8\u0027).split()[0].split(\u0027/\u0027)"},{"line_number":1573,"context_line":"            return (int(res[1]) - int(res[0])) / probes_per_second"},{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"55c83d29_c9daaa11","line":1572,"range":{"start_line":1572,"start_character":56,"end_line":1572,"end_character":59},"in_reply_to":"9fbedb6b_9bbef9e2","updated":"2022-04-21 09:24:58.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"fbb5bb94655c3cbe016774c370f6de6a7d2c06b2","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"        process.send_signal(signal.SIGQUIT)"},{"line_number":1570,"context_line":"        output \u003d process.stderr.readline()"},{"line_number":1571,"context_line":"        if output:"},{"line_number":1572,"context_line":"            res \u003d output.strip().decode(\u0027utf-8\u0027).split()[0].split(\u0027/\u0027)"},{"line_number":1573,"context_line":"            return (int(res[1]) - int(res[0])) / probes_per_second"},{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"e2b5042a_8150d2e5","line":1572,"in_reply_to":"d7fa8ed8_3b2fff29","updated":"2022-04-19 09:47:13.000000000","message":"Done","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c83070dc9a029ff588a906960904b0d495b2ce0c","unresolved":true,"context_lines":[{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"},{"line_number":1576,"context_line":"    def stop_background_pinger(process):"},{"line_number":1577,"context_line":"        LOG.debug(\u0027Stopping background pinger\u0027)"},{"line_number":1578,"context_line":"        process.terminate()"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"031322f4_5c5e057c","line":1577,"updated":"2022-02-16 17:26:51.000000000","message":"if you adopt the idea above with a Pinger class, then the message could usefully report some additional info about the specific pinger stopped, like cmdline used, its pid...","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"fbb5bb94655c3cbe016774c370f6de6a7d2c06b2","unresolved":false,"context_lines":[{"line_number":1574,"context_line":""},{"line_number":1575,"context_line":"    @staticmethod"},{"line_number":1576,"context_line":"    def stop_background_pinger(process):"},{"line_number":1577,"context_line":"        LOG.debug(\u0027Stopping background pinger\u0027)"},{"line_number":1578,"context_line":"        process.terminate()"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1c047329_e275c856","line":1577,"in_reply_to":"031322f4_5c5e057c","updated":"2022-04-19 09:47:13.000000000","message":"Done\nHmmm, maybe I can add the command line too, using process.args","commit_id":"5c631bdbe936f3fcee07b77257b6a9e974ecd42a"}],"tempest/scenario/test_network_advanced_server_ops.py":[{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"550fa0bd8efbe9b7890ea9a9f61489aa77d92fc9","unresolved":true,"context_lines":[{"line_number":246,"context_line":"                          \u0027tests.\u0027)"},{"line_number":247,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":248,"context_line":"    @utils.services(\u0027compute\u0027, \u0027network\u0027)"},{"line_number":249,"context_line":"    def test_server_connectivity_live_migration(self):"},{"line_number":250,"context_line":"        keypair \u003d self.create_keypair()"},{"line_number":251,"context_line":"        server \u003d self._setup_server(keypair)"},{"line_number":252,"context_line":"        floating_ip \u003d self._setup_network(server, keypair)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff82409b_738fbfbd","line":249,"range":{"start_line":249,"start_character":8,"end_line":249,"end_character":47},"updated":"2022-05-09 08:55:42.000000000","message":"there are a few more tests which test live migration, see tempest/api/compute/admin/test_live_migration.py file .. do we want to use this network downtime measurement there as well?","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"77484cd218d4303a33d860d25547cd27bc501cb0","unresolved":true,"context_lines":[{"line_number":246,"context_line":"                          \u0027tests.\u0027)"},{"line_number":247,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":248,"context_line":"    @utils.services(\u0027compute\u0027, \u0027network\u0027)"},{"line_number":249,"context_line":"    def test_server_connectivity_live_migration(self):"},{"line_number":250,"context_line":"        keypair \u003d self.create_keypair()"},{"line_number":251,"context_line":"        server \u003d self._setup_server(keypair)"},{"line_number":252,"context_line":"        floating_ip \u003d self._setup_network(server, keypair)"}],"source_content_type":"text/x-python","patch_set":10,"id":"b610d751_4e3800c4","line":249,"range":{"start_line":249,"start_character":8,"end_line":249,"end_character":47},"in_reply_to":"ff82409b_738fbfbd","updated":"2022-05-09 15:34:28.000000000","message":"AFAICS, this was the only tempest test covering live migration where the connectivity to the server is tested.\nThe other tests are API tests (no connectivity verifications) and [1], which is a scenario test but it seems connectivity is not verified.\nMaybe I can add the downtime verification to [1].\n\nApart from this, I was planning to create a similar live migration test, but measuring the downtime between two VMs. Finally I realized this is not possible in tempest because cirros does not support \"ping -i\u003cinterval\u003e\". So, I will probably implement it under neutron-tempest-plugin.\n\n\n[1] https://opendev.org/openstack/tempest/src/commit/a7bedbde46ae2aec796837a7e69fbf35747f75cb/tempest/scenario/test_network_qos_placement.py#L1044\n[2] https://review.opendev.org/c/openstack/tempest/+/838518","commit_id":"d73d25df513c10600cf3460efeb940e64996edd5"}]}
