)]}'
{"tempest/api/compute/admin/test_services.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"0d3b7ee00e3325738f76bad403c063e96a0727c6","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    _key_updated_at \u003d \u0027updated_at\u0027"},{"line_number":34,"context_line":"    _key_host \u003d \u0027host\u0027"},{"line_number":35,"context_line":"    _key_disabled_reason \u003d \u0027disabled_reason\u0027"},{"line_number":36,"context_line":"    _key_id \u003d \u0027id\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def setUpClass(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FPLc%3D","line":36,"updated":"2014-03-07 11:34:59.000000000","message":"So do you think we could instead have this defined through a dictionary etc. Something like:\n\n_expected_keys \u003d {\u0027status\u0027: \u0027status\u0027,\n                               \u0027binary\u0027: \u0027binary\u0027,\n                                ....\n                               }\n\nAlthough this looks like a duplicate, we need a mapping if we\u0027re going to share this between v2 and v3 where names may change.\n\nNow _verify_services_attributes could then be made very generic and common to a lot of tests (so a generic _verify_attributes). The flat case should be straightforward. Where there is a hierarchy its more complicated but I think still possible?\n\nActually its beginning to look more like a schema, but you\u0027ve probably got a better idea than me if going that far is worth it...","commit_id":"d9d7c6cd4905f625234c33ff3a2733c7cfb9883f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2fc839383d2190f71741622d1e155de080a193c6","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    _key_updated_at \u003d \u0027updated_at\u0027"},{"line_number":34,"context_line":"    _key_host \u003d \u0027host\u0027"},{"line_number":35,"context_line":"    _key_disabled_reason \u003d \u0027disabled_reason\u0027"},{"line_number":36,"context_line":"    _key_id \u003d \u0027id\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def setUpClass(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FPCg%3D","line":36,"in_reply_to":"AAAAVn%2F%2FPGI%3D","updated":"2014-03-07 12:09:58.000000000","message":"oops, sorry. I confused..\n\ns/against request body/against response body/","commit_id":"d9d7c6cd4905f625234c33ff3a2733c7cfb9883f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"166b6359012f478c3233288823c310640f56ca1d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    _key_updated_at \u003d \u0027updated_at\u0027"},{"line_number":34,"context_line":"    _key_host \u003d \u0027host\u0027"},{"line_number":35,"context_line":"    _key_disabled_reason \u003d \u0027disabled_reason\u0027"},{"line_number":36,"context_line":"    _key_id \u003d \u0027id\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def setUpClass(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FPGI%3D","line":36,"in_reply_to":"AAAAVn%2F%2FPLc%3D","updated":"2014-03-07 12:05:56.000000000","message":"Yes, that would be a great idea.\nI have gotten the similar idea from David mail: http://lists.openstack.org/pipermail/openstack-dev/2014-March/028920.html\n\nI feel the best way is to use JSONSchema validation against request body.\n\n\u003e Where there is a hierarchy its more complicated but I think still possible?\n\nWe would define response schema for v2 in v2 API test class and v3 test classes inherit from v2 classes. In v3 test class, we would change only differences(v2 - v3) on schema. As the result, we could confirm the differences.","commit_id":"d9d7c6cd4905f625234c33ff3a2733c7cfb9883f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cddf499900dd0c3426a7ccc914f99549a862fdd2","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":34,"context_line":"                \u0027state\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":35,"context_line":"                \u0027status\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":36,"context_line":"                \u0027updated_at\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":37,"context_line":"                \u0027disabled_reason\u0027: {\u0027type\u0027: [\u0027string\u0027, \u0027none\u0027]},"},{"line_number":38,"context_line":"            },"},{"line_number":39,"context_line":"            \u0027required\u0027: [\u0027binary\u0027, \u0027host\u0027, \u0027state\u0027, \u0027status\u0027, \u0027updated_at\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B8gQ%3D","line":36,"updated":"2014-03-11 05:15:09.000000000","message":"Donot we need to validate \"zone\" and \"id\" ?","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"ba6915cd02d223061db237fc727c2357b2700d7c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                \u0027host\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":34,"context_line":"                \u0027state\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":35,"context_line":"                \u0027status\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":36,"context_line":"                \u0027updated_at\u0027: {\u0027type\u0027: \u0027string\u0027},"},{"line_number":37,"context_line":"                \u0027disabled_reason\u0027: {\u0027type\u0027: [\u0027string\u0027, \u0027none\u0027]},"},{"line_number":38,"context_line":"            },"},{"line_number":39,"context_line":"            \u0027required\u0027: [\u0027binary\u0027, \u0027host\u0027, \u0027state\u0027, \u0027status\u0027, \u0027updated_at\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B7%2BY%3D","line":36,"in_reply_to":"AAAAVn%2F%2B8gQ%3D","updated":"2014-03-11 06:47:53.000000000","message":"Thanks, done.","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cddf499900dd0c3426a7ccc914f99549a862fdd2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    @attr(type\u003d\u0027gate\u0027)"},{"line_number":68,"context_line":"    def test_get_service_by_host_name(self):"},{"line_number":69,"context_line":"        resp, services \u003d self.client.list_services()"},{"line_number":70,"context_line":"        host_name \u003d services[0][\u0027host\u0027]"},{"line_number":71,"context_line":"        services_on_host \u003d [service for service in services if"},{"line_number":72,"context_line":"                            service[\u0027host\u0027] \u003d\u003d host_name]"},{"line_number":73,"context_line":"        params \u003d {\u0027host\u0027: host_name}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B8g0%3D","line":70,"updated":"2014-03-11 05:15:09.000000000","message":"response code needs to be checked.","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"ba6915cd02d223061db237fc727c2357b2700d7c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    @attr(type\u003d\u0027gate\u0027)"},{"line_number":68,"context_line":"    def test_get_service_by_host_name(self):"},{"line_number":69,"context_line":"        resp, services \u003d self.client.list_services()"},{"line_number":70,"context_line":"        host_name \u003d services[0][\u0027host\u0027]"},{"line_number":71,"context_line":"        services_on_host \u003d [service for service in services if"},{"line_number":72,"context_line":"                            service[\u0027host\u0027] \u003d\u003d host_name]"},{"line_number":73,"context_line":"        params \u003d {\u0027host\u0027: host_name}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B7%2BI%3D","line":70,"in_reply_to":"AAAAVn%2F%2B8g0%3D","updated":"2014-03-11 06:47:53.000000000","message":"done","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cddf499900dd0c3426a7ccc914f99549a862fdd2","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                            service[\u0027host\u0027] \u003d\u003d host_name]"},{"line_number":73,"context_line":"        params \u003d {\u0027host\u0027: host_name}"},{"line_number":74,"context_line":"        resp, services \u003d self.client.list_services(params)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # we could have a periodic job checkin between the 2 service"},{"line_number":77,"context_line":"        # lookups, so only compare binary lists."},{"line_number":78,"context_line":"        s1 \u003d map(lambda x: x[\u0027binary\u0027], services)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B8gw%3D","line":75,"updated":"2014-03-11 05:15:09.000000000","message":"response body can be validated here also.","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"ba6915cd02d223061db237fc727c2357b2700d7c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                            service[\u0027host\u0027] \u003d\u003d host_name]"},{"line_number":73,"context_line":"        params \u003d {\u0027host\u0027: host_name}"},{"line_number":74,"context_line":"        resp, services \u003d self.client.list_services(params)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # we could have a periodic job checkin between the 2 service"},{"line_number":77,"context_line":"        # lookups, so only compare binary lists."},{"line_number":78,"context_line":"        s1 \u003d map(lambda x: x[\u0027binary\u0027], services)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAVn%2F%2B7%2BE%3D","line":75,"in_reply_to":"AAAAVn%2F%2B8gw%3D","updated":"2014-03-11 06:47:53.000000000","message":"done","commit_id":"90fbba0baebe6e139042dfe86f205fe188cb36ba"}],"tempest/api/compute/api_schema/services.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"e037eb275c401d7db9433103e2e2ff7f8083cb2d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"list_services \u003d {"},{"line_number":16,"context_line":"    \u0027status_code\u0027: 200,"},{"line_number":17,"context_line":"    \u0027response_body\u0027: {"},{"line_number":18,"context_line":"        \u0027type\u0027: \u0027array\u0027,"},{"line_number":19,"context_line":"        \u0027items\u0027: {"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2B0NI%3D","line":16,"updated":"2014-03-12 00:52:26.000000000","message":"I\u0027m not sure but I think sometimes this might have to be a list of possible success codes? I can\u0027t think of an example off the top of my head though.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2e6c6d33989e92ea1ff78b8297cf7d8b56c8587f","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"list_services \u003d {"},{"line_number":16,"context_line":"    \u0027status_code\u0027: 200,"},{"line_number":17,"context_line":"    \u0027response_body\u0027: {"},{"line_number":18,"context_line":"        \u0027type\u0027: \u0027array\u0027,"},{"line_number":19,"context_line":"        \u0027items\u0027: {"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Bz60%3D","line":16,"in_reply_to":"AAAAVn%2F%2B0NI%3D","updated":"2014-03-12 01:18:12.000000000","message":"Good point, a list of possible success codes would be reasonable because http://api.openstack.org/api-ref-compute.html includes multiple \"Normal Response Codes\" on it.\n\nI will apply it into the next patch.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"e037eb275c401d7db9433103e2e2ff7f8083cb2d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        \u0027items\u0027: {"},{"line_number":20,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                # NOTE: New the type of \u0027id\u0027 is integer, but here allows"},{"line_number":23,"context_line":"                # \u0027string\u0027 also because we will be able to change it to"},{"line_number":24,"context_line":"                # \u0027uuid\u0027 in the future."},{"line_number":25,"context_line":"                \u0027id\u0027: {\u0027type\u0027: [\u0027integer\u0027, \u0027string\u0027]},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2B0NA%3D","line":22,"updated":"2014-03-12 00:52:26.000000000","message":"nit: \"New\" -\u003e \"Now\"","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2e6c6d33989e92ea1ff78b8297cf7d8b56c8587f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        \u0027items\u0027: {"},{"line_number":20,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                # NOTE: New the type of \u0027id\u0027 is integer, but here allows"},{"line_number":23,"context_line":"                # \u0027string\u0027 also because we will be able to change it to"},{"line_number":24,"context_line":"                # \u0027uuid\u0027 in the future."},{"line_number":25,"context_line":"                \u0027id\u0027: {\u0027type\u0027: [\u0027integer\u0027, \u0027string\u0027]},"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Bz6w%3D","line":22,"in_reply_to":"AAAAVn%2F%2B0NA%3D","updated":"2014-03-12 01:18:12.000000000","message":"oops, thanks.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"}],"tempest/api/compute/base.py":[{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"4d824502b33185b4db1d0967ae6321ac1f876e46","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            except jsonschema.ValidationError as ex:"},{"line_number":193,"context_line":"                msg \u003d (\"HTTP response body is invalid (%s)\") % ex"},{"line_number":194,"context_line":"                raise exceptions.InvalidHTTPResponseBody(msg)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def wait_for(self, condition):"},{"line_number":197,"context_line":"        \"\"\"Repeatedly calls condition() until a timeout.\"\"\""},{"line_number":198,"context_line":"        start_time \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2B0LQ%3D","line":195,"updated":"2014-03-12 00:20:34.000000000","message":"Should we explicitly handle the case when response_schema doesn\u0027t exist?\n\ni.e. if there is no response body, we should explicitly allow it to pass.  Otherwise raise an exception if there should be a response body to validate and one doesn\u0027t exist.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2e6c6d33989e92ea1ff78b8297cf7d8b56c8587f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            except jsonschema.ValidationError as ex:"},{"line_number":193,"context_line":"                msg \u003d (\"HTTP response body is invalid (%s)\") % ex"},{"line_number":194,"context_line":"                raise exceptions.InvalidHTTPResponseBody(msg)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def wait_for(self, condition):"},{"line_number":197,"context_line":"        \"\"\"Repeatedly calls condition() until a timeout.\"\"\""},{"line_number":198,"context_line":"        start_time \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Bz0Q%3D","line":195,"in_reply_to":"AAAAVn%2F%2B0KA%3D","updated":"2014-03-12 01:18:12.000000000","message":"Thanks Michael, Chris,\n\nI got it, maybe..\nI will apply it to the next patch.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"e037eb275c401d7db9433103e2e2ff7f8083cb2d","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            except jsonschema.ValidationError as ex:"},{"line_number":193,"context_line":"                msg \u003d (\"HTTP response body is invalid (%s)\") % ex"},{"line_number":194,"context_line":"                raise exceptions.InvalidHTTPResponseBody(msg)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def wait_for(self, condition):"},{"line_number":197,"context_line":"        \"\"\"Repeatedly calls condition() until a timeout.\"\"\""},{"line_number":198,"context_line":"        start_time \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2B0KA%3D","line":195,"in_reply_to":"AAAAVn%2F%2B0LQ%3D","updated":"2014-03-12 00:52:26.000000000","message":"I agree - I think we should validate_response even when no response body is expected and enforce that no response body is returned.\n\nAlso enforcing that the response_body parameter in the json schema always exists protects us from typos that would accidentally result in the response not being checked.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3fa9de9da44974f948b8438d1cb5a6ce654ee77a","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            except jsonschema.ValidationError as ex:"},{"line_number":193,"context_line":"                msg \u003d (\"HTTP response body is invalid (%s)\") % ex"},{"line_number":194,"context_line":"                raise exceptions.InvalidHTTPResponseBody(msg)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def wait_for(self, condition):"},{"line_number":197,"context_line":"        \"\"\"Repeatedly calls condition() until a timeout.\"\"\""},{"line_number":198,"context_line":"        start_time \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Bz%2F4%3D","line":195,"in_reply_to":"AAAAVn%2F%2B0LQ%3D","updated":"2014-03-12 00:47:11.000000000","message":"I am sorry if I misunderstand your comment.\n\n\u003e if there is no response body, we should explicitly allow it to pass.\n\nIf there is no response body, we should not define \u0027response_body\u0027 in the schema. If not defining \u0027response_body\u0027, the above validation passes because of line 189.","commit_id":"21fd3b8b47c07e0d6339fac7f1a05b45d050d653"}]}
