)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":55,"context_line":"environment variable."},{"line_number":56,"context_line":"If variable is missing then script will try to open"},{"line_number":57,"context_line":"rally-scenarios/manifest.yaml or rally-jobs/manifest.yaml."},{"line_number":58,"context_line":"If file still does not exist then legacy behaivior will be used."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Change-Id: Ie805a332f98431702b16c3b6a47f76a562e09f7a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"fa32b979_ea0c5044","line":58,"range":{"start_line":58,"start_character":41,"end_line":58,"end_character":50},"updated":"2015-06-15 14:29:04.000000000","message":"s/behaivior/behavior/","commit_id":"11f710b58da962176c34687c55486311b492f7cd"}],"tests/ci/rally-gate.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":1,"context_line":"rally_gate.py"}],"source_content_type":"x-git/symlink","patch_set":6,"id":"5ad0253b_62b6088c","line":1,"updated":"2015-04-29 12:05:45.000000000","message":"Why file `rally-gate.py\u0027 is needed at all? We have `rally_gate.py\u0027 instead","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"8b290aee51f712fd7dd792a7ac972877b9e4210f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"rally_gate.py"}],"source_content_type":"x-git/symlink","patch_set":6,"id":"5ad0253b_e55b3d53","line":1,"in_reply_to":"5ad0253b_62b6088c","updated":"2015-04-29 18:24:55.000000000","message":"It will be deleted later. Now it is used by old script in infra.","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"}],"tests/ci/rally-gate.sh":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# This script is executed by post_test_hook function in desvstack gate."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"}],"source_content_type":"text/x-sh","patch_set":16,"id":"fa32b979_2ba9bedf","line":15,"updated":"2015-06-16 00:36:17.000000000","message":"Put\n set -e\n\nHere","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# This script is executed by post_test_hook function in desvstack gate."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"}],"source_content_type":"text/x-sh","patch_set":16,"id":"fa32b979_f0096cde","line":15,"in_reply_to":"fa32b979_2ba9bedf","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# This script is executed by post_test_hook function in desvstack gate."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"},{"line_number":19,"context_line":"    if [ -f $GATE ]; then"},{"line_number":20,"context_line":"        exec $GATE"}],"source_content_type":"text/x-sh","patch_set":16,"id":"1af86dd1_83b49ed1","line":17,"updated":"2015-06-16 00:36:17.000000000","message":"\"Your line is bad and you should feel bad.\"\n\nPlease, don\u0027t write lines \u003e 80 cols.\n\nYou can simple use a shell expansion here:\n\n echo {a,b{d,c}}","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# This script is executed by post_test_hook function in desvstack gate."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"},{"line_number":19,"context_line":"    if [ -f $GATE ]; then"},{"line_number":20,"context_line":"        exec $GATE"}],"source_content_type":"text/x-sh","patch_set":16,"id":"fa32b979_4bc6699b","line":17,"in_reply_to":"1af86dd1_83b49ed1","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"},{"line_number":19,"context_line":"    if [ -f $GATE ]; then"},{"line_number":20,"context_line":"        exec $GATE"},{"line_number":21,"context_line":"    fi"},{"line_number":22,"context_line":"done"}],"source_content_type":"text/x-sh","patch_set":16,"id":"1af86dd1_83eb7eb0","line":19,"updated":"2015-06-16 00:36:17.000000000","message":"Please, check that the file is *executable* instead.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"for GATE in $BASE/new/rally/tests/ci/rally_gate.py $BASE/new/rally/tests/ci/rally-gate.py tests/ci/rally_gate.py tests/ci/rally-gate.py; do"},{"line_number":18,"context_line":"    echo $GATE"},{"line_number":19,"context_line":"    if [ -f $GATE ]; then"},{"line_number":20,"context_line":"        exec $GATE"},{"line_number":21,"context_line":"    fi"},{"line_number":22,"context_line":"done"}],"source_content_type":"text/x-sh","patch_set":16,"id":"fa32b979_6bc1ed7f","line":19,"in_reply_to":"1af86dd1_83eb7eb0","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"}],"tests/ci/rally-gate/index.mako":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":54,"context_line":"      % endfor"},{"line_number":55,"context_line":"    \u003c/li\u003e"},{"line_number":56,"context_line":"    % endfor"},{"line_number":57,"context_line":"    \u003c/ul\u003e"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    \u003c/ul\u003e"},{"line_number":60,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":6,"id":"5ad0253b_8d871561","line":57,"updated":"2015-04-29 12:05:45.000000000","message":"This tag is stray - delete it.","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"8b290aee51f712fd7dd792a7ac972877b9e4210f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"      % endfor"},{"line_number":55,"context_line":"    \u003c/li\u003e"},{"line_number":56,"context_line":"    % endfor"},{"line_number":57,"context_line":"    \u003c/ul\u003e"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    \u003c/ul\u003e"},{"line_number":60,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":6,"id":"5ad0253b_983190ef","line":57,"in_reply_to":"5ad0253b_8d871561","updated":"2015-04-29 18:24:55.000000000","message":"Done","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"}],"tests/ci/rally_gate.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    try:"},{"line_number":64,"context_line":"        os.makedirs(os.path.join(*args))"},{"line_number":65,"context_line":"    except OSError as e:"},{"line_number":66,"context_line":"        if e.errno !\u003d errno.EEXIST:"},{"line_number":67,"context_line":"            raise"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_a8babfdf","line":66,"updated":"2015-04-29 12:05:45.000000000","message":"... or not os.path.isdir(path)","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"8b290aee51f712fd7dd792a7ac972877b9e4210f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    try:"},{"line_number":64,"context_line":"        os.makedirs(os.path.join(*args))"},{"line_number":65,"context_line":"    except OSError as e:"},{"line_number":66,"context_line":"        if e.errno !\u003d errno.EEXIST:"},{"line_number":67,"context_line":"            raise"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_988d107e","line":66,"in_reply_to":"5ad0253b_a8babfdf","updated":"2015-04-29 18:24:55.000000000","message":"Please explain","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            raise"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class KeystoneEnv:"},{"line_number":71,"context_line":"    \"\"\"Represent keystone environment.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def __init__(self, scenario, version):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_28cb4f55","line":70,"updated":"2015-04-29 12:05:45.000000000","message":"Use new-style classes only, here and below.\nhttps://wiki.python.org/moin/NewClassVsClassicClass\n\n class KeystoneEnv(object):\n     ...","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.name \u003d \"keystone-%s\" % version"},{"line_number":81,"context_line":"        VERSIONS \u003d {\"v2\": self.v2, \"v3\": self.v3}"},{"line_number":82,"context_line":"        try:"},{"line_number":83,"context_line":"            self.run \u003d VERSIONS[version]"},{"line_number":84,"context_line":"        except IndexError:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_e8779700","line":81,"updated":"2015-04-29 12:05:45.000000000","message":"Simplified approach (without extra VERSIONS mapping):\n\n class KeystoneEnv(object):\n\n     def __init__(self, scenario, version):\n         self.name \u003d \"keystone_%s\" % version\n         try:\n             self.run \u003d getattr(self, \"run_%s\" % version)\n         except AttributeError:\n             raise Exception(...)\n         self.scenario \u003d scenario\n\n     def run_v2(self):\n         ...\n\n\n     def run_v3(self):\n         ...","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"8b290aee51f712fd7dd792a7ac972877b9e4210f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.name \u003d \"keystone-%s\" % version"},{"line_number":81,"context_line":"        VERSIONS \u003d {\"v2\": self.v2, \"v3\": self.v3}"},{"line_number":82,"context_line":"        try:"},{"line_number":83,"context_line":"            self.run \u003d VERSIONS[version]"},{"line_number":84,"context_line":"        except IndexError:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_58d89853","line":81,"in_reply_to":"5ad0253b_e8779700","updated":"2015-04-29 18:24:55.000000000","message":"Done","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ba83ff012e79e6a67fd98c4c93209a1bae891680","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        VERSIONS \u003d {\"v2\": self.v2, \"v3\": self.v3}"},{"line_number":82,"context_line":"        try:"},{"line_number":83,"context_line":"            self.run \u003d VERSIONS[version]"},{"line_number":84,"context_line":"        except IndexError:"},{"line_number":85,"context_line":"            raise Exception(\"Unsupported keystone version %s\" % version)"},{"line_number":86,"context_line":"        self.scenario \u003d scenario"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_88a6e3bf","line":84,"updated":"2015-04-29 12:05:45.000000000","message":"KeyError","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"8b290aee51f712fd7dd792a7ac972877b9e4210f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        VERSIONS \u003d {\"v2\": self.v2, \"v3\": self.v3}"},{"line_number":82,"context_line":"        try:"},{"line_number":83,"context_line":"            self.run \u003d VERSIONS[version]"},{"line_number":84,"context_line":"        except IndexError:"},{"line_number":85,"context_line":"            raise Exception(\"Unsupported keystone version %s\" % version)"},{"line_number":86,"context_line":"        self.scenario \u003d scenario"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5ad0253b_38dddc42","line":84,"in_reply_to":"5ad0253b_88a6e3bf","updated":"2015-04-29 18:24:55.000000000","message":"Done","commit_id":"3fc091c024cf1c3b5c71ca8333da4befee359ced"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def use_v3(self):"},{"line_number":101,"context_line":"        \"\"\"Alter deployment to use keystone v3.\"\"\""},{"line_number":102,"context_line":"        config \u003d copy.deepcopy(self.scenario.task.gate.active_deployment)"},{"line_number":103,"context_line":"        url \u003d parse.urlsplit(config[\"auth_url\"])._replace(path\u003d\"v3\").geturl()"},{"line_number":104,"context_line":"        config[\"auth_url\"] \u003d url"},{"line_number":105,"context_line":"        endpoint \u003d config.get(\"endpoint\")"},{"line_number":106,"context_line":"        if endpoint:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_0a82e2c8","line":103,"updated":"2015-05-26 15:05:46.000000000","message":"Is it safe to rely on a private method (_replace) of the SplitResult object here?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def use_v3(self):"},{"line_number":101,"context_line":"        \"\"\"Alter deployment to use keystone v3.\"\"\""},{"line_number":102,"context_line":"        config \u003d copy.deepcopy(self.scenario.task.gate.active_deployment)"},{"line_number":103,"context_line":"        url \u003d parse.urlsplit(config[\"auth_url\"])._replace(path\u003d\"v3\").geturl()"},{"line_number":104,"context_line":"        config[\"auth_url\"] \u003d url"},{"line_number":105,"context_line":"        endpoint \u003d config.get(\"endpoint\")"},{"line_number":106,"context_line":"        if endpoint:"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_1731a805","line":103,"in_reply_to":"7a016987_0a82e2c8","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            config[\"endpoint\"] \u003d v3_enpoint"},{"line_number":109,"context_line":"        config[\"admin\"][\"project_name\"] \u003d config[\"admin\"][\"tenant_name\"]"},{"line_number":110,"context_line":"        config[\"admin\"][\"project_domain_name\"] \u003d \"default\""},{"line_number":111,"context_line":"        del(config[\"admin\"][\"tenant_name\"])"},{"line_number":112,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":113,"context_line":"        json.dump(config, cfg_file)"},{"line_number":114,"context_line":"        LOG.debug(\"New keystone v3 config: %s\" % json.dumps(config, indent\u003d2))"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_aa918e54","line":111,"updated":"2015-05-26 15:05:46.000000000","message":"Nit: unnecessary parentheses.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            config[\"endpoint\"] \u003d v3_enpoint"},{"line_number":109,"context_line":"        config[\"admin\"][\"project_name\"] \u003d config[\"admin\"][\"tenant_name\"]"},{"line_number":110,"context_line":"        config[\"admin\"][\"project_domain_name\"] \u003d \"default\""},{"line_number":111,"context_line":"        del(config[\"admin\"][\"tenant_name\"])"},{"line_number":112,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":113,"context_line":"        json.dump(config, cfg_file)"},{"line_number":114,"context_line":"        LOG.debug(\"New keystone v3 config: %s\" % json.dumps(config, indent\u003d2))"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_b71c1478","line":111,"in_reply_to":"7a016987_aa918e54","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":113,"context_line":"        json.dump(config, cfg_file)"},{"line_number":114,"context_line":"        LOG.debug(\"New keystone v3 config: %s\" % json.dumps(config, indent\u003d2))"},{"line_number":115,"context_line":"        cfg_file.flush()"},{"line_number":116,"context_line":"        name \u003d \"\".join(random.sample(string.ascii_letters, 12))"},{"line_number":117,"context_line":"        subprocess.check_call([\"rally\", \"deployment\", \"create\","},{"line_number":118,"context_line":"                               \"--name\", \"V3_\" + name, \"--file\","}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_65198779","line":115,"updated":"2015-05-26 15:05:46.000000000","message":"This process -- creating a temp file, dumping the config to it, logging the config, and flushing the file -- is repeated here and in use_v2(). It\u0027d be nice if that was a standalone function that returned the temp file name.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":113,"context_line":"        json.dump(config, cfg_file)"},{"line_number":114,"context_line":"        LOG.debug(\"New keystone v3 config: %s\" % json.dumps(config, indent\u003d2))"},{"line_number":115,"context_line":"        cfg_file.flush()"},{"line_number":116,"context_line":"        name \u003d \"\".join(random.sample(string.ascii_letters, 12))"},{"line_number":117,"context_line":"        subprocess.check_call([\"rally\", \"deployment\", \"create\","},{"line_number":118,"context_line":"                               \"--name\", \"V3_\" + name, \"--file\","}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_ba3bd99b","line":115,"in_reply_to":"7a016987_65198779","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def cleanup(self):"},{"line_number":123,"context_line":"        LOG.debug(\"Destroying temporary deployment.\")"},{"line_number":124,"context_line":"        subprocess.call([\"rally\", \"deployment\", \"destroy\"])"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class PythonEnv(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_a5365fe5","line":124,"updated":"2015-05-26 15:05:46.000000000","message":"Should we delete the temporary config file?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def cleanup(self):"},{"line_number":123,"context_line":"        LOG.debug(\"Destroying temporary deployment.\")"},{"line_number":124,"context_line":"        subprocess.call([\"rally\", \"deployment\", \"destroy\"])"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class PythonEnv(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_3a924958","line":124,"in_reply_to":"7a016987_a5365fe5","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class RallyEnv(object):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class Scenario(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_05565306","line":132,"updated":"2015-05-26 15:05:46.000000000","message":"Docstrings or comments explaining why these objects exist would be nice.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class RallyEnv(object):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class Scenario(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_5a7e251a","line":132,"in_reply_to":"7a016987_05565306","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        LOG.debug(\"Created scenario with config: %r\" % config)"},{"line_number":152,"context_line":"        self.task \u003d task"},{"line_number":153,"context_line":"        self.config \u003d config"},{"line_number":154,"context_line":"        self.envs \u003d [self.ENVS[name](self, args)"},{"line_number":155,"context_line":"                     for name, args in envs.items()]"},{"line_number":156,"context_line":"        self.dirname \u003d \"\".join(random.sample(string.ascii_letters, 8))"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_057bf37c","line":154,"updated":"2015-05-26 15:05:46.000000000","message":"Getting an instance variable in lower case and a class variable in uppercase seems confusing. I feel like abusing case sensitivity like this is a bit of an antipattern, and renaming one of the variables (probably the class variable, e.g., to \"environment_classes\" or something) would be better.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        LOG.debug(\"Created scenario with config: %r\" % config)"},{"line_number":152,"context_line":"        self.task \u003d task"},{"line_number":153,"context_line":"        self.config \u003d config"},{"line_number":154,"context_line":"        self.envs \u003d [self.ENVS[name](self, args)"},{"line_number":155,"context_line":"                     for name, args in envs.items()]"},{"line_number":156,"context_line":"        self.dirname \u003d \"\".join(random.sample(string.ascii_letters, 8))"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_babab9be","line":154,"in_reply_to":"7a016987_057bf37c","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        - apply all environments from manifest"},{"line_number":164,"context_line":"        \"\"\""},{"line_number":165,"context_line":"        self.new_home_dir \u003d tempfile.mkdtemp(prefix\u003d\"rally_gate_\")"},{"line_number":166,"context_line":"        self.old_home_dir \u003d os.path.join(pwd.getpwuid(os.getuid()).pw_dir)"},{"line_number":167,"context_line":"        shutil.copytree(os.path.join(self.old_home_dir, \".rally\"),"},{"line_number":168,"context_line":"                        os.path.join(self.new_home_dir, \".rally\"))"},{"line_number":169,"context_line":"        LOG.info(\"Setting $HOME to %s\" % self.new_home_dir)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_c5dcbb76","line":166,"updated":"2015-05-26 15:05:46.000000000","message":"Nit: These instance variables are defined outside __init__.\n\nNot a nit: os.path.join() seems unnecessary here, since it\u0027s joining a single path.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        - apply all environments from manifest"},{"line_number":164,"context_line":"        \"\"\""},{"line_number":165,"context_line":"        self.new_home_dir \u003d tempfile.mkdtemp(prefix\u003d\"rally_gate_\")"},{"line_number":166,"context_line":"        self.old_home_dir \u003d os.path.join(pwd.getpwuid(os.getuid()).pw_dir)"},{"line_number":167,"context_line":"        shutil.copytree(os.path.join(self.old_home_dir, \".rally\"),"},{"line_number":168,"context_line":"                        os.path.join(self.new_home_dir, \".rally\"))"},{"line_number":169,"context_line":"        LOG.info(\"Setting $HOME to %s\" % self.new_home_dir)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_fa7dd1b1","line":166,"in_reply_to":"7a016987_c5dcbb76","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        pub_root \u003d os.environ.get(\"RCI_PUB_DIR\", \"rally-plot\")"},{"line_number":196,"context_line":"        makedirs(pub_root, \"extra\")"},{"line_number":197,"context_line":"        self.pub_dir \u003d os.path.join(pub_root, self.dirname)"},{"line_number":198,"context_line":"        makedirs(self.pub_dir)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._apply_envs()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_455d6beb","line":197,"updated":"2015-05-26 15:05:46.000000000","message":"Why doesn\u0027t this use a proper tempdir?\n\nAlso, self.pub_dir is defined outside __init__.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        pub_root \u003d os.environ.get(\"RCI_PUB_DIR\", \"rally-plot\")"},{"line_number":196,"context_line":"        makedirs(pub_root, \"extra\")"},{"line_number":197,"context_line":"        self.pub_dir \u003d os.path.join(pub_root, self.dirname)"},{"line_number":198,"context_line":"        makedirs(self.pub_dir)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._apply_envs()"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_fa4a71ab","line":197,"in_reply_to":"7a016987_455d6beb","updated":"2015-06-03 15:40:42.000000000","message":"Report files should be in one single directory","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":251,"context_line":"            e \u003d {}"},{"line_number":252,"context_line":"            for key, val in line:"},{"line_number":253,"context_line":"                e[key] \u003d val"},{"line_number":254,"context_line":"            yield(e)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    def run(self):"},{"line_number":257,"context_line":"        common_env \u003d self.config.get(\"env\", {})"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_e501f76b","line":254,"updated":"2015-05-26 15:05:46.000000000","message":"Python golf:\n\n    yield dict([(k, v) for k, v in line])","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":251,"context_line":"            e \u003d {}"},{"line_number":252,"context_line":"            for key, val in line:"},{"line_number":253,"context_line":"                e[key] \u003d val"},{"line_number":254,"context_line":"            yield(e)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    def run(self):"},{"line_number":257,"context_line":"        common_env \u003d self.config.get(\"env\", {})"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_7a3fa1d6","line":254,"in_reply_to":"7a016987_e501f76b","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                scenario \u003d Scenario(self, task_config, envs)"},{"line_number":262,"context_line":"                scenario.run()"},{"line_number":263,"context_line":"                self.scenarios.append(scenario)"},{"line_number":264,"context_line":"                LOG.debug(\"All scenarios for task(%r): %r\" % (self,"},{"line_number":265,"context_line":"                                                              self.scenarios))"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_252f0ff8","line":264,"updated":"2015-05-26 15:05:46.000000000","message":"If we\u0027re going to be printing this object out for debugging, is it worthwhile to implement __repr__ so we get something useful?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                scenario \u003d Scenario(self, task_config, envs)"},{"line_number":262,"context_line":"                scenario.run()"},{"line_number":263,"context_line":"                self.scenarios.append(scenario)"},{"line_number":264,"context_line":"                LOG.debug(\"All scenarios for task(%r): %r\" % (self,"},{"line_number":265,"context_line":"                                                              self.scenarios))"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_e59c12c2","line":264,"in_reply_to":"7a016987_252f0ff8","updated":"2015-06-03 15:40:42.000000000","message":"Done","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    \"\"\"Represent a gate job.\"\"\""},{"line_number":270,"context_line":"    tasks \u003d []"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def setup(self):"},{"line_number":273,"context_line":"        \"\"\"Fill in all initial properties."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        project_name - name of currently tested project"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_050bf37e","line":272,"updated":"2015-05-26 15:05:46.000000000","message":"Why isn\u0027t this __init__?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    \"\"\"Represent a gate job.\"\"\""},{"line_number":270,"context_line":"    tasks \u003d []"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def setup(self):"},{"line_number":273,"context_line":"        \"\"\"Fill in all initial properties."},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        project_name - name of currently tested project"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_0574cefa","line":272,"in_reply_to":"7a016987_050bf37e","updated":"2015-06-03 15:40:42.000000000","message":"To simplify unittests","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                               \" %(message)s (%(filename)s:%(lineno)d)\","},{"line_number":357,"context_line":"                        level\u003dlogging.DEBUG)"},{"line_number":358,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":359,"context_line":"    LOG.setLevel(logging.DEBUG)"},{"line_number":360,"context_line":"    gate \u003d Gate()"},{"line_number":361,"context_line":"    gate.setup()"},{"line_number":362,"context_line":"    sys.exit(gate.run())"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_00088127","line":359,"updated":"2015-05-26 15:05:46.000000000","message":"It\u0027d be nicer if LOG was a module-level variable so this rally_gate.py could be used as a module. (It\u0027d also simplify some of the mocking in the unit tests.)","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"de27c1ddc0f04d2600de744bf5b7229647e8aaaf","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                               \" %(message)s (%(filename)s:%(lineno)d)\","},{"line_number":357,"context_line":"                        level\u003dlogging.DEBUG)"},{"line_number":358,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":359,"context_line":"    LOG.setLevel(logging.DEBUG)"},{"line_number":360,"context_line":"    gate \u003d Gate()"},{"line_number":361,"context_line":"    gate.setup()"},{"line_number":362,"context_line":"    sys.exit(gate.run())"}],"source_content_type":"text/x-python","patch_set":13,"id":"5afe65bd_256eaa95","line":359,"in_reply_to":"7a016987_00088127","updated":"2015-06-03 15:40:42.000000000","message":"Then I got hacking errors \"use oslo.log instead of standard logging\"","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Return exit status otherwise."},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":"    LOG.debug(\"Starting %s\" % \" \".join(cmd))"},{"line_number":46,"context_line":"    outfile \u003d open(stdout, \"w\") if stdout else subprocess.PIPE"},{"line_number":47,"context_line":"    pipe \u003d subprocess.Popen(cmd, stdout\u003doutfile, stderr\u003dsubprocess.STDOUT)"},{"line_number":48,"context_line":"    out, err \u003d pipe.communicate()"},{"line_number":49,"context_line":"    if stdout and gzip:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af86dd1_c3085694","line":46,"updated":"2015-06-16 00:36:17.000000000","message":"stdout is a common name for the *file handle* of the standard output file.\n\nPlease name it `outfilepath\u0027 or alike here instead.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Return exit status otherwise."},{"line_number":44,"context_line":"    \"\"\""},{"line_number":45,"context_line":"    LOG.debug(\"Starting %s\" % \" \".join(cmd))"},{"line_number":46,"context_line":"    outfile \u003d open(stdout, \"w\") if stdout else subprocess.PIPE"},{"line_number":47,"context_line":"    pipe \u003d subprocess.Popen(cmd, stdout\u003doutfile, stderr\u003dsubprocess.STDOUT)"},{"line_number":48,"context_line":"    out, err \u003d pipe.communicate()"},{"line_number":49,"context_line":"    if stdout and gzip:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_2b73e54e","line":46,"in_reply_to":"1af86dd1_c3085694","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    outfile \u003d open(stdout, \"w\") if stdout else subprocess.PIPE"},{"line_number":47,"context_line":"    pipe \u003d subprocess.Popen(cmd, stdout\u003doutfile, stderr\u003dsubprocess.STDOUT)"},{"line_number":48,"context_line":"    out, err \u003d pipe.communicate()"},{"line_number":49,"context_line":"    if stdout and gzip:"},{"line_number":50,"context_line":"        outfile.close()"},{"line_number":51,"context_line":"        subprocess.call([\"gzip\", \"-9\", stdout])"},{"line_number":52,"context_line":"    if check and pipe.returncode:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af86dd1_43f58681","line":49,"updated":"2015-06-16 00:36:17.000000000","message":"This will fix `stdout\u0027 misusage here as well.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    outfile \u003d open(stdout, \"w\") if stdout else subprocess.PIPE"},{"line_number":47,"context_line":"    pipe \u003d subprocess.Popen(cmd, stdout\u003doutfile, stderr\u003dsubprocess.STDOUT)"},{"line_number":48,"context_line":"    out, err \u003d pipe.communicate()"},{"line_number":49,"context_line":"    if stdout and gzip:"},{"line_number":50,"context_line":"        outfile.close()"},{"line_number":51,"context_line":"        subprocess.call([\"gzip\", \"-9\", stdout])"},{"line_number":52,"context_line":"    if check and pipe.returncode:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_8b9a3162","line":49,"in_reply_to":"1af86dd1_43f58681","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    if stdout and gzip:"},{"line_number":50,"context_line":"        outfile.close()"},{"line_number":51,"context_line":"        subprocess.call([\"gzip\", \"-9\", stdout])"},{"line_number":52,"context_line":"    if check and pipe.returncode:"},{"line_number":53,"context_line":"        LOG.error(\"Command %r is failed. Output: %s\" % (cmd, out))"},{"line_number":54,"context_line":"        raise subprocess.CalledProcessError(pipe.returncode, cmd)"},{"line_number":55,"context_line":"    return pipe.returncode"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af86dd1_e32a32e7","line":52,"updated":"2015-06-16 00:36:17.000000000","message":"Please rename `check\u0027 to `raise_on_error\u0027 or something alike.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    if stdout and gzip:"},{"line_number":50,"context_line":"        outfile.close()"},{"line_number":51,"context_line":"        subprocess.call([\"gzip\", \"-9\", stdout])"},{"line_number":52,"context_line":"    if check and pipe.returncode:"},{"line_number":53,"context_line":"        LOG.error(\"Command %r is failed. Output: %s\" % (cmd, out))"},{"line_number":54,"context_line":"        raise subprocess.CalledProcessError(pipe.returncode, cmd)"},{"line_number":55,"context_line":"    return pipe.returncode"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_8be8f1b5","line":52,"in_reply_to":"1af86dd1_e32a32e7","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            raise"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def replace_path(url, new_path):"},{"line_number":71,"context_line":"    \"\"\"Replace path in url.\"\"\""},{"line_number":72,"context_line":"    split_res \u003d list(parse.urlsplit(url))"},{"line_number":73,"context_line":"    split_res[2] \u003d new_path"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_d0b1e190","line":70,"updated":"2015-06-16 00:36:17.000000000","message":"Please call this `url_replace_path\u0027","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            raise"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def replace_path(url, new_path):"},{"line_number":71,"context_line":"    \"\"\"Replace path in url.\"\"\""},{"line_number":72,"context_line":"    split_res \u003d list(parse.urlsplit(url))"},{"line_number":73,"context_line":"    split_res[2] \u003d new_path"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_2bd8c51c","line":70,"in_reply_to":"fa32b979_d0b1e190","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                del config[\"admin\"][\"tenant_name\"]"},{"line_number":112,"context_line":"            except KeyError:"},{"line_number":113,"context_line":"                pass"},{"line_number":114,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":115,"context_line":"        json.dump(config, cfg_file)"},{"line_number":116,"context_line":"        LOG.debug(\"New keystone config: %s\" % json.dumps(config, indent\u003d2))"},{"line_number":117,"context_line":"        cfg_file.flush()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af86dd1_e378f2fa","line":114,"updated":"2015-06-16 00:36:17.000000000","message":"NamedTemporaryFile can be used as a context manager.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                del config[\"admin\"][\"tenant_name\"]"},{"line_number":112,"context_line":"            except KeyError:"},{"line_number":113,"context_line":"                pass"},{"line_number":114,"context_line":"        cfg_file \u003d tempfile.NamedTemporaryFile()"},{"line_number":115,"context_line":"        json.dump(config, cfg_file)"},{"line_number":116,"context_line":"        LOG.debug(\"New keystone config: %s\" % json.dumps(config, indent\u003d2))"},{"line_number":117,"context_line":"        cfg_file.flush()"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_4b4189a8","line":114,"in_reply_to":"1af86dd1_e378f2fa","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":130,"context_line":"class Scenario(object):"},{"line_number":131,"context_line":"    \"\"\"Represent single scenario run.\"\"\""},{"line_number":132,"context_line":"    status \u003d 254"},{"line_number":133,"context_line":"    active_envs \u003d []"},{"line_number":134,"context_line":"    env_classes \u003d {"},{"line_number":135,"context_line":"        \"keystone\": KeystoneEnv,"},{"line_number":136,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_554cfc41","line":133,"updated":"2015-06-15 14:29:04.000000000","message":"This is non-constant property that is used in instance context only, so I recommend to move this under __init__, just for clarity","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":130,"context_line":"class Scenario(object):"},{"line_number":131,"context_line":"    \"\"\"Represent single scenario run.\"\"\""},{"line_number":132,"context_line":"    status \u003d 254"},{"line_number":133,"context_line":"    active_envs \u003d []"},{"line_number":134,"context_line":"    env_classes \u003d {"},{"line_number":135,"context_line":"        \"keystone\": KeystoneEnv,"},{"line_number":136,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_eb165da6","line":133,"in_reply_to":"fa32b979_554cfc41","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __init__(self, task, config, envs):"},{"line_number":139,"context_line":"        \"\"\"Initialize scenario instance"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        :param config: task configuration dict"},{"line_number":142,"context_line":"        :param envs: dict {env1: env1_config, env2: env2_config}"},{"line_number":143,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_cfbabbe1","line":140,"updated":"2015-06-15 14:29:04.000000000","message":":param task: ...","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __init__(self, task, config, envs):"},{"line_number":139,"context_line":"        \"\"\"Initialize scenario instance"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        :param config: task configuration dict"},{"line_number":142,"context_line":"        :param envs: dict {env1: env1_config, env2: env2_config}"},{"line_number":143,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_8b8471d4","line":140,"in_reply_to":"fa32b979_cfbabbe1","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        makedirs(pub_root, \"extra\")"},{"line_number":152,"context_line":"        self.pub_dir \u003d os.path.join(pub_root, self.dirname)"},{"line_number":153,"context_line":"        self.new_home_dir \u003d tempfile.mkdtemp(prefix\u003d\"rally_gate_\")"},{"line_number":154,"context_line":"        self.old_home_dir \u003d pwd.getpwuid(os.getuid()).pw_dir"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _apply_envs(self):"},{"line_number":157,"context_line":"        \"\"\"Apply environment from manifest."}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_326aae81","line":154,"updated":"2015-06-15 14:29:04.000000000","message":"Why not os.path.expanduser(\"~\")? In this case we can get rid of `pwd\u0027 module at all","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        makedirs(pub_root, \"extra\")"},{"line_number":152,"context_line":"        self.pub_dir \u003d os.path.join(pub_root, self.dirname)"},{"line_number":153,"context_line":"        self.new_home_dir \u003d tempfile.mkdtemp(prefix\u003d\"rally_gate_\")"},{"line_number":154,"context_line":"        self.old_home_dir \u003d pwd.getpwuid(os.getuid()).pw_dir"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _apply_envs(self):"},{"line_number":157,"context_line":"        \"\"\"Apply environment from manifest."}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_6bffad34","line":154,"in_reply_to":"fa32b979_326aae81","updated":"2015-06-16 13:49:26.000000000","message":"expanduser will take $HOME environment variable, but we need a _real_ user\u0027s home. (see line 166)","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if key in self.config:"},{"line_number":196,"context_line":"                args +\u003d [arg_name, self.config[key]]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"validate\"] + args, check\u003dTrue)"},{"line_number":199,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"start\"] + args, check\u003dTrue)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        def outfile(filename):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_b511c8ae","line":198,"updated":"2015-06-15 14:29:04.000000000","message":"Long arguments (--verbose, --debug) generally more preferable for scripts","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if key in self.config:"},{"line_number":196,"context_line":"                args +\u003d [arg_name, self.config[key]]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"validate\"] + args, check\u003dTrue)"},{"line_number":199,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"start\"] + args, check\u003dTrue)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        def outfile(filename):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_4b8bc9c3","line":198,"in_reply_to":"fa32b979_b511c8ae","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"validate\"] + args, check\u003dTrue)"},{"line_number":199,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"start\"] + args, check\u003dTrue)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        def outfile(filename):"},{"line_number":202,"context_line":"            return os.path.join(self.pub_dir, filename)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        run([\"rally\", \"task\", \"report\", \"--out\", outfile(\"results.html\")])"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_f5651045","line":201,"updated":"2015-06-15 14:29:04.000000000","message":"Why not lambda? Lambda will save 1 line","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"validate\"] + args, check\u003dTrue)"},{"line_number":199,"context_line":"        run([\"rally\", \"-v\", \"-d\", \"task\", \"start\"] + args, check\u003dTrue)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        def outfile(filename):"},{"line_number":202,"context_line":"            return os.path.join(self.pub_dir, filename)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        run([\"rally\", \"task\", \"report\", \"--out\", outfile(\"results.html\")])"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_d07801c7","line":201,"in_reply_to":"fa32b979_f5651045","updated":"2015-06-16 00:36:17.000000000","message":"Why lambda? Lambda will only save 1 line and we have plenty of these.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"147024f001b9e3cb5e19a53c3a39d925be0fee97","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    \"\"\"Represent a gate job.\"\"\""},{"line_number":257,"context_line":"    tasks \u003d []"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def setup(self):"},{"line_number":260,"context_line":"        \"\"\"Fill in all initial properties."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        project_name - name of currently tested project"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_bb4d3974","line":259,"updated":"2015-06-15 14:29:04.000000000","message":"Why not just __init__()? (and L348 is not required)","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    \"\"\"Represent a gate job.\"\"\""},{"line_number":257,"context_line":"    tasks \u003d []"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def setup(self):"},{"line_number":260,"context_line":"        \"\"\"Fill in all initial properties."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        project_name - name of currently tested project"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_504b9187","line":259,"in_reply_to":"fa32b979_bb4d3974","updated":"2015-06-16 00:36:17.000000000","message":"The code in this method is too complicated to be an `__init__\u0027. The `__init__\u0027 should only initialize values, not call the commands.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        if not filename:"},{"line_number":306,"context_line":"            filename \u003d os.path.join(self.jobs_dir, \"manifest.yaml\")"},{"line_number":307,"context_line":"        if not os.path.isfile(filename):"},{"line_number":308,"context_line":"            LOG.warning(\"Manifest not found. Switching to legacy behaivior.\")"},{"line_number":309,"context_line":"            self._handle_no_manifest()"},{"line_number":310,"context_line":"            return"},{"line_number":311,"context_line":"        for name, config in yaml.safe_load(open(filename, \"rb\")).items():"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_8bbfaafa","line":308,"updated":"2015-06-16 00:36:17.000000000","message":"behaivior once again","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        if not filename:"},{"line_number":306,"context_line":"            filename \u003d os.path.join(self.jobs_dir, \"manifest.yaml\")"},{"line_number":307,"context_line":"        if not os.path.isfile(filename):"},{"line_number":308,"context_line":"            LOG.warning(\"Manifest not found. Switching to legacy behaivior.\")"},{"line_number":309,"context_line":"            self._handle_no_manifest()"},{"line_number":310,"context_line":"            return"},{"line_number":311,"context_line":"        for name, config in yaml.safe_load(open(filename, \"rb\")).items():"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_ebc09de2","line":308,"in_reply_to":"fa32b979_8bbfaafa","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        lookup \u003d mako.lookup.TemplateLookup(directories\u003d[lookup_dirs])"},{"line_number":337,"context_line":"        template \u003d mako.template.Template(filename\u003dtemplate_filename,"},{"line_number":338,"context_line":"                                          lookup\u003dlookup)"},{"line_number":339,"context_line":"        open(dst, \"w\").write(template.render(tasks\u003dself.tasks))"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":342,"context_line":"    logging.basicConfig(format\u003d\"%(asctime)s %(name)s:%(levelname)s:\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_f05ae54f","line":339,"updated":"2015-06-16 00:36:17.000000000","message":"Please use `with\u0027.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        lookup \u003d mako.lookup.TemplateLookup(directories\u003d[lookup_dirs])"},{"line_number":337,"context_line":"        template \u003d mako.template.Template(filename\u003dtemplate_filename,"},{"line_number":338,"context_line":"                                          lookup\u003dlookup)"},{"line_number":339,"context_line":"        open(dst, \"w\").write(template.render(tasks\u003dself.tasks))"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":342,"context_line":"    logging.basicConfig(format\u003d\"%(asctime)s %(name)s:%(levelname)s:\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_8b6eb1ff","line":339,"in_reply_to":"fa32b979_f05ae54f","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"52fc148b60a9d38800167f035fab7b9f90bcab33","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        os.chdir(self.scenario.task.gate.rally_dir)"},{"line_number":86,"context_line":"        subprocess.check_call([\"git\", \"checkout\", version])"},{"line_number":87,"context_line":"        subprocess.check_call([\"./install_rally.sh\", \"--target\", self.path])"},{"line_number":88,"context_line":"        os.environ[\"PATH\"] \u003d (self.path + \"/bin\" + os.pathsep +"},{"line_number":89,"context_line":"                              os.environ[\"PATH\"])"},{"line_number":90,"context_line":"        subprocess.check_call([\"rally\", \"--version\"])"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"1a4dcd0f_fc0e40e4","line":88,"updated":"2015-08-10 15:12:42.000000000","message":"The separator for the PATH in POSIX is the \u0027:\u0027, not os.pathsep.","commit_id":"24e85d5d88a7185cd13dbc02a51d14c9191efe1e"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"52fc148b60a9d38800167f035fab7b9f90bcab33","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            config[\"admin\"][\"project_name\"] \u003d config[\"admin\"][\"tenant_name\"]"},{"line_number":128,"context_line":"            config[\"admin\"][\"project_domain_name\"] \u003d \"default\""},{"line_number":129,"context_line":"            try:"},{"line_number":130,"context_line":"                del config[\"admin\"][\"tenant_name\"]"},{"line_number":131,"context_line":"            except KeyError:"},{"line_number":132,"context_line":"                pass"},{"line_number":133,"context_line":"        with tempfile.NamedTemporaryFile() as cfg_file:"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a4dcd0f_dc1b441b","line":130,"updated":"2015-08-10 15:12:42.000000000","message":"Use \u0027pop(\"tenant_name\", None)\u0027 here.","commit_id":"24e85d5d88a7185cd13dbc02a51d14c9191efe1e"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"52fc148b60a9d38800167f035fab7b9f90bcab33","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            except KeyError:"},{"line_number":132,"context_line":"                pass"},{"line_number":133,"context_line":"        with tempfile.NamedTemporaryFile() as cfg_file:"},{"line_number":134,"context_line":"            json.dump(config, cfg_file)"},{"line_number":135,"context_line":"            LOG.debug(\"New keystone config: %s\" % json.dumps(config, indent\u003d2))"},{"line_number":136,"context_line":"            cfg_file.flush()"},{"line_number":137,"context_line":"            name \u003d \"\".join(random.sample(string.ascii_letters, 12))"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a4dcd0f_1cb76cf6","line":134,"updated":"2015-08-10 15:12:42.000000000","message":"Leave only this line inside the context manager.","commit_id":"24e85d5d88a7185cd13dbc02a51d14c9191efe1e"}],"tests/unit/test_rally_gate.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import tests.ci.rally_gate as rg"},{"line_number":22,"context_line":"from tests.unit import test"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"SAMPLE_CONFIG \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_00dc0145","line":21,"updated":"2015-05-26 15:05:46.000000000","message":"This whole module is chockablock with one- and two-letter variable names. It\u0027d be a lot more readable if things like rally_gate were just spelled out instead of abbreviated like this.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.makedirs\")"},{"line_number":45,"context_line":"    def test_makedirs(self, m_md):"},{"line_number":46,"context_line":"        rg.makedirs(\"d1\", \"d2\")"},{"line_number":47,"context_line":"        m_md.assert_called_once_with(\"d1/d2\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":50,"context_line":"    @mock.patch(\"tests.ci.rally_gate.subprocess.Popen\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_c5883bc9","line":47,"updated":"2015-05-26 15:05:46.000000000","message":"NTH: test the EEXIST code path as well.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        m_pipe.communicate.return_value \u003d (\"out\", \"\")"},{"line_number":54,"context_line":"        m_pipe.returncode \u003d 0"},{"line_number":55,"context_line":"        m_popen.return_value \u003d m_pipe"},{"line_number":56,"context_line":"        self.assertEqual(0, rg.run(\"ok\", check\u003dTrue))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":59,"context_line":"    @mock.patch(\"tests.ci.rally_gate.subprocess.Popen\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_2535cff6","line":56,"updated":"2015-05-26 15:05:46.000000000","message":"We should probably also check that subprocess.Popen() was called correctly, and that gzipping was done (or not done, as appropriate).","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        m_pipe.returncode \u003d 1"},{"line_number":64,"context_line":"        m_popen.return_value \u003d m_pipe"},{"line_number":65,"context_line":"        self.assertRaises(subprocess.CalledProcessError, rg.run, \"ok\","},{"line_number":66,"context_line":"                          check\u003dTrue)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class TaskTestCase(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_e53e97d9","line":66,"updated":"2015-05-26 15:05:46.000000000","message":"Ditto.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"class TaskTestCase(test.TestCase):"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":72,"context_line":"    def test__get_full_env_list(self, m_log):"},{"line_number":73,"context_line":"        env \u003d {"},{"line_number":74,"context_line":"            \"keystone\": [\"v2\", \"v3\", ],"},{"line_number":75,"context_line":"            \"python\": [(2, 6), (2, 7), (3, 4), ],"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_e02325a6","line":72,"updated":"2015-05-26 15:05:46.000000000","message":"Function is named \u0027_full_env_list\u0027, not \u0027_get_full_env_list\u0027","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        self.assertEqual(expected, tuple(task._full_env_list(env)))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":92,"context_line":"    def test__get_full_env_list_empty(self, m_log):"},{"line_number":93,"context_line":"        task \u003d rg.Task(\"fake_name\", {}, {})"},{"line_number":94,"context_line":"        self.assertEqual([{}], list(task._full_env_list({})))"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_c03949da","line":92,"updated":"2015-05-26 15:05:46.000000000","message":"Ditto.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        m_p_, m_k_ \u003d mock.Mock(), mock.Mock()"},{"line_number":104,"context_line":"        m_p.return_value, m_k.return_value \u003d m_p_, m_k_"},{"line_number":105,"context_line":"        m_p_.name \u003d \"p\""},{"line_number":106,"context_line":"        m_k_.name \u003d \"k\""},{"line_number":107,"context_line":"        m \u003d {\"keystone\": m_k, \"python\": m_p}"},{"line_number":108,"context_line":"        with mock.patch.dict(\"tests.ci.rally_gate.Scenario.ENVS\", m):"},{"line_number":109,"context_line":"            scenario \u003d rg.Scenario({}, {\"task\": \"d/f\"}, {\"keystone\": \"k\","}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_c0402938","line":106,"updated":"2015-05-26 15:05:46.000000000","message":"These variable names are completely inscrutable.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    @mock.patch(\"tests.ci.rally_gate.random.sample\", return_value\u003d\"name\")"},{"line_number":116,"context_line":"    @mock.patch(\"tests.ci.rally_gate.makedirs\")"},{"line_number":117,"context_line":"    @mock.patch(\"tests.ci.rally_gate.run\")"},{"line_number":118,"context_line":"    def test__run(self, m_run, m_md, m_dn, m_log):"},{"line_number":119,"context_line":"        config \u003d copy.deepcopy(SAMPLE_CONFIG[\"nova\"][0])"},{"line_number":120,"context_line":"        scenario \u003d rg.Scenario({}, config, {})"},{"line_number":121,"context_line":"        scenario._apply_envs \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_00a40106","line":118,"updated":"2015-05-26 15:05:46.000000000","message":"Why two underscores in the function name?\n\nm_md and m_dn are too terse. The name \"m_dn\" doesn\u0027t seem to have any relation to the function it\u0027s a mock of, either.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                     {\"GERRIT_PROJECT\": \"stackforge/rally\"})"},{"line_number":155,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":156,"context_line":"    def test__generate_index(self, m_log):"},{"line_number":157,"context_line":"        return"},{"line_number":158,"context_line":"        gate \u003d rg.Gate()"},{"line_number":159,"context_line":"        gate.rally_dir \u003d os.path.expanduser(\"/home/eye/rally\")"},{"line_number":160,"context_line":"        t1, t2 \u003d mock.Mock(), mock.Mock()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_a0d9ad85","line":157,"updated":"2015-05-26 15:05:46.000000000","message":"What\u0027s this doing here?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        gate \u003d rg.Gate()"},{"line_number":159,"context_line":"        gate.rally_dir \u003d os.path.expanduser(\"/home/eye/rally\")"},{"line_number":160,"context_line":"        t1, t2 \u003d mock.Mock(), mock.Mock()"},{"line_number":161,"context_line":"        s1, s2, s3, s4 \u003d mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()"},{"line_number":162,"context_line":"        for n, s in enumerate((s1, s2, s3, s4)):"},{"line_number":163,"context_line":"            s.envs \u003d {\"python\": \"2.7\", \"keystone\": \"v2\"}"},{"line_number":164,"context_line":"            s.dirname \u003d \"dir-%s\" % n"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_20d49d45","line":161,"updated":"2015-05-26 15:05:46.000000000","message":"Using lists (with decent variable names) would make this code much more readable.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.path\")"},{"line_number":173,"context_line":"    def test__handle_no_manifest(self, m_op):"},{"line_number":174,"context_line":"        gate \u003d rg.Gate()"},{"line_number":175,"context_line":"        gate._handle_no_manifest()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":178,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.path.isfile\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_203b7d9e","line":175,"updated":"2015-05-26 15:05:46.000000000","message":"What behavior is actually checked here? Just that it doesn\u0027t raise an exception?","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":178,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.path.isfile\")"},{"line_number":179,"context_line":"    def test__load_manifest(self, m_isfile, m_log):"},{"line_number":180,"context_line":"        m_isfile.return_value \u003d False"},{"line_number":181,"context_line":"        gate \u003d rg.Gate()"},{"line_number":182,"context_line":"        gate._handle_no_manifest \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_609bb573","line":179,"updated":"2015-05-26 15:05:46.000000000","message":"This tests the trivial case (where there is no manifest), but not the much less trivial (and much more important) case where there is a manifest.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"853619048bab79dc8789d1d2ec0f9b424d42bce4","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        s1, s2, s3, s4 \u003d mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()"},{"line_number":194,"context_line":"        for s in (s1, s2, s3, s4):"},{"line_number":195,"context_line":"            s.status \u003d 0"},{"line_number":196,"context_line":"        t1, t2 \u003d mock.Mock(), mock.Mock()"},{"line_number":197,"context_line":"        t1.scenarios \u003d [s1, s2]"},{"line_number":198,"context_line":"        t2.scenarios \u003d [s3, s4]"},{"line_number":199,"context_line":"        gate.tasks \u003d [t1, t2]"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_6072954b","line":196,"updated":"2015-05-26 15:05:46.000000000","message":"Using lists (with decent variable names) would make this code much more readable.","commit_id":"ec3585b0282179da6d22546a9fb8119407e56829"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import tests.ci.rally_gate as rg"},{"line_number":22,"context_line":"from tests.unit import test"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"SAMPLE_CONFIG \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_ab514eda","line":21,"updated":"2015-06-16 00:36:17.000000000","message":"Please import by the full name.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":42,"context_line":"class UtilsTestCase(test.TestCase):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.makedirs\")"},{"line_number":45,"context_line":"    def test_makedirs(self, m_md):"},{"line_number":46,"context_line":"        rg.makedirs(\"d1\", \"d2\")"},{"line_number":47,"context_line":"        m_md.assert_called_once_with(\"d1/d2\")"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1af86dd1_e3c6b215","line":45,"updated":"2015-06-16 00:36:17.000000000","message":"Please, always use \u0027mock_\u0027 instead of \u0027m_\u0027","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    @mock.patch(\"tests.ci.rally_gate.random.sample\", return_value\u003d\"dn\")"},{"line_number":106,"context_line":"    def test_init(self, m_r, m_log):"},{"line_number":107,"context_line":"        m_p, m_k \u003d mock.Mock(), mock.Mock()"},{"line_number":108,"context_line":"        m_p_, m_k_ \u003d mock.Mock(), mock.Mock()"},{"line_number":109,"context_line":"        m_p.return_value, m_k.return_value \u003d m_p_, m_k_"},{"line_number":110,"context_line":"        m_p_.name \u003d \"p\""},{"line_number":111,"context_line":"        m_k_.name \u003d \"k\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_6b3b469d","line":108,"updated":"2015-06-16 00:36:17.000000000","message":"You don\u0027t need these.\n\nJust use:\n m_p.return_value.name \u003d \"p\"\n m_k.return_value.name \u003d \"k\"","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    @mock.patch(\"tests.ci.rally_gate.random.sample\", return_value\u003d\"dn\")"},{"line_number":106,"context_line":"    def test_init(self, m_r, m_log):"},{"line_number":107,"context_line":"        m_p, m_k \u003d mock.Mock(), mock.Mock()"},{"line_number":108,"context_line":"        m_p_, m_k_ \u003d mock.Mock(), mock.Mock()"},{"line_number":109,"context_line":"        m_p.return_value, m_k.return_value \u003d m_p_, m_k_"},{"line_number":110,"context_line":"        m_p_.name \u003d \"p\""},{"line_number":111,"context_line":"        m_k_.name \u003d \"k\""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_dd4c8072","line":108,"in_reply_to":"fa32b979_6b3b469d","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            scenario \u003d rg.Scenario({}, {\"task\": \"d/f\"}, {\"keystone\": \"k\","},{"line_number":115,"context_line":"                                                         \"python\": \"p\"})"},{"line_number":116,"context_line":"        self.assertEqual(\"dn\", scenario.dirname)"},{"line_number":117,"context_line":"        self.assertEqual([m_p_, m_k_], scenario.envs)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":120,"context_line":"    @mock.patch(\"tests.ci.rally_gate.random.sample\", return_value\u003d\"name\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_cb4cd244","line":117,"updated":"2015-06-16 00:36:17.000000000","message":"And here use:\n\n assertEqual([m_p.return_value, m_k.return_value], scenario.envs)","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            scenario \u003d rg.Scenario({}, {\"task\": \"d/f\"}, {\"keystone\": \"k\","},{"line_number":115,"context_line":"                                                         \"python\": \"p\"})"},{"line_number":116,"context_line":"        self.assertEqual(\"dn\", scenario.dirname)"},{"line_number":117,"context_line":"        self.assertEqual([m_p_, m_k_], scenario.envs)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @mock.patch(\"tests.ci.rally_gate.LOG\", create\u003dTrue)"},{"line_number":120,"context_line":"    @mock.patch(\"tests.ci.rally_gate.random.sample\", return_value\u003d\"name\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_5d6f10c5","line":117,"in_reply_to":"fa32b979_cb4cd244","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        scenario \u003d rg.Scenario({}, config, {})"},{"line_number":126,"context_line":"        scenario._apply_envs \u003d mock.Mock()"},{"line_number":127,"context_line":"        scenario._run()"},{"line_number":128,"context_line":"        call \u003d mock.call"},{"line_number":129,"context_line":"        expected \u003d ["},{"line_number":130,"context_line":"            call([\"rally\", \"-v\", \"-d\", \"task\", \"validate\", \"--task\","},{"line_number":131,"context_line":"                  \"nova.yaml\", \"--task-args\", \"{image_name: \u0027TestVM\u0027}\","}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_6b6266af","line":128,"updated":"2015-06-16 00:36:17.000000000","message":"Better use mock.call explicitly below.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        gate \u003d rg.Gate()"},{"line_number":164,"context_line":"        gate.rally_dir \u003d os.path.expanduser(\"/home/eye/rally\")"},{"line_number":165,"context_line":"        t1, t2 \u003d mock.Mock(), mock.Mock()"},{"line_number":166,"context_line":"        s1, s2, s3, s4 \u003d mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()"},{"line_number":167,"context_line":"        for n, s in enumerate((s1, s2, s3, s4)):"},{"line_number":168,"context_line":"            s.envs \u003d {\"python\": \"2.7\", \"keystone\": \"v2\"}"},{"line_number":169,"context_line":"            s.dirname \u003d \"dir-%s\" % n"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_0b107a00","line":166,"updated":"2015-06-16 00:36:17.000000000","message":"Please use arrays instead of introducing \u0027s%d\u0027 or \u0027t%d\u0027 variables.","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        gate \u003d rg.Gate()"},{"line_number":164,"context_line":"        gate.rally_dir \u003d os.path.expanduser(\"/home/eye/rally\")"},{"line_number":165,"context_line":"        t1, t2 \u003d mock.Mock(), mock.Mock()"},{"line_number":166,"context_line":"        s1, s2, s3, s4 \u003d mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()"},{"line_number":167,"context_line":"        for n, s in enumerate((s1, s2, s3, s4)):"},{"line_number":168,"context_line":"            s.envs \u003d {\"python\": \"2.7\", \"keystone\": \"v2\"}"},{"line_number":169,"context_line":"            s.dirname \u003d \"dir-%s\" % n"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_bd309c9f","line":166,"in_reply_to":"fa32b979_0b107a00","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbf3d826b2263dc01ca785d1f5468857fbfdbdda","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        t1.name, t2.name \u003d \"t1\", \"t2\""},{"line_number":172,"context_line":"        t1.scenarios, t2.scenarios \u003d [s1, s2], [s3, s4]"},{"line_number":173,"context_line":"        gate.tasks \u003d [t1, t2]"},{"line_number":174,"context_line":"        gate._generate_index()"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @mock.patch.dict(\"tests.ci.rally_gate.os.environ\")"},{"line_number":177,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.path\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_ab686e88","line":174,"updated":"2015-06-16 00:36:17.000000000","message":"I see no actual checks here. Are you testing something?","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"aa3313e3c65214a5e139bbfe553bab6bb5c72190","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        t1.name, t2.name \u003d \"t1\", \"t2\""},{"line_number":172,"context_line":"        t1.scenarios, t2.scenarios \u003d [s1, s2], [s3, s4]"},{"line_number":173,"context_line":"        gate.tasks \u003d [t1, t2]"},{"line_number":174,"context_line":"        gate._generate_index()"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @mock.patch.dict(\"tests.ci.rally_gate.os.environ\")"},{"line_number":177,"context_line":"    @mock.patch(\"tests.ci.rally_gate.os.path\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa32b979_33483b2d","line":174,"in_reply_to":"fa32b979_ab686e88","updated":"2015-06-16 13:49:26.000000000","message":"Done","commit_id":"11f710b58da962176c34687c55486311b492f7cd"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"f432260a50d0f6e0b21c6d3169e82c58bed8db8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"fa32b979_9401b83a","updated":"2015-06-17 13:59:02.000000000","message":"Please use real variable names in this file.","commit_id":"a595b10dd261a2a142f257f110bc3d7506a19ccb"}]}
