)]}'
{"os_vif/tests/functional/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"916f8330162b3cc53e8d81c585c34e113372c1c3","unresolved":false,"context_lines":[{"line_number":40,"context_line":"DEFAULT_LOG_DIR \u003d os.path.join(_get_test_log_path(), \u0027osvif-functional-logs\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def wait_until_true(predicate, timeout\u003d15, sleep\u003d1):"},{"line_number":44,"context_line":"    \"\"\"Wait until callable predicate is evaluated as True"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    :param predicate: Callable deciding whether waiting should continue."},{"line_number":47,"context_line":"                      Best practice is to instantiate predicate with"},{"line_number":48,"context_line":"                      ``functools.partial()``."},{"line_number":49,"context_line":"    :param timeout: Timeout in seconds how long should function wait."},{"line_number":50,"context_line":"    :param sleep: Polling interval for results in seconds."},{"line_number":51,"context_line":"    :return: True if the predicate is evaluated as True within the timeout,"},{"line_number":52,"context_line":"             False in case of timeout evaluating the predicate."},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        with eventlet.Timeout(timeout):"},{"line_number":56,"context_line":"            while not predicate():"},{"line_number":57,"context_line":"                eventlet.sleep(sleep)"},{"line_number":58,"context_line":"    except eventlet.Timeout:"},{"line_number":59,"context_line":"        return False"},{"line_number":60,"context_line":"    return True"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class _CatchTimeoutMetaclass(abc.ABCMeta):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d3bf885e","line":60,"range":{"start_line":43,"start_character":0,"end_line":60,"end_character":15},"updated":"2019-03-28 11:38:31.000000000","message":"i know we cant kill this yet but this is really high on my list of things to remvoe in train.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"916f8330162b3cc53e8d81c585c34e113372c1c3","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def sanitize_log_path(path):"},{"line_number":94,"context_line":"    \"\"\"Sanitize the string so that its log path is shell friendly\"\"\""},{"line_number":95,"context_line":"    replace_map \u003d {\u0027 \u0027: \u0027-\u0027, \u0027(\u0027: \u0027_\u0027, \u0027)\u0027: \u0027_\u0027}"},{"line_number":96,"context_line":"    for s, r in replace_map.items():"},{"line_number":97,"context_line":"        path \u003d path.replace(s, r)"},{"line_number":98,"context_line":"    return path"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Test worker cannot survive eventlet\u0027s Timeout exception, which effectively"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_53b39898","line":98,"range":{"start_line":95,"start_character":4,"end_line":98,"end_character":15},"updated":"2019-03-28 11:38:31.000000000","message":"why change this its more complicated and will perform worse.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bc0fb783f788b01d9e5e1a73c52444348a4c29d6","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def sanitize_log_path(path):"},{"line_number":94,"context_line":"    \"\"\"Sanitize the string so that its log path is shell friendly\"\"\""},{"line_number":95,"context_line":"    replace_map \u003d {\u0027 \u0027: \u0027-\u0027, \u0027(\u0027: \u0027_\u0027, \u0027)\u0027: \u0027_\u0027}"},{"line_number":96,"context_line":"    for s, r in replace_map.items():"},{"line_number":97,"context_line":"        path \u003d path.replace(s, r)"},{"line_number":98,"context_line":"    return path"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Test worker cannot survive eventlet\u0027s Timeout exception, which effectively"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_9cbc9107","line":98,"range":{"start_line":95,"start_character":4,"end_line":98,"end_character":15},"in_reply_to":"5fc1f717_53b39898","updated":"2019-03-31 18:49:59.000000000","message":"That was the implementation in the other base file. No reason at all.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"073d69e4ab9bf939db21f2fd8ff39192797c3bbb","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def sanitize_log_path(path):"},{"line_number":94,"context_line":"    \"\"\"Sanitize the string so that its log path is shell friendly\"\"\""},{"line_number":95,"context_line":"    replace_map \u003d {\u0027 \u0027: \u0027-\u0027, \u0027(\u0027: \u0027_\u0027, \u0027)\u0027: \u0027_\u0027}"},{"line_number":96,"context_line":"    for s, r in replace_map.items():"},{"line_number":97,"context_line":"        path \u003d path.replace(s, r)"},{"line_number":98,"context_line":"    return path"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Test worker cannot survive eventlet\u0027s Timeout exception, which effectively"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_a8f805c4","line":98,"range":{"start_line":95,"start_character":4,"end_line":98,"end_character":15},"in_reply_to":"5fc1f717_9cbc9107","updated":"2019-04-23 15:42:30.000000000","message":"This is the source of the replacement, fwiw:\n\nhttps://review.opendev.org/#/c/643101/1/vif_plug_ovs/tests/functional/base.py@a99\n\nI don\u0027t feel too strongly about either case, but I\u0027d prefer the one-liner.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"185c430d18f9de65d68d4f3a9652ae25d26c6cf5","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def sanitize_log_path(path):"},{"line_number":94,"context_line":"    \"\"\"Sanitize the string so that its log path is shell friendly\"\"\""},{"line_number":95,"context_line":"    replace_map \u003d {\u0027 \u0027: \u0027-\u0027, \u0027(\u0027: \u0027_\u0027, \u0027)\u0027: \u0027_\u0027}"},{"line_number":96,"context_line":"    for s, r in replace_map.items():"},{"line_number":97,"context_line":"        path \u003d path.replace(s, r)"},{"line_number":98,"context_line":"    return path"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"# Test worker cannot survive eventlet\u0027s Timeout exception, which effectively"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_e6213efd","line":98,"range":{"start_line":95,"start_character":4,"end_line":98,"end_character":15},"in_reply_to":"ffb9cba7_a8f805c4","updated":"2019-04-24 08:51:32.000000000","message":"Done in PS3","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"916f8330162b3cc53e8d81c585c34e113372c1c3","unresolved":false,"context_lines":[{"line_number":106,"context_line":"class BaseFunctionalTestCase(base.BaseTestCase):"},{"line_number":107,"context_line":"    \"\"\"Base class for functional tests.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    PRODUCT_NAME \u003d \u0027os_vif\u0027"},{"line_number":110,"context_line":"    PRIVILEGED_GROUP \u003d \u0027os_vif_privileged\u0027"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_b36d1c04","line":109,"range":{"start_line":109,"start_character":4,"end_line":109,"end_character":16},"updated":"2019-03-28 11:38:31.000000000","message":"PROJECT_NAME","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bc0fb783f788b01d9e5e1a73c52444348a4c29d6","unresolved":false,"context_lines":[{"line_number":106,"context_line":"class BaseFunctionalTestCase(base.BaseTestCase):"},{"line_number":107,"context_line":"    \"\"\"Base class for functional tests.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    PRODUCT_NAME \u003d \u0027os_vif\u0027"},{"line_number":110,"context_line":"    PRIVILEGED_GROUP \u003d \u0027os_vif_privileged\u0027"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_5c34e9ac","line":109,"range":{"start_line":109,"start_character":4,"end_line":109,"end_character":16},"in_reply_to":"5fc1f717_b36d1c04","updated":"2019-03-31 18:49:59.000000000","message":"Done","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"69ae639945a18879d3a7eb2a1c37896768fab01c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    LOG.debug(\"command line: %s\", \" \".join(sys.argv))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def sanitize_log_path(path):"},{"line_number":94,"context_line":"    \"\"\"Sanitize the string so that its log path is shell friendly\"\"\""},{"line_number":95,"context_line":"    return path.replace(\u0027 \u0027, \u0027-\u0027).replace(\u0027(\u0027, \u0027_\u0027).replace(\u0027)\u0027, \u0027_\u0027)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# Test worker cannot survive eventlet\u0027s Timeout exception, which effectively"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_61a53804","line":95,"range":{"start_line":93,"start_character":0,"end_line":95,"end_character":69},"updated":"2019-04-24 11:18:08.000000000","message":"Heh, didn\u0027t notice this got reverted back to base.","commit_id":"c63366d67c0e0ed5e59871b8d0d2b498e759513f"},{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"69ae639945a18879d3a7eb2a1c37896768fab01c","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            os.path.join(DEFAULT_LOG_DIR, \"%s.txt\" % self.id()))"},{"line_number":116,"context_line":"        self.flags(log_file\u003dlog_file)"},{"line_number":117,"context_line":"        privsep_helper \u003d os.path.join("},{"line_number":118,"context_line":"            os.getenv(\u0027VIRTUAL_ENV\u0027, os.path.dirname(sys.executable)[:-4]),"},{"line_number":119,"context_line":"            \u0027bin\u0027, \u0027privsep-helper\u0027)"},{"line_number":120,"context_line":"        self.flags("},{"line_number":121,"context_line":"            helper_command\u003d\u0027 \u0027.join([\u0027sudo\u0027, \u0027-E\u0027, privsep_helper]),"},{"line_number":122,"context_line":"            group\u003dself.PRIVILEGED_GROUP)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_676d4803","line":119,"range":{"start_line":118,"start_character":0,"end_line":119,"end_character":36},"updated":"2019-04-24 11:18:08.000000000","message":"Note to self: this was introduced in\n\nhttps://review.opendev.org/#/c/482226/56..57/vif_plug_ovs/tests/functional/base.py@120\n\nthis takes the dirname of the python executable, strips off \u0027/bin\u0027 (the magic -4) in order to attempt to construct the relative path to the privsep-helper binary.\n\nSee same review for reason \u0027config\u0027 was renamed to \u0027flags\u0027","commit_id":"c63366d67c0e0ed5e59871b8d0d2b498e759513f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8f283d77a2ae13e9b6f4404d4391ac3a51ffd49b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            os.path.join(DEFAULT_LOG_DIR, \"%s.txt\" % self.id()))"},{"line_number":116,"context_line":"        self.flags(log_file\u003dlog_file)"},{"line_number":117,"context_line":"        privsep_helper \u003d os.path.join("},{"line_number":118,"context_line":"            os.getenv(\u0027VIRTUAL_ENV\u0027, os.path.dirname(sys.executable)[:-4]),"},{"line_number":119,"context_line":"            \u0027bin\u0027, \u0027privsep-helper\u0027)"},{"line_number":120,"context_line":"        self.flags("},{"line_number":121,"context_line":"            helper_command\u003d\u0027 \u0027.join([\u0027sudo\u0027, \u0027-E\u0027, privsep_helper]),"},{"line_number":122,"context_line":"            group\u003dself.PRIVILEGED_GROUP)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_b48cc27f","line":119,"range":{"start_line":118,"start_character":0,"end_line":119,"end_character":36},"in_reply_to":"ffb9cba7_676d4803","updated":"2019-04-24 19:19:03.000000000","message":"right i have a comment for this in \nhttps://review.opendev.org/#/c/638058/4/os_vif/tests/functional/base.py\nbut that has not merged yet.\n\nill rebase it on top of this.","commit_id":"c63366d67c0e0ed5e59871b8d0d2b498e759513f"}],"vif_plug_ovs/tests/functional/base.py":[{"author":{"_account_id":25733,"name":"Jan Gutter","email":"github@jangutter.com","username":"jangutter"},"change_message_id":"073d69e4ab9bf939db21f2fd8ff39192797c3bbb","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    LOG.debug(\"command line: %s\", \" \".join(sys.argv))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def sanitize_log_path(path):"},{"line_number":95,"context_line":"    # Sanitize the string so that its log path is shell friendly"},{"line_number":96,"context_line":"    replace_map \u003d {\u0027 \u0027: \u0027-\u0027, \u0027(\u0027: \u0027_\u0027, \u0027)\u0027: \u0027_\u0027}"},{"line_number":97,"context_line":"    for s, r in replace_map.items():"},{"line_number":98,"context_line":"        path \u003d path.replace(s, r)"},{"line_number":99,"context_line":"    return path"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@six.add_metaclass(_CatchTimeoutMetaclass)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_480b898d","side":"PARENT","line":99,"range":{"start_line":94,"start_character":0,"end_line":99,"end_character":15},"updated":"2019-04-23 15:42:30.000000000","message":"Source of the sanitize_log_path function.","commit_id":"4d95199728f152a29b2cf2081183398dd419bb31"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8de1cc93e28983ff983e2f47a8eeb8b1733214b4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from os_vif.tests.functional import base as os_vif_base"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"wait_until_true \u003d os_vif_base.wait_until_true"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class VifPlugOvsBaseFunctionalTestCase(os_vif_base.BaseFunctionalTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_02f13c95","line":16,"updated":"2019-03-28 08:34:21.000000000","message":"nit: You could add TODO note to indicate that this can be removed when test_ovsdblib will be updated.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"96e05ebce143da9f7e782a138fdec48a484f82a0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from os_vif.tests.functional import base as os_vif_base"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"wait_until_true \u003d os_vif_base.wait_until_true"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class VifPlugOvsBaseFunctionalTestCase(os_vif_base.BaseFunctionalTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_3315ac3d","line":16,"in_reply_to":"5fc1f717_02f13c95","updated":"2019-03-28 10:51:25.000000000","message":"Are you sure? That means, in test_ovsdb_lib, we will need to import both vif_plug_ovs.functional.base and os_vif.tests.functional.base.\n\nIMO, I prefer to import only one base module and keep this reference here.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"bdc3f084b5613fe4b4d9463e4f06e1343b1b3cb2","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from os_vif.tests.functional import base as os_vif_base"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"wait_until_true \u003d os_vif_base.wait_until_true"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class VifPlugOvsBaseFunctionalTestCase(os_vif_base.BaseFunctionalTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d3a228ae","line":16,"in_reply_to":"5fc1f717_3315ac3d","updated":"2019-03-28 11:11:59.000000000","message":"I think that would be cleaner yes, you can just import the function. That will be the same that the line you are using here.\n\nBut really it\u0027s not big deal. I thought that was something you\u0027ve planned so that is why I mentioned it.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"916f8330162b3cc53e8d81c585c34e113372c1c3","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class VifPlugOvsBaseFunctionalTestCase(os_vif_base.BaseFunctionalTestCase):"},{"line_number":20,"context_line":"    \"\"\"Base class for vif_plug_ovs functional tests.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    PRODUCT_NAME \u003d \u0027vif_plug_ovs\u0027"},{"line_number":23,"context_line":"    PRIVILEGED_GROUP \u003d \u0027vif_plug_ovs_privileged\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_33528c36","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":16},"updated":"2019-03-28 11:38:31.000000000","message":"again product feel wrong here\n\nit shoudl be either PLUGIN_NAME in this case or we can use\ngeneric COMPONENT_NAME which will work for this useage and the generic functional useage.","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bc0fb783f788b01d9e5e1a73c52444348a4c29d6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class VifPlugOvsBaseFunctionalTestCase(os_vif_base.BaseFunctionalTestCase):"},{"line_number":20,"context_line":"    \"\"\"Base class for vif_plug_ovs functional tests.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    PRODUCT_NAME \u003d \u0027vif_plug_ovs\u0027"},{"line_number":23,"context_line":"    PRIVILEGED_GROUP \u003d \u0027vif_plug_ovs_privileged\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_5ce6294d","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":16},"in_reply_to":"5fc1f717_33528c36","updated":"2019-03-31 18:49:59.000000000","message":"I\u0027ll use COMPONENT_NAME","commit_id":"526bce5d4647de7f718b0f7e1d891fa521d475ab"}]}
