)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":16,"context_line":" - os-virtual-interfaces"},{"line_number":17,"context_line":" - os-volume-attachments"},{"line_number":18,"context_line":" - os-volumes"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I5b0ad25f7282f4a13bbb6f21b76e986e1008936a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a461143_564b76b0","line":19,"updated":"2017-02-02 16:10:08.000000000","message":"Links to the changes where these features were added (or code itself) might be helpful. I found these:\n\n - os-cells [1]\n - os-security-groups [2]\n - os-server-groups [3]\n - os-snapshots [4]\n - os-virtual-interfaces [5]\n - os-volume-attachments [6]\n - os-volumes [7]\n\n[1] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/cells.py#L102\n[2] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/security_groups.py#L170\n[3] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/server_groups.py#L127\n[4] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/volumes.py#L574\n[5] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/virtual_interfaces.py#L68\n[6] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/volumes.py#L486\n[7] https://github.com/openstack/nova/blob/d92e56a9/nova/api/openstack/compute/volumes.py#L152","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3a461143_b659fa90","line":21,"updated":"2017-02-02 16:10:08.000000000","message":"Is this related to a BP?","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"219fd8cedc10590e33afb8490eacd04e56e67352","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3a461143_8c786e91","line":21,"in_reply_to":"3a461143_b659fa90","updated":"2017-02-02 17:29:47.000000000","message":"Nope, no BP. I was given an RFE to implement paging for something, and when I looked at the existing code it already had paging (it just wasn\u0027t tested or documented), so I looked to see if that was true for other endpoints too. Anyhoo, that\u0027s what lead to these docs \u0026 tests.","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"}],"api-ref/source/os-cells.inc":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403),"},{"line_number":55,"context_line":"NotImplemented(501)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":".. TODO(cdent): need to figure out body stuff for request and response"}],"source_content_type":"text/x-c++src","patch_set":2,"id":"3a461143_5617f6ec","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":0},"updated":"2017-02-02 16:10:08.000000000","message":"unrelated change","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"219fd8cedc10590e33afb8490eacd04e56e67352","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403),"},{"line_number":55,"context_line":"NotImplemented(501)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":".. TODO(cdent): need to figure out body stuff for request and response"}],"source_content_type":"text/x-c++src","patch_set":2,"id":"3a461143_eccd7287","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":0},"in_reply_to":"3a461143_5617f6ec","updated":"2017-02-02 17:29:47.000000000","message":"Gah! I hate it when I make stupid mistakes like this. Thanks for catching it!","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"}],"nova/tests/unit/api/openstack/compute/test_cells.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_index_offset_and_limit(self):"},{"line_number":118,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/cells?offset\u003d1\u0026limit\u003d1\u0027)"},{"line_number":119,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_5c00f7aa","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":37},"updated":"2017-02-02 16:10:08.000000000","message":"why is this not _get_request?","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"59abbd14ab07e7d3d45e44d3243e584126a8502f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_index_offset_and_limit(self):"},{"line_number":118,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/cells?offset\u003d1\u0026limit\u003d1\u0027)"},{"line_number":119,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_bc82bbc6","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":37},"in_reply_to":"3a461143_5c00f7aa","updated":"2017-02-02 16:13:27.000000000","message":"Good question. 7 weeks later, I have no idea... :)\n\nPerhaps copy/pasta from another test. I\u0027ll take a look \u0026 respin.\n\nThanks!","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"219fd8cedc10590e33afb8490eacd04e56e67352","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_index_offset_and_limit(self):"},{"line_number":118,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/cells?offset\u003d1\u0026limit\u003d1\u0027)"},{"line_number":119,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_4c0046ab","line":118,"range":{"start_line":118,"start_character":14,"end_line":118,"end_character":37},"in_reply_to":"3a461143_bc82bbc6","updated":"2017-02-02 17:29:47.000000000","message":"Done, copy/pasta, thx!","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6e281c9ffc8b2e63f6ecd65a8e304aad9d9402d9","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_index_offset_and_limit(self):"},{"line_number":118,"context_line":"        req \u003d self._get_request(\u0027cells?offset\u003d1\u0026limit\u003d1\u0027)"},{"line_number":119,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_3507c21d","line":118,"range":{"start_line":118,"start_character":8,"end_line":118,"end_character":57},"updated":"2017-02-04 04:50:12.000000000","message":"can you add tests for limit 0 and check it return max items as per https://github.com/openstack/nova/blob/master/nova/api/openstack/common.py#L231","commit_id":"fdba403d09b6a21997d3f98f987638fde8cb4c39"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"dd6e5ef626f151c14ac9f8f568659936cd659728","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_index_offset_and_limit(self):"},{"line_number":118,"context_line":"        req \u003d self._get_request(\u0027cells?offset\u003d1\u0026limit\u003d1\u0027)"},{"line_number":119,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_380de537","line":118,"range":{"start_line":118,"start_character":8,"end_line":118,"end_character":57},"in_reply_to":"1a430d35_3507c21d","updated":"2017-02-06 00:50:05.000000000","message":"My goal with the tests in this patch is not comprehensive testing of the limit \u0026 offset implementation, but rather just to signal that these endpoints implement paging using limit \u0026 offset, in case that functionality accidentally gets omitted in a subsequent refactor (since it isn\u0027t document or tested).\n\nThat is, after this patch merges, if someone accidentally removes paging from these endpoints (by adding stricter query parameter schema validation for example), at least something will fail (unlike now).\n\nWe could certainly add more tests in the future, but I think these tests are good enough for this patch series.","commit_id":"fdba403d09b6a21997d3f98f987638fde8cb4c39"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6e281c9ffc8b2e63f6ecd65a8e304aad9d9402d9","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            self.assertNotIn(\u0027password\u0027, cell)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def test_detail_offset_and_limit(self):"},{"line_number":138,"context_line":"        req \u003d self._get_request(\"cells/detail?offset\u003d1\u0026limit\u003d1\")"},{"line_number":139,"context_line":"        res_dict \u003d self.controller.detail(req)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        self.assertEqual(len(res_dict[\u0027cells\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_55044e16","line":138,"range":{"start_line":138,"start_character":0,"end_line":138,"end_character":64},"updated":"2017-02-04 04:50:12.000000000","message":"ditto","commit_id":"fdba403d09b6a21997d3f98f987638fde8cb4c39"}],"nova/tests/unit/api/openstack/compute/test_neutron_security_groups.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        req \u003d fakes.HTTPRequest.blank(path)"},{"line_number":145,"context_line":"        list_dict \u003d self.controller.index(req)"},{"line_number":146,"context_line":"        self.assertEqual(len(list_dict[\u0027security_groups\u0027]), 1)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":149,"context_line":"        pass"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_5c1717ed","line":147,"updated":"2017-02-02 16:10:08.000000000","message":"You\u0027re not actually testing the \u0027offset\u0027 in any of these, right?","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":16907,"name":"Diana Clarke","email":"diana.joan.clarke@gmail.com","username":"diana-clarke"},"change_message_id":"219fd8cedc10590e33afb8490eacd04e56e67352","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        req \u003d fakes.HTTPRequest.blank(path)"},{"line_number":145,"context_line":"        list_dict \u003d self.controller.index(req)"},{"line_number":146,"context_line":"        self.assertEqual(len(list_dict[\u0027security_groups\u0027]), 1)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":149,"context_line":"        pass"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_ec25720a","line":147,"in_reply_to":"3a461143_5c1717ed","updated":"2017-02-02 17:29:47.000000000","message":"No, not really. My goal with the tests in this patch was to just signal that these endpoints implement paging using limit \u0026 offset, in case the functionality accidentally gets omitted in a subsequent refactor (since it isn\u0027t document or tested).\n\nThat is, after this patch merges, if someone accidentally removes paging from these endpoints, at least something will fail (unlike now). I\u0027m less concerned with comprehensive testing of the limit \u0026 offset implementation.","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c1df4cd985595f56378c293b8f4cda93f37e0541","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        req \u003d fakes.HTTPRequest.blank(path)"},{"line_number":145,"context_line":"        list_dict \u003d self.controller.index(req)"},{"line_number":146,"context_line":"        self.assertEqual(len(list_dict[\u0027security_groups\u0027]), 1)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_get_security_group_list_all_tenants(self):"},{"line_number":149,"context_line":"        pass"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_e2c9f95b","line":147,"in_reply_to":"3a461143_ec25720a","updated":"2017-02-02 17:48:13.000000000","message":"That sounds fair","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6e281c9ffc8b2e63f6ecd65a8e304aad9d9402d9","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        self.assertEqual(len(list_dict[\u0027security_groups\u0027]), 2)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def test_get_security_group_list_offset_and_limit(self):"},{"line_number":142,"context_line":"        path \u003d \u0027/v2/fake/os-security-groups?offset\u003d1\u0026limit\u003d1\u0027"},{"line_number":143,"context_line":"        self._create_sg_template().get(\u0027security_group\u0027)"},{"line_number":144,"context_line":"        req \u003d fakes.HTTPRequest.blank(path)"},{"line_number":145,"context_line":"        list_dict \u003d self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_70ff9801","line":142,"range":{"start_line":142,"start_character":0,"end_line":142,"end_character":61},"updated":"2017-02-04 04:50:12.000000000","message":"ditto and other files too.","commit_id":"fdba403d09b6a21997d3f98f987638fde8cb4c39"}],"nova/tests/unit/api/openstack/compute/test_security_groups.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden, self.controller.create,"},{"line_number":317,"context_line":"                          self.req, {\u0027security_group\u0027: sg})"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_get_security_group_list(self):"},{"line_number":320,"context_line":"        self._test_get_security_group_list()"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def test_get_security_group_list_offset_and_limit(self):"},{"line_number":323,"context_line":"        self._test_get_security_group_list(limited\u003dTrue)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def _test_get_security_group_list(self, limited\u003dFalse):"},{"line_number":326,"context_line":"        groups \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_3cf16bce","line":323,"range":{"start_line":319,"start_character":0,"end_line":323,"end_character":56},"updated":"2017-02-02 16:10:08.000000000","message":"nit: I\u0027d prefer to see these under the \u0027_test_...\u0027 definition, so we can see def before call","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"}],"nova/tests/unit/api/openstack/compute/test_snapshots.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a6725eb5d960a2f33999fa5d217d71070419b2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                self.req, \u0027-1\u0027)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def test_snapshot_detail(self):"},{"line_number":109,"context_line":"        resp_dict \u003d self.controller.detail(self.req)"},{"line_number":110,"context_line":"        self.assertIn(\u0027snapshots\u0027, resp_dict)"},{"line_number":111,"context_line":"        resp_snapshots \u003d resp_dict[\u0027snapshots\u0027]"},{"line_number":112,"context_line":"        self.assertEqual(3, len(resp_snapshots))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_5c73974d","line":109,"range":{"start_line":109,"start_character":43,"end_line":109,"end_character":51},"updated":"2017-02-02 16:10:08.000000000","message":"nit: IMO this shouldn\u0027t be an object variable now that it\u0027s not used in every test. Perhaps a cleanup item?","commit_id":"c6f82829775ce2fa177430289864c65daeb9ca5c"}]}
