)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"c8ff186a70eacf5bbae8f81d6dae3a23df899b05","unresolved":false,"context_lines":[{"line_number":10,"context_line":"It\u0027s using testscenarios lib to generate a test case for each variation."},{"line_number":11,"context_line":"It contains resource handling and result proofing of invalid requests."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Not covered in this patch (will be done later):"},{"line_number":14,"context_line":"- Documentation"},{"line_number":15,"context_line":"- Unit tests"},{"line_number":16,"context_line":"- Actual json schemas for all APIs"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAUH%2F%2FB8s%3D","line":13,"updated":"2014-01-18 09:57:04.000000000","message":"If it is for another patch, so this patch should be \"Partially implements bp negative-tests\".\n\nWhat intentions about xml negative tests and schemas? It isn\u0027t mentioned in comment, it removed from \u0027flavors\u0027 file...","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"}],"tempest/api/compute/flavors/test_flavors_negative.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"c8ff186a70eacf5bbae8f81d6dae3a23df899b05","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                          nonexistent_flavor_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class FlavorsNegativeTestXML(FlavorsNegativeTestJSON):"},{"line_number":54,"context_line":"    _interface \u003d \u0027xml\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FB%2FE%3D","side":"PARENT","line":53,"updated":"2014-01-18 09:57:04.000000000","message":"What about xml tests? Maybe it would be better to leave old explicitly scripted tests in XML class, until xml schemas appears?","commit_id":"6dad5060f11f20004c2e43daea38a066f3774147"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"65f7713d64ca91f85229cd0e26a282d6ebfecd8a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"load_tests \u003d testscenarios.load_tests_apply_scenarios"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class FlavorDetailsNegativeTestJSON(base.BaseV2ComputeTest,"},{"line_number":28,"context_line":"                                    test.NegativeAutoTest):"},{"line_number":29,"context_line":"    _interface \u003d \u0027json\u0027"},{"line_number":30,"context_line":"    _service \u003d \u0027compute\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FFTk%3D","line":27,"updated":"2014-01-17 16:39:59.000000000","message":"I think this class name should be \u0027FlavorsListNegativeTestJSON\u0027 and below class name should be \u0027FlavorDetailsNegativeTestJSON\u0027.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"c8ff186a70eacf5bbae8f81d6dae3a23df899b05","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                           {\u0027gen_none\u0027: 400,"},{"line_number":46,"context_line":"                                            \u0027gen_string\u0027: 400}}"},{"line_number":47,"context_line":"                               }"},{"line_number":48,"context_line":"            }"},{"line_number":49,"context_line":"         }"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    scenarios \u003d test.NegativeAutoTest.generate_scenario(_description)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FB%2Bg%3D","line":48,"updated":"2014-01-18 09:57:04.000000000","message":"I think, it will be better to use one type of quotes - \"\n\nAnd reorginize json to more readable variant like next:\n\n_description \u003d {\n    \"name\": \"list-flavors-with-detail\",\n    \"http-method\": \"GET\",\n    \"url\": \"flavors/detail\",\n    \"json-schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"minRam\": {\n                \"type\": \"integer\",\n                \"results\": {\n                    \"gen_none\": 400,\n                    \"gen_string\": 400\n                }\n            },\n            \"minDisk\": {\n                \"type\": \"integer\",\n                \"results\": {\n                    \"gen_none\": 400,\n                    \"gen_string\": 400\n                }\n            }\n        }\n    }\n}\n\nSame thing to other json schemas.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"ded16ae1629f54ae5a6ae2a0e02a309a0698541e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    _service \u003d \u0027compute\u0027"},{"line_number":29,"context_line":"    _schema_file \u003d \u0027schemas/flavors_list.json\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    _description \u003d test.NegativeAutoTest.load_schema(_schema_file,"},{"line_number":32,"context_line":"                                                     __file__,"},{"line_number":33,"context_line":"                                                     _interface)"},{"line_number":34,"context_line":"    scenarios \u003d test.NegativeAutoTest.generate_scenario(_description)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9%2BcQ%3D","line":31,"updated":"2014-01-31 13:51:01.000000000","message":"boilerplate","commit_id":"19d85988d6829c87bc7770267529ac19886c8063"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"ded16ae1629f54ae5a6ae2a0e02a309a0698541e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    _description \u003d test.NegativeAutoTest.load_schema(_schema_file,"},{"line_number":32,"context_line":"                                                     __file__,"},{"line_number":33,"context_line":"                                                     _interface)"},{"line_number":34,"context_line":"    scenarios \u003d test.NegativeAutoTest.generate_scenario(_description)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @test.attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":37,"context_line":"    def test_list_flavors_with_detail(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9%2BcA%3D","line":34,"updated":"2014-01-31 13:51:01.000000000","message":"boilerplate","commit_id":"19d85988d6829c87bc7770267529ac19886c8063"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"12c8fb89c302212d9a707948ad462269eba59d0a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"load_tests \u003d testscenarios.load_tests_apply_scenarios"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class FlavorsListNegativeTestNewJSON(base.BaseV2ComputeTest,"},{"line_number":26,"context_line":"                                     test.NegativeAutoTest):"},{"line_number":27,"context_line":"    _interface \u003d \u0027json\u0027"},{"line_number":28,"context_line":"    _service \u003d \u0027compute\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F951s%3D","line":25,"updated":"2014-02-02 00:00:42.000000000","message":"Just a question. Why do we need a \u0027New\u0027 modifier in this class name? Is there any name conflict?","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"e87c45060d282d4d0dde524a3adb823442ba7d8e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"load_tests \u003d testscenarios.load_tests_apply_scenarios"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class FlavorsListNegativeTestNewJSON(base.BaseV2ComputeTest,"},{"line_number":26,"context_line":"                                     test.NegativeAutoTest):"},{"line_number":27,"context_line":"    _interface \u003d \u0027json\u0027"},{"line_number":28,"context_line":"    _service \u003d \u0027compute\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F90eM%3D","line":25,"in_reply_to":"AAAAUH%2F91Bs%3D","updated":"2014-02-03 16:42:16.000000000","message":"Done","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d7b4df27d249d862b779201ace746634487a1ecd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"load_tests \u003d testscenarios.load_tests_apply_scenarios"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class FlavorsListNegativeTestNewJSON(base.BaseV2ComputeTest,"},{"line_number":26,"context_line":"                                     test.NegativeAutoTest):"},{"line_number":27,"context_line":"    _interface \u003d \u0027json\u0027"},{"line_number":28,"context_line":"    _service \u003d \u0027compute\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F91Bs%3D","line":25,"in_reply_to":"AAAAUH%2F951s%3D","updated":"2014-02-03 15:38:07.000000000","message":"Not that I can see. Even if there were another FlavorsListNegativeTestJSON class in another file, the test_id includes the path so they wouldn\u0027t conflict (although the regexing would get more interesting to run one but not the other)","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"}],"tempest/api/compute/flavors/test_flavors_negative_new.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d486299bfbf6781a6a48dbc8359ffd9ca47064ca","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    {\"name\": \"list-flavors-with-detail\","},{"line_number":27,"context_line":"     \"http-method\": \"GET\","},{"line_number":28,"context_line":"     \"url\": \"flavors/detail\","},{"line_number":29,"context_line":"     \"json-schema\":"},{"line_number":30,"context_line":"        {\"type\": \"object\","},{"line_number":31,"context_line":"         \"properties\": {"},{"line_number":32,"context_line":"                        \"minRam\": {\"type\": \"integer\"},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2FuNc%3D","line":29,"updated":"2014-01-02 22:14:12.000000000","message":"Is this just a sample? Can you query the nova-api directly to get this? I know the glance api provides this functionality.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"8c35b9392c3450b4c34e639951228703c7db46f0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    {\"name\": \"list-flavors-with-detail\","},{"line_number":27,"context_line":"     \"http-method\": \"GET\","},{"line_number":28,"context_line":"     \"url\": \"flavors/detail\","},{"line_number":29,"context_line":"     \"json-schema\":"},{"line_number":30,"context_line":"        {\"type\": \"object\","},{"line_number":31,"context_line":"         \"properties\": {"},{"line_number":32,"context_line":"                        \"minRam\": {\"type\": \"integer\"},"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2Fqys%3D","line":29,"in_reply_to":"AAAAT3%2F%2FuNc%3D","updated":"2014-01-03 19:50:14.000000000","message":"So this is the big problem. I had already looked around and didn\u0027t find anything about a schema api except for glance. But this api is not documented well and appears to return a schema for what is in the image response data which is not what is needed here. There is some work going on around defining json schema for nova v3 api, here for example https://blueprints.launchpad.net/nova/+spec/nova-api-validation-fw. But this auto-generation needs more than a schema for the payload because it needs to know about query arguments for GET and also about resources mentioned in the query string. So we really need schema for the apis and it\u0027s hard to see how we can avoid that. On the other hand, having this info encoded in a machine-readable format would be useful for other reasons as well.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d486299bfbf6781a6a48dbc8359ffd9ca47064ca","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":57,"context_line":"    def test_list_flavors_with_detail(self):"},{"line_number":58,"context_line":"        self.generate_negative(list_flavors_with_detail, self.client)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":61,"context_line":"    def test_get_flavor_details(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2FuN4%3D","line":58,"updated":"2014-01-02 22:14:12.000000000","message":"I think it would be better to do this with testscenarios. You already have generator methods setup, it wouldn\u0027t take much tweaking. This way you won\u0027t need to have a separate test method for each schema. \n\nFYI, there is a review in progress using test-scenarios for the scenario tests:\n\nhttps://review.openstack.org/#/c/60434/","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"f8e86a4ef3048103b3c0db7e3dc8264a59f17483","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":57,"context_line":"    def test_list_flavors_with_detail(self):"},{"line_number":58,"context_line":"        self.generate_negative(list_flavors_with_detail, self.client)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":61,"context_line":"    def test_get_flavor_details(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F8WU%3D","line":58,"in_reply_to":"AAAAT3%2F%2Fqyg%3D","updated":"2014-01-06 13:18:11.000000000","message":"Yes I think testscenarios would make sense there. One other aspect of it: so far I see here a single test case would execute all negative tests available for this schema. Would it be might clearer if we really generate them as single cases (using testscenarios)?","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"8c35b9392c3450b4c34e639951228703c7db46f0","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":57,"context_line":"    def test_list_flavors_with_detail(self):"},{"line_number":58,"context_line":"        self.generate_negative(list_flavors_with_detail, self.client)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":61,"context_line":"    def test_get_flavor_details(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2Fqyg%3D","line":58,"in_reply_to":"AAAAT3%2F%2FuN4%3D","updated":"2014-01-03 19:50:14.000000000","message":"Yes, lifeless had a similar comment. I\u0027ll have to dig into that as I have not seen it before.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"}],"tempest/api/compute/flavors/test_flavors_negative_xml.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"b0cf4816cb212ed893134c898a24d0e45542329c","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.api.compute import base"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class FlavorsNegativeTestXML(base.BaseV2ComputeTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMgY%3D","line":20,"updated":"2014-01-29 07:03:22.000000000","message":"Could you import module like test_flavors_negative.py here?","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.api.compute import base"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class FlavorsNegativeTestXML(base.BaseV2ComputeTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLok%3D","line":20,"in_reply_to":"AAAAUH%2F%2BMF8%3D","updated":"2014-01-29 11:00:13.000000000","message":"+1","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"90734402eee76061e13878f53fe05e79de1bc8f0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.api.compute import base"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class FlavorsNegativeTestXML(base.BaseV2ComputeTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMF8%3D","line":20,"in_reply_to":"AAAAUH%2F%2BMdY%3D","updated":"2014-01-29 09:23:50.000000000","message":"Becasue hacking said: http://docs.openstack.org/developer/hacking/#imports\nAnd we have H302 rule but ignored now with tox.ini.\nmake sense?","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"0c41ba878fc660d018d3b2cd89ca30926b19ce32","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.api.compute import base"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class FlavorsNegativeTestXML(base.BaseV2ComputeTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMdY%3D","line":20,"in_reply_to":"AAAAUH%2F%2BMgY%3D","updated":"2014-01-29 07:13:00.000000000","message":"Sure but why?","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"b0cf4816cb212ed893134c898a24d0e45542329c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":44,"context_line":"    def test_non_existent_flavor_id(self):"},{"line_number":45,"context_line":"        # flavor details are not returned for non-existent flavors"},{"line_number":46,"context_line":"        nonexistent_flavor_id \u003d str(uuid.uuid4())"},{"line_number":47,"context_line":"        self.assertRaises(exceptions.NotFound, self.client.get_flavor_details,"},{"line_number":48,"context_line":"                          nonexistent_flavor_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMiE%3D","line":46,"updated":"2014-01-29 07:03:22.000000000","message":"We can use data_utils.rand_uuid() here.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"90734402eee76061e13878f53fe05e79de1bc8f0","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":44,"context_line":"    def test_non_existent_flavor_id(self):"},{"line_number":45,"context_line":"        # flavor details are not returned for non-existent flavors"},{"line_number":46,"context_line":"        nonexistent_flavor_id \u003d str(uuid.uuid4())"},{"line_number":47,"context_line":"        self.assertRaises(exceptions.NotFound, self.client.get_flavor_details,"},{"line_number":48,"context_line":"                          nonexistent_flavor_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMFs%3D","line":46,"in_reply_to":"AAAAUH%2F%2BMd4%3D","updated":"2014-01-29 09:23:50.000000000","message":"sure. you can ignore me here. just a nit.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"0c41ba878fc660d018d3b2cd89ca30926b19ce32","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":44,"context_line":"    def test_non_existent_flavor_id(self):"},{"line_number":45,"context_line":"        # flavor details are not returned for non-existent flavors"},{"line_number":46,"context_line":"        nonexistent_flavor_id \u003d str(uuid.uuid4())"},{"line_number":47,"context_line":"        self.assertRaises(exceptions.NotFound, self.client.get_flavor_details,"},{"line_number":48,"context_line":"                          nonexistent_flavor_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMd4%3D","line":46,"in_reply_to":"AAAAUH%2F%2BMiE%3D","updated":"2014-01-29 07:13:00.000000000","message":"This is the old existing negative test. I think this file will be removed very soon.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"}],"tempest/api/compute/servers/test_servers_negative_new.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"65f7713d64ca91f85229cd0e26a282d6ebfecd8a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FFbM%3D","line":3,"updated":"2014-01-17 16:39:59.000000000","message":"I think it\u0027s better to change from \u00272013\u0027 to \u00272014\u0027.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"}],"tempest/clients.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d486299bfbf6781a6a48dbc8359ffd9ca47064ca","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __init__(self, username\u003dNone, password\u003dNone, tenant_name\u003dNone,"},{"line_number":193,"context_line":"                 interface\u003d\u0027json\u0027, service\u003dNone):"},{"line_number":194,"context_line":"        \"\"\""},{"line_number":195,"context_line":"        We allow overriding of the credentials used within the various"},{"line_number":196,"context_line":"        client classes managed by the Manager object. Left as None, the"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2FuL0%3D","line":193,"updated":"2014-01-02 22:14:12.000000000","message":"What exactly is this being used for? I couldn\u0027t find it being used anywhere.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"8c35b9392c3450b4c34e639951228703c7db46f0","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __init__(self, username\u003dNone, password\u003dNone, tenant_name\u003dNone,"},{"line_number":193,"context_line":"                 interface\u003d\u0027json\u0027, service\u003dNone):"},{"line_number":194,"context_line":"        \"\"\""},{"line_number":195,"context_line":"        We allow overriding of the credentials used within the various"},{"line_number":196,"context_line":"        client classes managed by the Manager object. Left as None, the"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2FqxY%3D","line":193,"in_reply_to":"AAAAT3%2F%2FuL0%3D","updated":"2014-01-03 19:50:14.000000000","message":"It is used in the diff at the end of this method. The problem was that our per-service rest clients get the per-service base url by setting the service in the __init__method. But the negative framework doesn\u0027t need these per-service clients. The payload type (json,xml) is set statically in the test class so I did the same for the service.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6a3d21740a3437e8b3559d5495bc40a84237f048","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    \"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def __init__(self, username\u003dNone, password\u003dNone, tenant_name\u003dNone,"},{"line_number":195,"context_line":"                 interface\u003d\u0027json\u0027, service\u003dNone):"},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        We allow overriding of the credentials used within the various"},{"line_number":198,"context_line":"        client classes managed by the Manager object. Left as None, the"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FHhc%3D","line":195,"updated":"2014-01-17 15:12:08.000000000","message":"\"service\" is not really a property of the Manager object, putting this here is a way to pass the service through to NegativeRestClient, which does not see entirely proper.\n\nThe same in fact applies for \"interface\", it shouldn\u0027t really be a property of Manager.\n\nI\u0027m planning a bit of rework of the Manager object as part of the multi-auth bp work I\u0027m doing. The idea is to stop creating all clients at __init__ in the Manager, and expose instead a method like:\n\nget_client(self, service, api_version, type, interface\u003d\u0027json\u0027)\n\nAnd then in the test base classes:\n\nhypervisor_v3_client \u003d os.get_client(\u0027compute\u0027, \u0027v2\u0027, \u0027hypervisor\u0027, \u0027xml)\n\nAs this is very much likely to land before the multi-auth bp, I\u0027d say it\u0027s ok to have service added here temporarily, and removed later with the multi-auth bp.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"1c83f7e4e7d3b86ad1dd8fd6009cdc65911757b1","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    \"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def __init__(self, username\u003dNone, password\u003dNone, tenant_name\u003dNone,"},{"line_number":195,"context_line":"                 interface\u003d\u0027json\u0027, service\u003dNone):"},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        We allow overriding of the credentials used within the various"},{"line_number":198,"context_line":"        client classes managed by the Manager object. Left as None, the"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FFTg%3D","line":195,"in_reply_to":"AAAAUH%2F%2FHhc%3D","updated":"2014-01-17 16:09:47.000000000","message":"I wanted to minimize the change to existing code and ran into exactly the bug/issue you mention. Since it had already been done in this way for interfaces it seemed the easiest way forward was to add another small misuse and I agree with your conclusion.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"}],"tempest/common/generate_json.py":[{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"4f8483f2a80f8be3f24cc993e0fb1a42938ab626","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        del new_valid[r]"},{"line_number":118,"context_line":"        invalids.append(new_valid)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    if not schema.get(\"additionalProperties\", True):"},{"line_number":121,"context_line":"        new_valid \u003d copy.deepcopy(valid)"},{"line_number":122,"context_line":"        new_valid[\"$$$$$$$$$$\"] \u003d \"xxx\""},{"line_number":123,"context_line":"        invalids.append(new_valid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F8%2FM%3D","line":120,"updated":"2014-01-06 09:39:49.000000000","message":"Is this necessary? I cannot come up with any example.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"4ef068c64efacc577cf07e9858413af7127ea3f3","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        del new_valid[r]"},{"line_number":118,"context_line":"        invalids.append(new_valid)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    if not schema.get(\"additionalProperties\", True):"},{"line_number":121,"context_line":"        new_valid \u003d copy.deepcopy(valid)"},{"line_number":122,"context_line":"        new_valid[\"$$$$$$$$$$\"] \u003d \"xxx\""},{"line_number":123,"context_line":"        invalids.append(new_valid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F8PA%3D","line":120,"in_reply_to":"AAAAUH%2F%2F8%2FM%3D","updated":"2014-01-06 13:57:54.000000000","message":"This is to distinguish between apis that accept only a specific set of keys, and will fail if an unrecognized key is provided, vs those that will accept and ignore such keys.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"65f7713d64ca91f85229cd0e26a282d6ebfecd8a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright 2013 IBM Corp."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FFeE%3D","line":1,"updated":"2014-01-17 16:39:59.000000000","message":"I think it\u0027s better to remove the vim header for the new file.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"65f7713d64ca91f85229cd0e26a282d6ebfecd8a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright 2013 IBM Corp."},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FFcc%3D","line":4,"updated":"2014-01-17 16:39:59.000000000","message":"I think these copyright lines are invalid about the year and the organization.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    return invalids"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"type_map_valid \u003d {\"string\": generate_valid_string,"},{"line_number":209,"context_line":"                  \"integer\": generate_valid_integer,"},{"line_number":210,"context_line":"                  \"object\": generate_valid_object}"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLpA%3D","line":208,"updated":"2014-01-29 11:00:13.000000000","message":"Would be better to make it more human-readable, like in \u0027tempest/common/jsonschema-draft4.json\u0027","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                  \"integer\": generate_valid_integer,"},{"line_number":210,"context_line":"                  \"object\": generate_valid_object}"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"type_map_invalid \u003d {\"string\": [gen_int,"},{"line_number":213,"context_line":"                               gen_none,"},{"line_number":214,"context_line":"                               gen_str_min_length,"},{"line_number":215,"context_line":"                               gen_str_max_length],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLo8%3D","line":212,"updated":"2014-01-29 11:00:13.000000000","message":"ditto","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    return json.load(open(fn))"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"schema \u003d {\"type\": \"object\","},{"line_number":231,"context_line":"          \"properties\":"},{"line_number":232,"context_line":"          {\"name\": {\"type\": \"string\"},"},{"line_number":233,"context_line":"           \"http-method\": {\"enum\": [\"GET\", \"PUT\", \"HEAD\","}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLpY%3D","line":230,"updated":"2014-01-29 11:00:13.000000000","message":"ditto","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d2d82dc102564ce5155eeb137148f8c193fce982","unresolved":false,"context_lines":[{"line_number":225,"context_line":"           \"http-method\": {\"enum\": [\"GET\", \"PUT\", \"HEAD\","},{"line_number":226,"context_line":"                                    \"POST\", \"PATCH\", \"DELETE\", \u0027COPY\u0027]},"},{"line_number":227,"context_line":"           \"url\": {\"type\": \"string\"},"},{"line_number":228,"context_line":"           \"json-schema\": jsonschema._utils.load_schema(\"draft4\"),"},{"line_number":229,"context_line":"           \"resources\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}},"},{"line_number":230,"context_line":"           \"results\": {\"type\": \"object\","},{"line_number":231,"context_line":"                       \"properties\": {}}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F90M8%3D","line":228,"updated":"2014-02-03 18:51:49.000000000","message":"This should be good enough for now. But, something we probably want a better solution for in the future.","commit_id":"24eb89cd3efd9e9873c78aacde804870962ddcbb"}],"tempest/common/jsonschema-draft4.json":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2d2a3a7a5ed38c8de26780347d30528b0efc7e68","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"default\": {},"},{"line_number":4,"context_line":"    \"definitions\": {"}],"source_content_type":"application/json","patch_set":9,"id":"AAAAUH%2F93NU%3D","line":1,"updated":"2014-02-03 08:02:56.000000000","message":"This file is the same as schemas/draft4.json of jsonschema library.\nSo I feel it is better to use the original library code instead of copying it because of catching the original jsonschema changes.","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"e87c45060d282d4d0dde524a3adb823442ba7d8e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"default\": {},"},{"line_number":4,"context_line":"    \"definitions\": {"}],"source_content_type":"application/json","patch_set":9,"id":"AAAAUH%2F90f8%3D","line":1,"in_reply_to":"AAAAUH%2F90qk%3D","updated":"2014-02-03 16:42:16.000000000","message":"Ok, I saw your comments too late ;) Since the json format is nested inside of a json property I used jsonschema._utils.load_schema() in generate_json. I agree that we shoudn\u0027t duplicate the lib file.Draft4Validator.validate()  would be also a possibility.. but that would need extra code. Please let me know if my new patchset looks better for you.","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"9ad4bc843242b5ab17491547de1a9001c57d0752","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"default\": {},"},{"line_number":4,"context_line":"    \"definitions\": {"}],"source_content_type":"application/json","patch_set":9,"id":"AAAAUH%2F90qk%3D","line":1,"in_reply_to":"AAAAUH%2F90uQ%3D","updated":"2014-02-03 16:17:53.000000000","message":"If you\u0027re using it to validate the schema files before using them. Then In the code where you do that just call Draft4Validator.validate() instead of doing it manually. See:\n\nhttp://python-jsonschema.readthedocs.org/en/latest/validate/","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"8141a226d60d209760543ffdffa1d570cbb7f8c1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"default\": {},"},{"line_number":4,"context_line":"    \"definitions\": {"}],"source_content_type":"application/json","patch_set":9,"id":"AAAAUH%2F90uQ%3D","line":1,"in_reply_to":"AAAAUH%2F91EA%3D","updated":"2014-02-03 16:08:42.000000000","message":"I copied it for two reasons: \n\n1. I did not want to depend by reference on something with \"draft4\" in its name. \nWe only use this to validate the schemas we are adding to etc/... \n\n2. I was not sure of the correct way to access a file that is not a python module from a python library.","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d7b4df27d249d862b779201ace746634487a1ecd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"default\": {},"},{"line_number":4,"context_line":"    \"definitions\": {"}],"source_content_type":"application/json","patch_set":9,"id":"AAAAUH%2F91EA%3D","line":1,"in_reply_to":"AAAAUH%2F93NU%3D","updated":"2014-02-03 15:38:07.000000000","message":"I agree, we should avoid doing copy and paste from the upstream jsonschema library. We should just use the jsonschema library directly instead.","commit_id":"37819713c34dfe3bf1846ed0c63d6b3a1dd209d0"}],"tempest/common/rest_client.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"c8ff186a70eacf5bbae8f81d6dae3a23df899b05","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        return \u0027exceed\u0027 in resp_body.get(\u0027message\u0027, \u0027blabla\u0027)"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"class NegativeRestClientJSON(RestClient):"},{"line_number":579,"context_line":"    \"\"\""},{"line_number":580,"context_line":"    Version of RestClient that does not raise exceptions."},{"line_number":581,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FGms%3D","line":578,"updated":"2014-01-18 09:57:04.000000000","message":"Why does class contain \"JSON\" in the name? Current code isn\u0027t related to any container type.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"c8ff186a70eacf5bbae8f81d6dae3a23df899b05","unresolved":false,"context_lines":[{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    def send_request(self, method, url_template, resources, body\u003dNone):"},{"line_number":587,"context_line":"        url \u003d url_template % tuple(resources)"},{"line_number":588,"context_line":"        assert method in [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"HEAD\", \"DELETE\"]"},{"line_number":589,"context_line":"        if method \u003d\u003d \"GET\":"},{"line_number":590,"context_line":"            resp, body \u003d self.get(url)"},{"line_number":591,"context_line":"        elif method \u003d\u003d \"POST\":"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FGmQ%3D","line":588,"updated":"2014-01-18 09:57:04.000000000","message":"There is one more method - \u0027copy\u0027.","commit_id":"9a5f0f1ee7613703c381ac6e66ceaf6b6462fb11"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"b0cf4816cb212ed893134c898a24d0e45542329c","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMiY%3D","line":598,"updated":"2014-01-29 07:03:22.000000000","message":"How about\n\n else:\n     assert False\n?\nThis can avoid a duplication of method lists([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"HEAD\", \"DELETE\"]).","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"7a72bfbdf024e40845b8176d18bab3efab1188da","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9%2FDU%3D","line":598,"in_reply_to":"AAAAUH%2F%2BLqM%3D","updated":"2014-01-31 10:42:02.000000000","message":"Done","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLps%3D","line":598,"in_reply_to":"AAAAUH%2F%2BMds%3D","updated":"2014-01-29 11:00:13.000000000","message":"+1","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"90734402eee76061e13878f53fe05e79de1bc8f0","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMFI%3D","line":598,"in_reply_to":"AAAAUH%2F%2BMds%3D","updated":"2014-01-29 09:23:50.000000000","message":"Yeah, maybe, we can reduce such a mistake by avoiding the duplicate :)","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4e2d3e33f2b12191fdc9a076f6a6f9b43e527241","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLqM%3D","line":598,"in_reply_to":"AAAAUH%2F%2BMiY%3D","updated":"2014-01-29 11:00:13.000000000","message":"Or method body can be like next:\n\nurl \u003d url_template % tuple(resources)\nif method \u003d\u003d \"GET\":\n    return self.get(url)\nelif method \u003d\u003d \"POST\":\n    return self.post(url, body, self.headers)\nelif method \u003d\u003d \"PUT\":\n    return self.put(url, body, self.headers)\nelif method \u003d\u003d \"PATCH\":\n    return self.patch(url, body, self.headers)\nelif method \u003d\u003d \"HEAD\":\n    return self.head(url)\nelif method \u003d\u003d \"DELETE\":\n    return self.delete(url)\nassert False","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"0c41ba878fc660d018d3b2cd89ca30926b19ce32","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        elif method \u003d\u003d \"HEAD\":"},{"line_number":596,"context_line":"            resp, body \u003d self.head(url)"},{"line_number":597,"context_line":"        elif method \u003d\u003d \"DELETE\":"},{"line_number":598,"context_line":"            resp, body \u003d self.delete(url)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMds%3D","line":598,"in_reply_to":"AAAAUH%2F%2BMiY%3D","updated":"2014-01-29 07:13:00.000000000","message":"Yep, and again I missed the COPY method.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"}],"tempest/test.py":[{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"4f8483f2a80f8be3f24cc993e0fb1a42938ab626","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        new_url, body \u003d self._http_arguments(valid, url, method)"},{"line_number":362,"context_line":"        for i in range(len(resources)):"},{"line_number":363,"context_line":"            new_r \u003d resources[:]"},{"line_number":364,"context_line":"            new_r[i] \u003d \"invalid-resource-id\""},{"line_number":365,"context_line":"            resp, resp_body \u003d client.send_request(method, new_url,"},{"line_number":366,"context_line":"                                                  new_r, body\u003dbody)"},{"line_number":367,"context_line":"            self._check_negative_response(resp.status, resp_body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F9BA%3D","line":364,"updated":"2014-01-06 09:39:49.000000000","message":"Is above id generated automatically in future?","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"4ef068c64efacc577cf07e9858413af7127ea3f3","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        new_url, body \u003d self._http_arguments(valid, url, method)"},{"line_number":362,"context_line":"        for i in range(len(resources)):"},{"line_number":363,"context_line":"            new_r \u003d resources[:]"},{"line_number":364,"context_line":"            new_r[i] \u003d \"invalid-resource-id\""},{"line_number":365,"context_line":"            resp, resp_body \u003d client.send_request(method, new_url,"},{"line_number":366,"context_line":"                                                  new_r, body\u003dbody)"},{"line_number":367,"context_line":"            self._check_negative_response(resp.status, resp_body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F8OU%3D","line":364,"in_reply_to":"AAAAUH%2F%2F9BA%3D","updated":"2014-01-06 13:57:54.000000000","message":"This just needs an invalid id. I may be missing what you are getting at.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"4f8483f2a80f8be3f24cc993e0fb1a42938ab626","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        LOG.debug(\"dict: %s url: %s method: %s\" % (json_dict, url, method))"},{"line_number":379,"context_line":"        if not json_dict:"},{"line_number":380,"context_line":"            return url, None"},{"line_number":381,"context_line":"        elif method in [\"GET\", \"HEAD\"]:"},{"line_number":382,"context_line":"            return \"%s?%s\" % (url, urllib.urlencode(json_dict)), None"},{"line_number":383,"context_line":"        else:"},{"line_number":384,"context_line":"            return url, json_dict"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F9Gs%3D","line":381,"updated":"2014-01-06 09:39:49.000000000","message":"Now, as for Swift, url query parameters are used in a few of PUT or DELETE actions.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"4ef068c64efacc577cf07e9858413af7127ea3f3","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        LOG.debug(\"dict: %s url: %s method: %s\" % (json_dict, url, method))"},{"line_number":379,"context_line":"        if not json_dict:"},{"line_number":380,"context_line":"            return url, None"},{"line_number":381,"context_line":"        elif method in [\"GET\", \"HEAD\"]:"},{"line_number":382,"context_line":"            return \"%s?%s\" % (url, urllib.urlencode(json_dict)), None"},{"line_number":383,"context_line":"        else:"},{"line_number":384,"context_line":"            return url, json_dict"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F8OY%3D","line":381,"in_reply_to":"AAAAUH%2F%2F9Gs%3D","updated":"2014-01-06 13:57:54.000000000","message":"ok, I\u0027ll change that.","commit_id":"9681dc83a572326438ee41a84c6f7d9ee17b5edb"},{"author":{"_account_id":6983,"name":"YangLei","email":"iamhappg@aliyun.com","username":"YangLei"},"change_message_id":"d0eca83a686cfb03d953c5fbae64732ceba057df","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            valid \u003d None"},{"line_number":414,"context_line":"            schema \u003d description.get(\"json-schema\", None)"},{"line_number":415,"context_line":"            if schema:"},{"line_number":416,"context_line":"                valid \u003d generate_json.generate_valid(schema)"},{"line_number":417,"context_line":"            new_url, body \u003d self._http_arguments(valid, url, method)"},{"line_number":418,"context_line":"            resp, resp_body \u003d client.send_request(method, new_url,"},{"line_number":419,"context_line":"                                                  resources, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2FIWo%3D","line":416,"updated":"2014-01-17 06:50:12.000000000","message":"It seems as if we should call \"generate_invalid()\".\nlike line 383 said \n\" First it uses invalid resources that are part \nof the url ...\"","commit_id":"8c0b60952bbb9773d975db47f9a0c2907f25cb24"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"84d1f71ff009ce79b7fee5ea8400e3a5016be635","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            valid \u003d None"},{"line_number":414,"context_line":"            schema \u003d description.get(\"json-schema\", None)"},{"line_number":415,"context_line":"            if schema:"},{"line_number":416,"context_line":"                valid \u003d generate_json.generate_valid(schema)"},{"line_number":417,"context_line":"            new_url, body \u003d self._http_arguments(valid, url, method)"},{"line_number":418,"context_line":"            resp, resp_body \u003d client.send_request(method, new_url,"},{"line_number":419,"context_line":"                                                  resources, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2FH5I%3D","line":416,"in_reply_to":"AAAAUH%2F%2FIWo%3D","updated":"2014-01-17 07:48:08.000000000","message":"No because in the resources list there is one invalid resource (see get_resource) . I will add a comment to make it more obvious.","commit_id":"8c0b60952bbb9773d975db47f9a0c2907f25cb24"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"87a261d66c4f381e6a697dbfb42dab4afa7c1c54","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                                                          str(uuid.uuid4()))"},{"line_number":394,"context_line":"                                             }))"},{"line_number":395,"context_line":"        if not schema:"},{"line_number":396,"context_line":"            return scenario_list"},{"line_number":397,"context_line":"        for invalid in generate_json.generate_invalid(schema):"},{"line_number":398,"context_line":"            scenario_list.append((invalid[0], {\"schema\": invalid[1],"},{"line_number":399,"context_line":"                                               \"expected_result\": invalid[2]}))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BMTM%3D","line":396,"updated":"2014-01-29 12:40:17.000000000","message":"Perhaps you could do\n\nif schema is not None:\n  for invalid...\n\nand return only at the end of the method.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"7a72bfbdf024e40845b8176d18bab3efab1188da","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                                                          str(uuid.uuid4()))"},{"line_number":394,"context_line":"                                             }))"},{"line_number":395,"context_line":"        if not schema:"},{"line_number":396,"context_line":"            return scenario_list"},{"line_number":397,"context_line":"        for invalid in generate_json.generate_invalid(schema):"},{"line_number":398,"context_line":"            scenario_list.append((invalid[0], {\"schema\": invalid[1],"},{"line_number":399,"context_line":"                                               \"expected_result\": invalid[2]}))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9%2FEI%3D","line":396,"in_reply_to":"AAAAUH%2F%2BMTM%3D","updated":"2014-01-31 10:42:02.000000000","message":"Done","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"87a261d66c4f381e6a697dbfb42dab4afa7c1c54","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                     r in description.get(\"resources\", [])]"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        if hasattr(self, \"resource\"):"},{"line_number":435,"context_line":"            # Note(mkoderer): The resources list already contains an invalid"},{"line_number":436,"context_line":"            # entry (see get_resource)."},{"line_number":437,"context_line":"            # We just send a valid json-schema with it"},{"line_number":438,"context_line":"            valid \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BLWg%3D","line":435,"updated":"2014-01-29 12:40:17.000000000","message":"This resource attribute is the one set when scenarios are applied, right?","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"7a72bfbdf024e40845b8176d18bab3efab1188da","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                     r in description.get(\"resources\", [])]"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        if hasattr(self, \"resource\"):"},{"line_number":435,"context_line":"            # Note(mkoderer): The resources list already contains an invalid"},{"line_number":436,"context_line":"            # entry (see get_resource)."},{"line_number":437,"context_line":"            # We just send a valid json-schema with it"},{"line_number":438,"context_line":"            valid \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9%2FDY%3D","line":435,"in_reply_to":"AAAAUH%2F%2BLWg%3D","updated":"2014-01-31 10:42:02.000000000","message":"Yep, resource or schema depending on what part is faulty.","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"87a261d66c4f381e6a697dbfb42dab4afa7c1c54","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        cls._resources[name] \u003d resource"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def get_resource(self, name, use_ref\u003dTrue):"},{"line_number":485,"context_line":"        \"\"\""},{"line_number":486,"context_line":"        Return a valid uuid for a type of resource. If a real resource is"},{"line_number":487,"context_line":"        needed as part of a url then this method should return one. Otherwise"},{"line_number":488,"context_line":"        it can return None."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BL%2Bk%3D","line":485,"updated":"2014-01-29 12:40:17.000000000","message":"use_ref does not seems to be used at all?","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"7a72bfbdf024e40845b8176d18bab3efab1188da","unresolved":false,"context_lines":[{"line_number":482,"context_line":"        cls._resources[name] \u003d resource"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def get_resource(self, name, use_ref\u003dTrue):"},{"line_number":485,"context_line":"        \"\"\""},{"line_number":486,"context_line":"        Return a valid uuid for a type of resource. If a real resource is"},{"line_number":487,"context_line":"        needed as part of a url then this method should return one. Otherwise"},{"line_number":488,"context_line":"        it can return None."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F9%2FEA%3D","line":485,"in_reply_to":"AAAAUH%2F%2BL%2Bk%3D","updated":"2014-01-31 10:42:02.000000000","message":"Done","commit_id":"248ede3d78d5556b198c93e9f43a5b22f31a14fe"}]}
