)]}'
{"novaclient/tests/functional/base.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"140434bb8bb7948990efda585fed9a098f48d2fd","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        raise ValueError(\"Unable to find value for column \u0027%s\u0027.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TenantTestBase(ClientTestBase):"},{"line_number":291,"context_line":"    \"\"\"Base test class for additional tenant and user creation which"},{"line_number":292,"context_line":"    could be required in various test scenarios"},{"line_number":293,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_a47bfe7a","line":290,"updated":"2015-12-29 18:58:38.000000000","message":"Just a thought: could this be treated as a mix-in class instead of a base class?  Would that even make sense?","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"},{"author":{"_account_id":16437,"name":"Anna Babich","email":"anna.v.babich@gmail.com","username":"ababich"},"change_message_id":"752029650932bd4d6ac047e8297ed88658fff471","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        raise ValueError(\"Unable to find value for column \u0027%s\u0027.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TenantTestBase(ClientTestBase):"},{"line_number":291,"context_line":"    \"\"\"Base test class for additional tenant and user creation which"},{"line_number":292,"context_line":"    could be required in various test scenarios"},{"line_number":293,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ea90b597","line":290,"in_reply_to":"ba63e191_4b68fcf5","updated":"2016-01-19 13:20:07.000000000","message":"I can start working on base class refactoring in separate branch","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"96aa9dfdc047071b409a80027d69417edbddb3b0","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        raise ValueError(\"Unable to find value for column \u0027%s\u0027.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TenantTestBase(ClientTestBase):"},{"line_number":291,"context_line":"    \"\"\"Base test class for additional tenant and user creation which"},{"line_number":292,"context_line":"    could be required in various test scenarios"},{"line_number":293,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_4b68fcf5","line":290,"in_reply_to":"da6ed579_15a1f345","updated":"2016-01-19 06:34:41.000000000","message":"After taking a closer look, I think, my idea with fixture wasn\u0027t good either:\n\n1) as Anna stated, TenantTestBase depends on the methods from the base class - I\u0027d rather we refactor the base class to make these helper methods independent functions, so that it won\u0027t be required to inherit from the class to use them (_get_column_value_from_single_row_table, _get_value_from_the_table, name_generate - none of this use the class state - self argument - so we can either make them static methods or, better, move them into a separate utils module). But this should probably be done as a follow up patch\n\n2) even if we move the methods from the base class, we are still introducing a new one - another_nova - in this class. While in a dynamic language like Python it\u0027d be easy to have this callable created at runtime by a fixture, I don\u0027t think it\u0027s worth it to complicate the code. Let\u0027s stick to the classic inheritance instead.","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"},{"author":{"_account_id":16437,"name":"Anna Babich","email":"anna.v.babich@gmail.com","username":"ababich"},"change_message_id":"ec40519439a8abe766d51105e0f02f4a7b376450","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        raise ValueError(\"Unable to find value for column \u0027%s\u0027.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TenantTestBase(ClientTestBase):"},{"line_number":291,"context_line":"    \"\"\"Base test class for additional tenant and user creation which"},{"line_number":292,"context_line":"    could be required in various test scenarios"},{"line_number":293,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_15a1f345","line":290,"in_reply_to":"fa69d971_578225c9","updated":"2016-01-15 14:23:36.000000000","message":"It seems to me that mix-in will be a little redundant here. TenantTestBase class isn\u0027t implemented separately but directly depends on some functions declared in ClientTestBase","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1666b816f95591e6c6d84235fa1767c8bfdc867f","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        raise ValueError(\"Unable to find value for column \u0027%s\u0027.\")"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TenantTestBase(ClientTestBase):"},{"line_number":291,"context_line":"    \"\"\"Base test class for additional tenant and user creation which"},{"line_number":292,"context_line":"    could be required in various test scenarios"},{"line_number":293,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_578225c9","line":290,"in_reply_to":"fa69d971_a47bfe7a","updated":"2016-01-06 15:38:37.000000000","message":"+1\n\nor even refactor this to be a fixture instead","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"}],"novaclient/tests/functional/v2/legacy/test_flavor_access.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"115b3ba70658eaf104e9b9bdf97dedf0ee5cf6e7","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    COMPUTE_API_VERSION \u003d \"2.1\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def setUp(self):"},{"line_number":24,"context_line":"        super(TestFlvAccessNovaClient, self).setUp()"},{"line_number":25,"context_line":"        tenant \u003d self.cli_clients.keystone("},{"line_number":26,"context_line":"            \u0027tenant-create --name %s --enabled True\u0027 %"},{"line_number":27,"context_line":"            self.name_generate(prefix\u003d\u0027flv\u0027))"},{"line_number":28,"context_line":"        self.tenant_name \u003d self._get_value_from_the_table(tenant, \"name\")"},{"line_number":29,"context_line":"        self.addCleanup(self.cli_clients.keystone,"},{"line_number":30,"context_line":"                        \"tenant-delete %s\" % self.tenant_name)"},{"line_number":31,"context_line":"        user_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":32,"context_line":"        password \u003d \u0027password\u0027"},{"line_number":33,"context_line":"        user \u003d self.cli_clients.keystone("},{"line_number":34,"context_line":"            \"user-create --name %(name)s --pass %(pass)s --tenant %(tenant)s\" %"},{"line_number":35,"context_line":"            {\"name\": user_name, \"pass\": password, \"tenant\": self.tenant_name})"},{"line_number":36,"context_line":"        self.user_id \u003d self._get_value_from_the_table(user, \"id\")"},{"line_number":37,"context_line":"        self.addCleanup(self.cli_clients.keystone,"},{"line_number":38,"context_line":"                        \"user-delete %s\" % self.user_id)"},{"line_number":39,"context_line":"        self.cli_clients_2 \u003d tempest_lib.cli.base.CLIClient("},{"line_number":40,"context_line":"            username\u003duser_name,"},{"line_number":41,"context_line":"            password\u003dpassword,"},{"line_number":42,"context_line":"            tenant_name\u003dself.tenant_name,"},{"line_number":43,"context_line":"            uri\u003dself.cli_clients.uri,"},{"line_number":44,"context_line":"            cli_dir\u003dself.cli_clients.cli_dir)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def another_nova(self, action, flags\u003d\u0027\u0027, params\u003d\u0027\u0027, fail_ok\u003dFalse,"},{"line_number":47,"context_line":"                     endpoint_type\u003d\u0027publicURL\u0027, merge_stderr\u003dFalse):"},{"line_number":48,"context_line":"        flags +\u003d \" --os-compute-api-version %s \" % self.COMPUTE_API_VERSION"},{"line_number":49,"context_line":"        return self.cli_clients_2.nova(action, flags, params, fail_ok,"},{"line_number":50,"context_line":"                                       endpoint_type, merge_stderr)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_public_flavor_list(self):"},{"line_number":53,"context_line":"        # Check that flavors with public access are available for both admin"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_4eafd3e3","line":50,"range":{"start_line":23,"start_character":4,"end_line":50,"end_character":67},"updated":"2015-12-22 15:13:18.000000000","message":"It would be nice to not produce code duplication, so please, move this code to separate class and inherit from it here and in v2.test_keypairs.TestKeypairsNovaClientV210","commit_id":"effe7dc34ab16a8b3dc17e26085701462394bc94"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"115b3ba70658eaf104e9b9bdf97dedf0ee5cf6e7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        flv_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":77,"context_line":"        self.nova(\u0027flavor-create --is-public false %s auto 512 1 1\u0027 % flv_name)"},{"line_number":78,"context_line":"        self.addCleanup(self.nova, \u0027flavor-delete %s\u0027 % flv_name)"},{"line_number":79,"context_line":"        tenant_id \u003d self._get_value_from_the_table(self.cli_clients.keystone("},{"line_number":80,"context_line":"            \u0027tenant-get %s\u0027 % self.tenant_name), \u0027id\u0027)"},{"line_number":81,"context_line":"        self.nova(\u0027flavor-access-add\u0027, params\u003d\"%s %s\" % (flv_name, tenant_id))"},{"line_number":82,"context_line":"        self.assertIn(tenant_id, self.nova(\u0027flavor-access-list --flavor %s\u0027 %"},{"line_number":83,"context_line":"                                           flv_name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_8ee61be7","line":80,"range":{"start_line":79,"start_character":8,"end_line":80,"end_character":54},"updated":"2015-12-22 15:13:18.000000000","message":"move this code to setUp method","commit_id":"effe7dc34ab16a8b3dc17e26085701462394bc94"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"115b3ba70658eaf104e9b9bdf97dedf0ee5cf6e7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        flv_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":91,"context_line":"        self.nova(\u0027flavor-create %s auto 512 1 1\u0027 % flv_name)"},{"line_number":92,"context_line":"        self.addCleanup(self.nova, \u0027flavor-delete %s\u0027 % flv_name)"},{"line_number":93,"context_line":"        tenant_id \u003d self._get_value_from_the_table("},{"line_number":94,"context_line":"            self.cli_clients.keystone("},{"line_number":95,"context_line":"                \u0027tenant-get %s\u0027 % self.tenant_name), \u0027id\u0027)"},{"line_number":96,"context_line":"        self.nova(\u0027flavor-access-add %s %s\u0027 % (flv_name, tenant_id))"},{"line_number":97,"context_line":"        output \u003d self.nova(\u0027flavor-access-list --flavor %s\u0027 % flv_name,"},{"line_number":98,"context_line":"                           fail_ok\u003dTrue, merge_stderr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_2ed8471d","line":95,"range":{"start_line":93,"start_character":8,"end_line":95,"end_character":58},"updated":"2015-12-22 15:13:18.000000000","message":"same here","commit_id":"effe7dc34ab16a8b3dc17e26085701462394bc94"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8a3568792f730e4c0038dbf87044e59e2f595f39","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        flv_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":59,"context_line":"        self.nova(\u0027flavor-create %s auto 512 1 1\u0027 % flv_name)"},{"line_number":60,"context_line":"        self.addCleanup(self.nova, \u0027flavor-delete %s\u0027 % flv_name)"},{"line_number":61,"context_line":"        tenant_id \u003d self._get_value_from_the_table("},{"line_number":62,"context_line":"            self.cli_clients.keystone("},{"line_number":63,"context_line":"                \u0027tenant-get %s\u0027 % self.tenant_name), \u0027id\u0027)"},{"line_number":64,"context_line":"        self.nova(\u0027flavor-access-add %s %s\u0027 % (flv_name, tenant_id))"},{"line_number":65,"context_line":"        output \u003d self.nova(\u0027flavor-access-list --flavor %s\u0027 % flv_name,"},{"line_number":66,"context_line":"                           fail_ok\u003dTrue, merge_stderr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa69d971_fa4ad526","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":58},"updated":"2016-01-07 23:47:09.000000000","message":"Why not use self.tenant_id here instead of doing this? (Like you have in test_add_access_non_public_flavor)","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"},{"author":{"_account_id":16437,"name":"Anna Babich","email":"anna.v.babich@gmail.com","username":"ababich"},"change_message_id":"c81e9e756708a7a798a253ba1084b6b45b906bd8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        flv_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":59,"context_line":"        self.nova(\u0027flavor-create %s auto 512 1 1\u0027 % flv_name)"},{"line_number":60,"context_line":"        self.addCleanup(self.nova, \u0027flavor-delete %s\u0027 % flv_name)"},{"line_number":61,"context_line":"        tenant_id \u003d self._get_value_from_the_table("},{"line_number":62,"context_line":"            self.cli_clients.keystone("},{"line_number":63,"context_line":"                \u0027tenant-get %s\u0027 % self.tenant_name), \u0027id\u0027)"},{"line_number":64,"context_line":"        self.nova(\u0027flavor-access-add %s %s\u0027 % (flv_name, tenant_id))"},{"line_number":65,"context_line":"        output \u003d self.nova(\u0027flavor-access-list --flavor %s\u0027 % flv_name,"},{"line_number":66,"context_line":"                           fail_ok\u003dTrue, merge_stderr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_b5b34797","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":58},"in_reply_to":"fa69d971_fa4ad526","updated":"2016-01-15 14:24:14.000000000","message":"yep, thanks, will fix it","commit_id":"348e7eecb5954d2416c7936b304d38e3428e74c4"}],"novaclient/tests/functional/v2/test_flavor_access.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"115b3ba70658eaf104e9b9bdf97dedf0ee5cf6e7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        flv_name \u003d self.name_generate(prefix\u003d\u0027flv\u0027)"},{"line_number":26,"context_line":"        self.nova(\u0027flavor-create %s auto 512 1 1\u0027 % flv_name)"},{"line_number":27,"context_line":"        self.addCleanup(self.nova, \u0027flavor-delete %s\u0027 % flv_name)"},{"line_number":28,"context_line":"        tenant_id \u003d self._get_value_from_the_table("},{"line_number":29,"context_line":"            self.cli_clients.keystone(\u0027tenant-get %s\u0027 %"},{"line_number":30,"context_line":"                                      self.tenant_name), \u0027id\u0027)"},{"line_number":31,"context_line":"        output \u003d self.nova(\u0027flavor-access-add %s %s\u0027 % (flv_name, tenant_id),"},{"line_number":32,"context_line":"                           fail_ok\u003dTrue, merge_stderr\u003dTrue)"},{"line_number":33,"context_line":"        self.assertIn(\"ERROR (Conflict): \""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_6e6acf1c","line":30,"range":{"start_line":28,"start_character":8,"end_line":30,"end_character":62},"updated":"2015-12-22 15:13:18.000000000","message":"see my comment in previous v2/test_flavor_access.py","commit_id":"effe7dc34ab16a8b3dc17e26085701462394bc94"}],"novaclient/tests/functional/v2/test_keypairs.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef6edaf6888ec0982849b20bd3ff6b3db0b7488e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    COMPUTE_API_VERSION \u003d \"2.10\""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_create_and_list_keypair(self):"},{"line_number":53,"context_line":"        name \u003d self.name_generate(\u0027v\u0027 + self.COMPUTE_API_VERSION)"},{"line_number":54,"context_line":"        self.nova(\"keypair-add %s --user %s\" % (name, self.user_id))"},{"line_number":55,"context_line":"        self.addCleanup(self.another_nova, \"keypair-delete %s\" % name)"},{"line_number":56,"context_line":"        output \u003d self.nova(\"keypair-list\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a7b0d38_17ae0e81","line":53,"range":{"start_line":53,"start_character":40,"end_line":53,"end_character":64},"updated":"2015-12-29 12:11:12.000000000","message":"self.COMPUTE_API_VERSION includes dot(.), which is restricted for keypairs name","commit_id":"3beda02e69f1aae260c3f71aa4dbb441c50ec760"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"ef6edaf6888ec0982849b20bd3ff6b3db0b7488e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         self._get_value_from_the_table(output_1, \"user_id\"))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_create_and_delete(self):"},{"line_number":74,"context_line":"        name \u003d self.name_generate(\u0027v\u0027 + self.COMPUTE_API_VERSION)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        def cleanup():"},{"line_number":77,"context_line":"            # We should check keypair existence and remove it from correct user"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a7b0d38_d7cc066c","line":74,"range":{"start_line":74,"start_character":40,"end_line":74,"end_character":64},"updated":"2015-12-29 12:11:12.000000000","message":"same here","commit_id":"3beda02e69f1aae260c3f71aa4dbb441c50ec760"}]}
