)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"4bcac24c575a753837d5cdfc12552733f42f7d47","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yaroslav Lobankov \u003cylobankov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-19 18:15:42 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Savanna: add changes to API client and new tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Partially implements: blueprint savanna-api-tests"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAUX%2F%2BknI%3D","line":7,"updated":"2014-02-20 13:00:19.000000000","message":"Please, add details to the commit message and make title more informative. For example:\n\n    Savanna: make API tests plugin/version independent\n    \n    Currently node group templates API tests depends on vanilla plugin v1.2.1 and this patch introduces approach of choosing random plugin/version for generating config templates for testing. All current hard coded versions replaced with described approach.","commit_id":"bd013236de428758ef9392a962ea5fde24a23463"}],"tempest/api/data_processing/base.py":[{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"fbaa4270fe48c6c5771672585d105148c4ef9e43","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            raise cls.skipException(\"Savanna support is required\")"},{"line_number":34,"context_line":"        cls.client \u003d os.data_processing_client"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        # get plugin list"},{"line_number":37,"context_line":"        _, plugin_list \u003d cls.client.list_plugins()"},{"line_number":38,"context_line":"        # choose random plugin from list"},{"line_number":39,"context_line":"        plugin \u003d random.choice(plugin_list)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B%2BRQ%3D","line":36,"updated":"2014-02-17 22:01:17.000000000","message":"Let\u0027s move to the separated function like \u0027prepare_defaults\u0027.","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"fbaa4270fe48c6c5771672585d105148c4ef9e43","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        cls.client \u003d os.data_processing_client"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        # get plugin list"},{"line_number":37,"context_line":"        _, plugin_list \u003d cls.client.list_plugins()"},{"line_number":38,"context_line":"        # choose random plugin from list"},{"line_number":39,"context_line":"        plugin \u003d random.choice(plugin_list)"},{"line_number":40,"context_line":"        # get name of random plugin"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B%2BSU%3D","line":37,"updated":"2014-02-17 22:01:17.000000000","message":"Please, don\u0027t use _ to mark unused variables due to the gettext stuff. It could be named with _ prefix.","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6c62bbdde9e3908f5565238a0f3e544d3d6319c8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                cls.client.delete_data_source(data_source_id)"},{"line_number":110,"context_line":"            except Exception:"},{"line_number":111,"context_line":"                # ignore errors while auto removing created resource"},{"line_number":112,"context_line":"                pass"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        cls.clear_isolated_creds()"},{"line_number":115,"context_line":"        super(BaseDataProcessingTest, cls).tearDownClass()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B%2BIo%3D","line":112,"updated":"2014-02-17 22:13:39.000000000","message":"For one cycle is normal, but not for three.\n\nMaybe would be better to make method with params for list of entities and delete methods?\n\nFor example:\n\n@classmethod\ndef remove_resources(cls, resources_ids, method):\n    for res_id in resources_ids:\n    try:\n        method(res_id)\n    except Exception:\n        pass\n\n@classmethod\ndef tearDownClass(cls):\n    cls.remove_resources(cls._node_group_templates, \n        cls.client.delete_node_group_template)\n    cls.remove_resources(cls._cluster_templates, \n        cls.client.delete_cluster_template)\n    cls.remove_resources(cls._data_sources, \n        cls.client.delete_data_source)\n    cls.clear_isolated_creds()\n    super(BaseDataProcessingTest, cls).tearDownClass()\n\nAnd, using \"Exception\" can hide some problems, better to use expected exceptions, like NotFound, etc.","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"eda2a9453ce1c2e83f800458ba9be2a10cd2dcb5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                cls.client.delete_data_source(data_source_id)"},{"line_number":110,"context_line":"            except Exception:"},{"line_number":111,"context_line":"                # ignore errors while auto removing created resource"},{"line_number":112,"context_line":"                pass"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        cls.clear_isolated_creds()"},{"line_number":115,"context_line":"        super(BaseDataProcessingTest, cls).tearDownClass()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B5zE%3D","line":112,"in_reply_to":"AAAAUX%2F%2B%2BIo%3D","updated":"2014-02-18 09:53:40.000000000","message":"It is really not important for us. We should catch any exceptions.\n\nP.S: I took a look at other projects in Tempest. Some projects use \"except Exception\". \n\nThank you for good comments :)","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"4bcac24c575a753837d5cdfc12552733f42f7d47","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import random"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest import config"},{"line_number":19,"context_line":"import tempest.test"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Bkl8%3D","line":16,"updated":"2014-02-20 13:00:19.000000000","message":"Please, use random ops from https://github.com/openstack/tempest/blob/master/tempest/common/utils/data_utils.py","commit_id":"bd013236de428758ef9392a962ea5fde24a23463"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"0db4563b228685932e07e7deb3bcb09001face38","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import random"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest import config"},{"line_number":19,"context_line":"import tempest.test"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BisU%3D","line":16,"in_reply_to":"AAAAUX%2F%2Bkl8%3D","updated":"2014-02-20 16:14:34.000000000","message":"There is no suitable method for me in this file :)","commit_id":"bd013236de428758ef9392a962ea5fde24a23463"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"361b87e433b16f7c353cd878b6e87df478ff446b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        # get plugin list"},{"line_number":31,"context_line":"        plugin_list \u003d cls.client.list_plugins()[1]"},{"line_number":32,"context_line":"        # choose random plugin from list"},{"line_number":33,"context_line":"        plugin \u003d random.choice(plugin_list)"},{"line_number":34,"context_line":"        # get name of random plugin"},{"line_number":35,"context_line":"        plugin_name \u003d plugin[\u0027name\u0027]"},{"line_number":36,"context_line":"        # choose random Hadoop version"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAVn%2F%2Bw7I%3D","line":33,"updated":"2014-03-12 10:17:17.000000000","message":"randomness in the tests isn\u0027t good for repeatability. These should be static configuration variables.","commit_id":"0f6a289ec6052a719e329340974621575fb755b8"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"a18983c79d0241d563220c20677e98bc5cca9ed5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        # get plugin list"},{"line_number":31,"context_line":"        plugin_list \u003d cls.client.list_plugins()[1]"},{"line_number":32,"context_line":"        # choose random plugin from list"},{"line_number":33,"context_line":"        plugin \u003d random.choice(plugin_list)"},{"line_number":34,"context_line":"        # get name of random plugin"},{"line_number":35,"context_line":"        plugin_name \u003d plugin[\u0027name\u0027]"},{"line_number":36,"context_line":"        # choose random Hadoop version"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAVn%2F%2BwVw%3D","line":33,"in_reply_to":"AAAAVn%2F%2Bw7I%3D","updated":"2014-03-12 11:34:41.000000000","message":"We really need this approach. The problem is that plugin versions can be changed. Node processes depend on plugin versions and that is why we should avoid static configuration variables.","commit_id":"0f6a289ec6052a719e329340974621575fb755b8"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"b4527be4651dd704e1d7019543b66fd259ab5b3d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        # get plugin list"},{"line_number":31,"context_line":"        plugin_list \u003d cls.client.list_plugins()[1]"},{"line_number":32,"context_line":"        # choose random plugin from list"},{"line_number":33,"context_line":"        plugin \u003d random.choice(plugin_list)"},{"line_number":34,"context_line":"        # get name of random plugin"},{"line_number":35,"context_line":"        plugin_name \u003d plugin[\u0027name\u0027]"},{"line_number":36,"context_line":"        # choose random Hadoop version"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2Fs3c%3D","line":33,"in_reply_to":"AAAAVn%2F%2BwVw%3D","updated":"2014-03-14 11:55:30.000000000","message":"Then specify it in the config. Random isn\u0027t appropriate in tempest.","commit_id":"0f6a289ec6052a719e329340974621575fb755b8"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"846cf66400c0ba1efc4b1e4b7141325f01943582","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def prepare_defaults(cls):"},{"line_number":28,"context_line":"        plugin_name \u003d CONF.data_processing.plugin_name"},{"line_number":29,"context_line":"        hadoop_version \u003d CONF.data_processing.hadoop_version"},{"line_number":30,"context_line":"        node_processes \u003d CONF.data_processing.node_processes"},{"line_number":31,"context_line":"        flavor_ref \u003d CONF.compute.flavor_ref"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAWH%2F%2BMEU%3D","line":28,"updated":"2014-03-28 14:47:23.000000000","message":"It doesn\u0027t solve our issue with smooth upgrade of plugin versions.  Ideally, we should be able to just update plugin version from 1.2.1 to 1.3.0 w/o keeping old version.","commit_id":"833707c55d4716f565b26ed39822c45f4f8c9941"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"4e25c509e6a16bdc45b02f9599cbccf61e1565de","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def prepare_defaults(cls):"},{"line_number":28,"context_line":"        plugin_name \u003d CONF.data_processing.plugin_name"},{"line_number":29,"context_line":"        hadoop_version \u003d CONF.data_processing.hadoop_version"},{"line_number":30,"context_line":"        node_processes \u003d CONF.data_processing.node_processes"},{"line_number":31,"context_line":"        flavor_ref \u003d CONF.compute.flavor_ref"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAWH%2F%2BIco%3D","line":28,"in_reply_to":"AAAAWH%2F%2BMEU%3D","updated":"2014-03-28 22:54:50.000000000","message":"Why? We can specify plugin name, Hadoop version and list of node processes for any plugin versions in configuration file.","commit_id":"833707c55d4716f565b26ed39822c45f4f8c9941"}],"tempest/api/data_processing/test_cluster_templates.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6c62bbdde9e3908f5565238a0f3e544d3d6319c8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        # delete the cluster template by id"},{"line_number":79,"context_line":"        resp \u003d self.client.delete_cluster_template(template_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertEqual(\u0027204\u0027, resp[0][\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B%2BTc%3D","line":81,"updated":"2014-02-17 22:13:39.000000000","message":"See comment in tempest/api/data_processing/test_data_source.py","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"118a3c15896a9bc5085b083da264e64af72f7f06","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 Mirantis Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2BRus%3D","line":1,"updated":"2014-02-22 17:08:54.000000000","message":"Year 2014?","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"118a3c15896a9bc5085b083da264e64af72f7f06","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.data_processing import base as dp_base"},{"line_number":17,"context_line":"from tempest.common.utils import data_utils"},{"line_number":18,"context_line":"from tempest.test import attr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ClusterTemplateTest(dp_base.BaseDataProcessingTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2BRuY%3D","line":18,"updated":"2014-02-22 17:08:54.000000000","message":"See http://docs.openstack.org/developer/hacking/\n\nModule \"test\" should be imported","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e7f59de474de716d5305403e7fce4761453040e3","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.data_processing import base as dp_base"},{"line_number":17,"context_line":"from tempest.common.utils import data_utils"},{"line_number":18,"context_line":"from tempest.test import attr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ClusterTemplateTest(dp_base.BaseDataProcessingTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAU3%2F%2F928%3D","line":18,"in_reply_to":"AAAAUX%2F%2BRuY%3D","updated":"2014-02-23 10:05:04.000000000","message":"There are more than 120 entries of \"from tempest.test import attr\" in tempest, so, I think that\u0027s ok :)","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"}],"tempest/api/data_processing/test_data_source.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6c62bbdde9e3908f5565238a0f3e544d3d6319c8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        # delete the data source by id"},{"line_number":79,"context_line":"        resp \u003d self.client.delete_data_source(source_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertEqual(\u0027204\u0027, resp[0][\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B%2BT0%3D","line":81,"updated":"2014-02-17 22:13:39.000000000","message":"Here first param is string, in other assertions it is integer. Is there any reason to expect different types of response codes? Maybe whould be better to use type conversion?","commit_id":"27ea8913380a80adad0a53855879c80d50c50bd4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"118a3c15896a9bc5085b083da264e64af72f7f06","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 Mirantis Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2BRt8%3D","line":1,"updated":"2014-02-22 17:08:54.000000000","message":"Year 2014?","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"118a3c15896a9bc5085b083da264e64af72f7f06","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.data_processing import base as dp_base"},{"line_number":17,"context_line":"from tempest.common.utils import data_utils"},{"line_number":18,"context_line":"from tempest.test import attr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class DataSourceTest(dp_base.BaseDataProcessingTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2BRuE%3D","line":18,"updated":"2014-02-22 17:08:54.000000000","message":"See http://docs.openstack.org/developer/hacking/\n\nModule \"test\" should be imported","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"e7f59de474de716d5305403e7fce4761453040e3","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.data_processing import base as dp_base"},{"line_number":17,"context_line":"from tempest.common.utils import data_utils"},{"line_number":18,"context_line":"from tempest.test import attr"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class DataSourceTest(dp_base.BaseDataProcessingTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAU3%2F%2F918%3D","line":18,"in_reply_to":"AAAAUX%2F%2BRuE%3D","updated":"2014-02-23 10:05:04.000000000","message":"ditto","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"1f576e4593544d07d7514bc5acf39a15be567fa7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.assertEqual(source_name, source[\u0027name\u0027])"},{"line_number":69,"context_line":"        self.assertEqual(self.simple_data_source[\u0027url\u0027], source[\u0027url\u0027])"},{"line_number":70,"context_line":"        self.assertEqual(self.simple_data_source[\u0027type\u0027], source[\u0027type\u0027])"},{"line_number":71,"context_line":"        self.assertEqual(self.simple_data_source[\u0027credentials\u0027],"},{"line_number":72,"context_line":"                         source[\u0027credentials\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @attr(type\u003d\u0027smoke\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAU3%2F%2F9pg%3D","line":71,"updated":"2014-02-23 12:22:35.000000000","message":"Savanna doesn\u0027t return credentials from REST API now.","commit_id":"0540845a7a86d151563c49561c05478c40497ee3"}]}
