)]}'
{"doc/source/http-api.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"660730ef10bb1c9a0620d08408c752c8cd7363dc","unresolved":false,"context_lines":[{"line_number":60,"context_line":"``GET /v1/introspection`` get all hardware introspection statuses."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Requires X-Auth-Token header with Keystone token for authentication."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Response:"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* 200 - OK"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3ac371cc_b3730d4d","line":63,"updated":"2016-08-15 09:53:41.000000000","message":"Please document the \"finished\" parameter.\n\nAlso the list to return by default can be quite big, so we need pagination. This can go to a separate patch, but we at least need a \"limit\" parameter with some reasonable default (say, 50). See e.g. how it\u0027s done for nodes in Ironic: http://developer.openstack.org/api-ref/baremetal/index.html?expanded\u003dlist-nodes-detail#list-nodes. The marker parameter can be implemeted separately, if you feel like.","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":60,"context_line":"``GET /v1/introspection`` get all hardware introspection statuses."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Requires X-Auth-Token header with Keystone token for authentication."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Response:"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* 200 - OK"}],"source_content_type":"text/x-rst","patch_set":14,"id":"7a8ec9b2_379415e1","line":63,"in_reply_to":"3ac371cc_b3730d4d","updated":"2016-09-15 16:02:21.000000000","message":"Done","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f9269329192ac8ed3aaf64d5b2436267e4f0b0de","unresolved":false,"context_lines":[{"line_number":60,"context_line":"``GET /v1/introspection`` get all hardware introspection statuses."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Requires X-Auth-Token header with Keystone token for authentication."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Response:"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* 200 - OK"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3ac371cc_560f27e1","line":63,"in_reply_to":"3ac371cc_b3730d4d","updated":"2016-08-15 10:23:43.000000000","message":"big +1 on limit","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"fb260297ad75ee90e4a0f7d02464c2da86be9b8c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"Returned status list is sorted by the ``started_at, uuid`` attribute pair,"},{"line_number":65,"context_line":"newer items first, and is paginated with these query parameters:"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* ``marker`` the UUID of the last node returned previously"},{"line_number":68,"context_line":"* ``limit`` default, max: ``CONF.api.max_limit``"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Response:"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1a95cdbc_245ab42a","line":67,"updated":"2016-10-07 14:51:34.000000000","message":"That implies we\u0027ll need a subquery for subsequent pages, right? \"select * from nodes where started_at \u003c (select started_at from nodes where uuid \u003d ?)\"\n\nEdit: or two queries.","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"ab3e301f079b0380294d71b594f08b3386c35dda","unresolved":false,"context_lines":[{"line_number":64,"context_line":"Returned status list is sorted by the ``started_at, uuid`` attribute pair,"},{"line_number":65,"context_line":"newer items first, and is paginated with these query parameters:"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* ``marker`` the UUID of the last node returned previously"},{"line_number":68,"context_line":"* ``limit`` default, max: ``CONF.api.max_limit``"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Response:"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1a95cdbc_31daefe8","line":67,"in_reply_to":"1a95cdbc_245ab42a","updated":"2016-10-07 15:44:59.000000000","message":"Honestly, I\u0027m just relying on https://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/utils.py#L136 here O:-)","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"1c2f6884ed53ad465b7e855acf695db8fe28ece0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"Returned status list is sorted by the ``started_at, uuid`` attribute pair,"},{"line_number":65,"context_line":"newer items first, and is paginated with these query parameters:"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* ``marker`` the UUID of the last node returned previously"},{"line_number":68,"context_line":"* ``limit`` default, max: ``CONF.api.max_limit``"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Response:"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1a95cdbc_67b3a698","line":67,"in_reply_to":"1a95cdbc_31daefe8","updated":"2016-10-10 11:11:05.000000000","message":"Ah, OK: I\u0027ve previously mostly encountered pagination APIs which require you to specify \"20 results starting from result number 121\". That only requires one SQL query per page, but I guess there\u0027s a race condition in there.","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"  case introspection was aborted"},{"line_number":83,"context_line":"* ``uuid`` node UUID"},{"line_number":84,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":85,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":25,"id":"fa6399be_b9f7fb89","line":85,"updated":"2016-10-13 10:46:49.000000000","message":"We don\u0027t return finished_at and started_at from get status request, so we should either update it or remove them from here. Ditto for UUID, so I think we should update get status API :)","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"9c1826c41252db8e6cafad85d1f5206418ae4750","unresolved":false,"context_lines":[{"line_number":82,"context_line":"  case introspection was aborted"},{"line_number":83,"context_line":"* ``uuid`` node UUID"},{"line_number":84,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":85,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":25,"id":"fa6399be_e9d40f21","line":85,"in_reply_to":"fa6399be_a46c15d1","updated":"2016-10-14 09:13:11.000000000","message":"To make it clear: you\u0027re suggesting to technically -2 this patch and post another one that broadens the GET@/v1/introspection/\u003cUUID\u003e return value, correct?","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d965705f6b48641487fad793ccd379540734ab9f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"  case introspection was aborted"},{"line_number":83,"context_line":"* ``uuid`` node UUID"},{"line_number":84,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":85,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":25,"id":"fa6399be_c57919ca","line":85,"in_reply_to":"fa6399be_b9f7fb89","updated":"2016-10-13 18:54:47.000000000","message":"I\u0027d rather avoid changing the GET endpoint here as the patch will grow. Let\u0027s do it a follow-up patch instead?","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4bb117058a42244a6a100b3d44023f04251f2ef0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"  case introspection was aborted"},{"line_number":83,"context_line":"* ``uuid`` node UUID"},{"line_number":84,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":85,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":25,"id":"fa6399be_a46c15d1","line":85,"in_reply_to":"fa6399be_c57919ca","updated":"2016-10-13 19:03:26.000000000","message":"Yes, assuming that you remove uuid, started_at and finished_at from here, which does not sound practical. A better idea is probably to *start* with a patch extending the representation with uuid, started_at, finished_at.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1638a066072a7d5837148a2ac9cf9e12325991a9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"  case introspection was aborted"},{"line_number":83,"context_line":"* ``uuid`` node UUID"},{"line_number":84,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":85,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":25,"id":"fa6399be_c9010b08","line":85,"in_reply_to":"fa6399be_e9d40f21","updated":"2016-10-14 09:17:15.000000000","message":"No need for -2, just rebase this patch on top of that new one. Otherwise you\u0027re right.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"  case introspection was aborted"},{"line_number":98,"context_line":"* ``uuid`` node UUID"},{"line_number":99,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":100,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":31,"id":"9a629dbe_7b2a8e91","line":100,"updated":"2016-11-10 13:00:43.000000000","message":"and links","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":97,"context_line":"  case introspection was aborted"},{"line_number":98,"context_line":"* ``uuid`` node UUID"},{"line_number":99,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":100,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Abort Running Introspection"}],"source_content_type":"text/x-rst","patch_set":31,"id":"9a629dbe_d10b5f22","line":100,"in_reply_to":"9a629dbe_7b2a8e91","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"Requires X-Auth-Token header with Keystone token for authentication."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Returned status list is sorted by the ``started_at, uuid`` attribute pair,"},{"line_number":69,"context_line":"newer items first, and is paginated with these query string fields:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* ``marker`` the UUID of the last node returned previously"},{"line_number":72,"context_line":"* ``limit`` default, max: ``CONF.api_max_limit``"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7a77a97e_1993d2fb","line":69,"updated":"2016-11-22 10:04:17.000000000","message":"nit: I\u0027m not sure why it was changed from parameters to \"string fields\", \"parameters\" or \"arguments\" in the correct wording","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b238f582bb62449b15807c83b172396bbea96cbb","unresolved":false,"context_lines":[{"line_number":66,"context_line":"Requires X-Auth-Token header with Keystone token for authentication."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Returned status list is sorted by the ``started_at, uuid`` attribute pair,"},{"line_number":69,"context_line":"newer items first, and is paginated with these query string fields:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* ``marker`` the UUID of the last node returned previously"},{"line_number":72,"context_line":"* ``limit`` default, max: ``CONF.api_max_limit``"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7a77a97e_0fcd2fb7","line":69,"in_reply_to":"7a77a97e_1993d2fb","updated":"2016-11-22 15:33:56.000000000","message":"wikipedia uses query string fields[1] since this is api description I thought we better avoid using names from the platform\n\n[1] https://en.wikipedia.org/wiki/Query_string#Web_forms","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"* ``uuid`` node UUID"},{"line_number":100,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":101,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Abort Running Introspection"},{"line_number":105,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7a77a97e_39908eec","line":102,"updated":"2016-11-22 10:04:17.000000000","message":"and \"links\"","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b238f582bb62449b15807c83b172396bbea96cbb","unresolved":false,"context_lines":[{"line_number":99,"context_line":"* ``uuid`` node UUID"},{"line_number":100,"context_line":"* ``started_at`` an UTC ISO8601 timestamp"},{"line_number":101,"context_line":"* ``finished_at`` an UTC ISO8601 timestamp or ``null``"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Abort Running Introspection"},{"line_number":105,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7a77a97e_af119bb1","line":102,"in_reply_to":"7a77a97e_39908eec","updated":"2016-11-22 15:33:56.000000000","message":"yeah... will fix in case of another revision","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"}],"ironic_inspector/api_tools.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"fb260297ad75ee90e4a0f7d02464c2da86be9b8c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":2,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":3,"context_line":"# You may obtain a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_84746836","line":1,"updated":"2016-10-07 14:51:34.000000000","message":"This all looks *very* generic: can it be imported from somewhere?","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"1c2f6884ed53ad465b7e855acf695db8fe28ece0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":2,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":3,"context_line":"# You may obtain a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_47ea2a75","line":1,"in_reply_to":"1a95cdbc_71a55745","updated":"2016-10-10 11:11:05.000000000","message":"I just had a look, and there doesn\u0027t seem to be a standard pagination extension for Flask :-( Or rather, there\u0027s flask-paginate, but it seems to mostly handle rendering page indices as HTML.","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"ab3e301f079b0380294d71b594f08b3386c35dda","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":2,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":3,"context_line":"# You may obtain a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_71a55745","line":1,"in_reply_to":"1a95cdbc_84746836","updated":"2016-10-07 15:44:59.000000000","message":"Yeah, maybe, links please. I used to have it in main.py but aarefiev suggested bumping it to a separate module (better for testing too)","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"af31506cb428fc7d33711d90d6655a59b5238291","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":"\"\"\"Generic Rest Api tools.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import flask"},{"line_number":17,"context_line":"import pytz"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_utils import uuidutils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from ironic_inspector.common.i18n import _"},{"line_number":23,"context_line":"from ironic_inspector import utils"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_cc91889b","line":20,"range":{"start_line":15,"start_character":0,"end_line":20,"end_character":32},"updated":"2016-10-12 09:00:44.000000000","message":"wrong order\n\nstdlib imports\n\nthird-party lib imports\n\nproject imports","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"1e9bd6206e8ecebb38e913ef74e88697c7fe6d69","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":"\"\"\"Generic Rest Api tools.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import flask"},{"line_number":17,"context_line":"import pytz"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_utils import uuidutils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from ironic_inspector.common.i18n import _"},{"line_number":23,"context_line":"from ironic_inspector import utils"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_dd35b4da","line":20,"range":{"start_line":15,"start_character":0,"end_line":20,"end_character":32},"in_reply_to":"fa6399be_cc91889b","updated":"2016-10-12 09:54:37.000000000","message":"Done","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def request_query(query_name, default\u003dNone, coerce\u003dlambda x: x,"},{"line_number":29,"context_line":"                  assertion\u003dlambda x: None):"},{"line_number":30,"context_line":"    \"\"\"Fetch specified query from flask.request.args."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    Intended use case:"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_994157ac","line":29,"updated":"2016-10-13 10:46:49.000000000","message":"I find calling it \"query\" quite confusing, let\u0027s call it \"argument\" or \"parameter\"","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    :param coerce: a function to coerce the query value with, should raise"},{"line_number":49,"context_line":"                   a ValueError in case coercion failed"},{"line_number":50,"context_line":"    :param assertion: a function to assert the coerced value of the query,"},{"line_number":51,"context_line":"                      should raise an AssertionError in case assertion failed"},{"line_number":52,"context_line":"    :raises: utils.Error in case coercion or assertion failed"},{"line_number":53,"context_line":"    :returns: (query_name, value)"},{"line_number":54,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_b93e1b26","line":51,"updated":"2016-10-13 10:46:49.000000000","message":"this can be easily rolled into coerce, so I\u0027m not sure we really need it","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    except ValueError as exc:"},{"line_number":63,"context_line":"        raise utils.Error(_(\u0027Invalid query value: %(name)s\u003d%(value)s \u0027"},{"line_number":64,"context_line":"                            \u0027(%(exc)s)\u0027) % dict(name\u003dquery_name,"},{"line_number":65,"context_line":"                                                value\u003dquery, exc\u003dexc),"},{"line_number":66,"context_line":"                          code\u003d400)"},{"line_number":67,"context_line":"    try:"},{"line_number":68,"context_line":"        assertion(query)"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_d9474fba","line":65,"updated":"2016-10-13 10:46:49.000000000","message":"nit: we tend to use {} syntax for dicts","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    return request_query(\u0027limit\u0027, default,"},{"line_number":99,"context_line":"                         # limit of zero means default limit"},{"line_number":100,"context_line":"                         lambda limit: min(int(limit), default) or default,"},{"line_number":101,"context_line":"                         assertion)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def iso_timestamp(timestamp\u003dNone, tz\u003dpytz.timezone(\u0027utc\u0027)):"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_f94413b8","line":101,"updated":"2016-10-13 10:46:49.000000000","message":"now I\u0027m pretty sure we should merge \"coerce\" and \"assertion\", the split here is confusing","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def query_coercion(fn):"},{"line_number":27,"context_line":"    \"\"\"Convert coercion function exceptions to utils.Error."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    :raises: utils.Error when the coercion function raises an"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_9b32020f","line":26,"updated":"2016-11-10 13:00:43.000000000","message":"let\u0027s call it coerce_exceptions maybe? or even convert_exception for simplicity. this name is quite confusing as it does not coerce and queries :)","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d cfg.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def query_coercion(fn):"},{"line_number":27,"context_line":"    \"\"\"Convert coercion function exceptions to utils.Error."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    :raises: utils.Error when the coercion function raises an"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_2e819a8f","line":26,"in_reply_to":"9a629dbe_9b32020f","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def inner(*args, **kwargs):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %s\u0027) % exc,"},{"line_number":38,"context_line":"                              code\u003d400)"},{"line_number":39,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_bb37c6fd","line":36,"updated":"2016-11-10 13:00:43.000000000","message":"you\u0027re not raising ValueError here, right? So I guess it can be removed","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def inner(*args, **kwargs):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %s\u0027) % exc,"},{"line_number":38,"context_line":"                              code\u003d400)"},{"line_number":39,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_4ebfaea9","line":36,"in_reply_to":"9a629dbe_bb37c6fd","updated":"2016-11-11 10:50:41.000000000","message":"Some type coercions raise ValueError (such as on line 81), I\u0027d prefer to keep it.","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %s\u0027) % exc,"},{"line_number":38,"context_line":"                              code\u003d400)"},{"line_number":39,"context_line":"        return ret"},{"line_number":40,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_db38faf0","line":37,"updated":"2016-11-10 13:00:43.000000000","message":"let\u0027s use more standard terminology:\n\n \"Bad request: %s\"\n\nyour assertion errors already contain enough details","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %s\u0027) % exc,"},{"line_number":38,"context_line":"                              code\u003d400)"},{"line_number":39,"context_line":"        return ret"},{"line_number":40,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_4ee08e96","line":37,"in_reply_to":"9a629dbe_db38faf0","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"def request_query(query_name, default\u003dNone):"},{"line_number":44,"context_line":"    \"\"\"Decorate a function that coerces the specified query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    :param query_name: name of the query to fetch"},{"line_number":47,"context_line":"    :param default: default value in case the query not found"},{"line_number":48,"context_line":"    :returns: the query value"},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_fb3dbedd","line":46,"updated":"2016-11-10 13:00:43.000000000","message":"please replace all mentions of \"query\" with \"parameter\" or \"argument\" here and preferably everywhere. I only see common use of \"query\" in \"HTTP query string\", but what you call query in this file is usually referred to differently (e.g. args in case of flask).","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":43,"context_line":"def request_query(query_name, default\u003dNone):"},{"line_number":44,"context_line":"    \"\"\"Decorate a function that coerces the specified query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    :param query_name: name of the query to fetch"},{"line_number":47,"context_line":"    :param default: default value in case the query not found"},{"line_number":48,"context_line":"    :returns: the query value"},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_adea0272","line":46,"in_reply_to":"9a629dbe_fb3dbedd","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        def inner(*args, **kwargs):"},{"line_number":53,"context_line":"            query \u003d flask.request.args.get(query_name, default\u003ddefault)"},{"line_number":54,"context_line":"            if query \u003d\u003d default:"},{"line_number":55,"context_line":"                # query not found, just return the default"},{"line_number":56,"context_line":"                return default"},{"line_number":57,"context_line":"            return fn(query, *args, **kwargs)"},{"line_number":58,"context_line":"        return inner"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_1b27d2ca","line":55,"updated":"2016-11-10 13:00:43.000000000","message":"how does it work when explicitly provided value \u003d\u003d default?","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        def inner(*args, **kwargs):"},{"line_number":53,"context_line":"            query \u003d flask.request.args.get(query_name, default\u003ddefault)"},{"line_number":54,"context_line":"            if query \u003d\u003d default:"},{"line_number":55,"context_line":"                # query not found, just return the default"},{"line_number":56,"context_line":"                return default"},{"line_number":57,"context_line":"            return fn(query, *args, **kwargs)"},{"line_number":58,"context_line":"        return inner"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_4e716e43","line":55,"in_reply_to":"9a629dbe_1b27d2ca","updated":"2016-11-11 10:50:41.000000000","message":"I\u0027m sorry I might not follow the question.\nIf value \u003d\u003d default no coercion/value checking is needed, so it\u0027s just returned. Maybe I should fix the comment.","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f19c5da17a1df1aa47ee77b4ff7cd390bbe338d7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return value"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"@request_field(\u0027limit\u0027, default\u003dCONF.api_max_limit)"},{"line_number":73,"context_line":"@raises_coercion_exceptions"},{"line_number":74,"context_line":"def limit_field(value):"},{"line_number":75,"context_line":"    \"\"\"Fetch the pagination limit field from flask.request.args."}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_7692f7a0","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":50},"updated":"2016-11-16 12:10:51.000000000","message":"looks like changing conf doesn\u0027t have effect, right?","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"144f1424dee4d5ba2dcb257f1b6edfe17e1756e4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return value"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"@request_field(\u0027limit\u0027, default\u003dCONF.api_max_limit)"},{"line_number":73,"context_line":"@raises_coercion_exceptions"},{"line_number":74,"context_line":"def limit_field(value):"},{"line_number":75,"context_line":"    \"\"\"Fetch the pagination limit field from flask.request.args."}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_ac519eda","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":50},"in_reply_to":"7a77a97e_7692f7a0","updated":"2016-11-16 14:15:19.000000000","message":"yeah, correct :-/ the same decorator thing again","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"ce00feb199f0e7a37a9727ecf0a790b3d17bbd83","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return value"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"@request_field(\u0027limit\u0027, default\u003dCONF.api_max_limit)"},{"line_number":73,"context_line":"@raises_coercion_exceptions"},{"line_number":74,"context_line":"def limit_field(value):"},{"line_number":75,"context_line":"    \"\"\"Fetch the pagination limit field from flask.request.args."}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_f06436e6","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":50},"in_reply_to":"7a77a97e_ac519eda","updated":"2016-11-16 17:45:06.000000000","message":"Done","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f19c5da17a1df1aa47ee77b4ff7cd390bbe338d7","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    # limit of zero means the default limit"},{"line_number":80,"context_line":"    value \u003d int(value) or CONF.api_max_limit"},{"line_number":81,"context_line":"    assert value \u003e\u003d 0, _(\u0027Limit cannot be negative\u0027)"},{"line_number":82,"context_line":"    assert value \u003c\u003d CONF.api_max_limit, _(\u0027Limit over %s\u0027) % CONF.api_max_limit"},{"line_number":83,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_69ca1870","line":82,"range":{"start_line":82,"start_character":11,"end_line":82,"end_character":38},"updated":"2016-11-16 12:10:51.000000000","message":"Again, just to be sure, we fails in case provided limit \u003e CONF.api_max_limit, and not fall back to CONF.api_max_limit.\n\nI\u0027m pretty sure some openstack services use last behavior.","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"144f1424dee4d5ba2dcb257f1b6edfe17e1756e4","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    # limit of zero means the default limit"},{"line_number":80,"context_line":"    value \u003d int(value) or CONF.api_max_limit"},{"line_number":81,"context_line":"    assert value \u003e\u003d 0, _(\u0027Limit cannot be negative\u0027)"},{"line_number":82,"context_line":"    assert value \u003c\u003d CONF.api_max_limit, _(\u0027Limit over %s\u0027) % CONF.api_max_limit"},{"line_number":83,"context_line":"    return value"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_c8831f03","line":82,"range":{"start_line":82,"start_character":11,"end_line":82,"end_character":38},"in_reply_to":"7a77a97e_69ca1870","updated":"2016-11-16 14:15:19.000000000","message":"Please, see the discussion we had in rev. 25; this is to follow api-wg recommendation (was changed in rev. 29).\n\n[1] https://review.openstack.org/#/c/344921/25/ironic_inspector/conf.py@28","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def inner(*args, **kwargs):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Bad request: %s\u0027) % exc, code\u003d400)"},{"line_number":38,"context_line":"        return ret"},{"line_number":39,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a77a97e_d9887ac9","line":36,"updated":"2016-11-22 10:04:17.000000000","message":"nit: we don\u0027t seem to use ValueError","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b238f582bb62449b15807c83b172396bbea96cbb","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def inner(*args, **kwargs):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            ret \u003d fn(*args, **kwargs)"},{"line_number":36,"context_line":"        except (AssertionError, ValueError) as exc:"},{"line_number":37,"context_line":"            raise utils.Error(_(\u0027Bad request: %s\u0027) % exc, code\u003d400)"},{"line_number":38,"context_line":"        return ret"},{"line_number":39,"context_line":"    return inner"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a77a97e_8ff77f58","line":36,"in_reply_to":"7a77a97e_d9887ac9","updated":"2016-11-22 15:33:56.000000000","message":"line #80 int(value) raises a ValueError if unable to coerce","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"}],"ironic_inspector/conf.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_59333f62","line":29,"updated":"2016-10-13 10:46:49.000000000","message":"the way you\u0027ve coded it, it\u0027s the default_limit, not max_limit. however, I do think we should have a max_limit to avoid users DoS\u0027ing the API service","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"3b99ab4388144241cc602afe7c9263aea8751b2b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_a8c39937","line":29,"in_reply_to":"fa6399be_11d3ecd5","updated":"2016-10-17 19:32:58.000000000","message":":) what should be the conclusion then?","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"cde64f2a1e51358737c1820dcf21915144c00103","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_11d3ecd5","line":29,"in_reply_to":"fa6399be_2b3ddfc3","updated":"2016-10-17 10:43:06.000000000","message":"Yeah, it\u0027s subjective","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"473a5a673943038a2423e3cd7403c7e41b59d55a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_e56316af","line":29,"in_reply_to":"fa6399be_3b0c8e3a","updated":"2016-10-17 09:10:48.000000000","message":"I think there is no needs in 2 options here, it confusing imo.\n \nthe term \u0027max\u0027 sounds semantically more right, because by default we will return the number of introspection statutes we have in db, limited by this new option. Also it looks like more consistency with other projects.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d965705f6b48641487fad793ccd379540734ab9f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_6a0adc7a","line":29,"in_reply_to":"fa6399be_59333f62","updated":"2016-10-13 18:54:47.000000000","message":"Sorry but I\u0027m not sure what are you suggesting here, could you please elaborate?\nPlease, mind also Anton\u0027s concern[1].\n\n[1]https://review.openstack.org/#/c/344921/19/ironic_inspector/main.py@268","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4bb117058a42244a6a100b3d44023f04251f2ef0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_e4744d69","line":29,"in_reply_to":"fa6399be_6a0adc7a","updated":"2016-10-13 19:03:26.000000000","message":"Max limit should be, well, max. I don\u0027t agree with the idea of making the word \"max\" mean \"default\" :) We should either rename this variable, or make it enforce the maximum value. I\u0027m slightly biased towards the latter, but I see that Anton does not agree with that.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1638a066072a7d5837148a2ac9cf9e12325991a9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_3b0c8e3a","line":29,"in_reply_to":"fa6399be_8953936a","updated":"2016-10-14 09:17:15.000000000","message":"I\u0027m fine with that.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"483b62396633f4392287e0d5bfba0d51b39cd3c9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_fcfb8545","line":29,"in_reply_to":"fa6399be_a8c39937","updated":"2016-10-18 08:37:08.000000000","message":"nevertheless, I\u0027m fine with both names, the most important \u0027limit\u0027 part is present :)","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"9c1826c41252db8e6cafad85d1f5206418ae4750","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_8953936a","line":29,"in_reply_to":"fa6399be_e4744d69","updated":"2016-10-14 09:13:11.000000000","message":"IIRC Anton wanted to be able to configure both the max and default value. The compromise might be two config parameters: API.default_limit, API.max_limit.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3cb8068d3d7f61db664dcd49aaea2edb0004968f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_2b3ddfc3","line":29,"in_reply_to":"fa6399be_e56316af","updated":"2016-10-17 09:46:51.000000000","message":"\u003e because by default we will return the number of introspection statutes\n\nok, but then \"default\" is the correct word :) max means the maximum, i.e. that you can\u0027t exceed it. as it\u0027s a global option (not per request), that means you can never exceed it.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"a1d084c6c86e72f923d7bd82f960d2b2fe202f95","unresolved":false,"context_lines":[{"line_number":26,"context_line":"VALID_STORE_DATA_VALUES \u003d (\u0027none\u0027, \u0027swift\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"API_OPTS \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_a55c8cee","line":29,"in_reply_to":"fa6399be_fcfb8545","updated":"2016-10-18 09:33:54.000000000","message":"From the discussion we\u0027ve had on IRC, it seem like the API-WG stance on this is to have a max_limit, and that should be enforced by returning a 400 if the user requests more than that amount. I agree with this way of handling it.\n\nWith regards to whether we need to have a default and a max configuration option, it makes sense to me for the default to be the same as the max_limit right now.","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    cfg.IntOpt(\u0027max_limit\u0027,"},{"line_number":30,"context_line":"               default\u003d1000,"},{"line_number":31,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":32,"context_line":"]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"FIREWALL_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_7938033e","line":32,"updated":"2016-10-13 10:46:49.000000000","message":"We currently have API options in SERVICE_OPTS. this might be fixed, but for now let\u0027s keep it there","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f19c5da17a1df1aa47ee77b4ff7cd390bbe338d7","unresolved":false,"context_lines":[{"line_number":215,"context_line":"               default\u003d\"/etc/ironic-inspector/rootwrap.conf\","},{"line_number":216,"context_line":"               help\u003d_(\u0027Path to the rootwrap configuration file to use for \u0027"},{"line_number":217,"context_line":"                      \u0027running commands as root\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027api_max_limit\u0027, default\u003d1000, min\u003d1,"},{"line_number":219,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":220,"context_line":"]"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_d6baebe0","line":218,"range":{"start_line":218,"start_character":32,"end_line":218,"end_character":44},"updated":"2016-11-16 12:10:51.000000000","message":"there was default 50 in spec AFAIR. I\u0027m fine with 1000, it\u0027s default for ironic.","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"144f1424dee4d5ba2dcb257f1b6edfe17e1756e4","unresolved":false,"context_lines":[{"line_number":215,"context_line":"               default\u003d\"/etc/ironic-inspector/rootwrap.conf\","},{"line_number":216,"context_line":"               help\u003d_(\u0027Path to the rootwrap configuration file to use for \u0027"},{"line_number":217,"context_line":"                      \u0027running commands as root\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027api_max_limit\u0027, default\u003d1000, min\u003d1,"},{"line_number":219,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":220,"context_line":"]"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_68004bab","line":218,"range":{"start_line":218,"start_character":32,"end_line":218,"end_character":44},"in_reply_to":"7a77a97e_d6baebe0","updated":"2016-11-16 14:15:19.000000000","message":"I think Dmitry suggested bumping it to 1000 at one point but I can\u0027t find it now :-/","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":216,"context_line":"               help\u003d_(\u0027Path to the rootwrap configuration file to use for \u0027"},{"line_number":217,"context_line":"                      \u0027running commands as root\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027api_max_limit\u0027, default\u003d1000, min\u003d1,"},{"line_number":219,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":220,"context_line":"]"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7a77a97e_b9a3be4e","line":219,"updated":"2016-11-22 10:04:17.000000000","message":"nit: s/Limit the/Maximum and default/","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b238f582bb62449b15807c83b172396bbea96cbb","unresolved":false,"context_lines":[{"line_number":216,"context_line":"               help\u003d_(\u0027Path to the rootwrap configuration file to use for \u0027"},{"line_number":217,"context_line":"                      \u0027running commands as root\u0027)),"},{"line_number":218,"context_line":"    cfg.IntOpt(\u0027api_max_limit\u0027, default\u003d1000, min\u003d1,"},{"line_number":219,"context_line":"               help\u003d_(\u0027Limit the number of elements an API list-call returns\u0027))"},{"line_number":220,"context_line":"]"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7a77a97e_4faba71e","line":219,"in_reply_to":"7a77a97e_b9a3be4e","updated":"2016-11-22 15:33:56.000000000","message":"yeah, will fix in case of another revision or a follow-up","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"}],"ironic_inspector/main.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        item \u003d {}"},{"line_number":141,"context_line":"        item[\u0027uuid\u0027] \u003d node.uuid"},{"line_number":142,"context_line":"        item[\u0027finished\u0027] \u003d bool(node.finished_at)"},{"line_number":143,"context_line":"        item[\u0027error\u0027] \u003d node.error or None"},{"line_number":144,"context_line":"        data.append(item)"},{"line_number":145,"context_line":"    return data"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_b941d23b","line":143,"updated":"2016-08-04 11:25:12.000000000","message":"we need \"links\" field similar to one in the function just above","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":227,"context_line":"def api_introspection_statuses():"},{"line_number":228,"context_line":"    utils.check_auth(flask.request)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    finished \u003d flask.request.args.get(\u0027finished\u0027, type\u003dstr, default\u003dNone)"},{"line_number":231,"context_line":"    if finished:"},{"line_number":232,"context_line":"        try:"},{"line_number":233,"context_line":"            finished \u003d strutils.bool_from_string(finished, strict\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_993ccec0","line":230,"updated":"2016-08-04 11:25:12.000000000","message":"I suspect type\u003dstr is redundant","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"19ebd8eb71b9aabafb39a9610ef88334e1430ded","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        item \u003d {}"},{"line_number":141,"context_line":"        item[\u0027uuid\u0027] \u003d node.uuid"},{"line_number":142,"context_line":"        item[\u0027finished\u0027] \u003d bool(node.finished_at)"},{"line_number":143,"context_line":"        item[\u0027error\u0027] \u003d node.error or None"},{"line_number":144,"context_line":"        item[\u0027links\u0027] \u003d create_link_object("},{"line_number":145,"context_line":"            [\"v%s/introspection/%s\" % (CURRENT_API_VERSION[0], node.uuid)])"},{"line_number":146,"context_line":"        data.append(item)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_53582c56","line":143,"range":{"start_line":143,"start_character":35,"end_line":143,"end_character":42},"updated":"2016-08-11 12:00:31.000000000","message":"Nit: I\u0027m not sure this is needed; node.error is either None or a string","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"4a195cef8ae082e4a86ec244ebc5e01033afddec","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        item \u003d {}"},{"line_number":141,"context_line":"        item[\u0027uuid\u0027] \u003d node.uuid"},{"line_number":142,"context_line":"        item[\u0027finished\u0027] \u003d bool(node.finished_at)"},{"line_number":143,"context_line":"        item[\u0027error\u0027] \u003d node.error or None"},{"line_number":144,"context_line":"        item[\u0027links\u0027] \u003d create_link_object("},{"line_number":145,"context_line":"            [\"v%s/introspection/%s\" % (CURRENT_API_VERSION[0], node.uuid)])"},{"line_number":146,"context_line":"        data.append(item)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_365738cb","line":143,"range":{"start_line":143,"start_character":35,"end_line":143,"end_character":42},"in_reply_to":"9ad45d7e_53582c56","updated":"2016-08-12 03:19:55.000000000","message":"Done","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"660730ef10bb1c9a0620d08408c752c8cd7363dc","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    utils.check_auth(flask.request)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    finished \u003d flask.request.args.get(\u0027finished\u0027, default\u003dNone)"},{"line_number":233,"context_line":"    if finished:"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            finished \u003d strutils.bool_from_string(finished, strict\u003dTrue)"},{"line_number":236,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_f393c54d","line":233,"updated":"2016-08-15 09:53:41.000000000","message":"should be \"if finished is not None\" otherwise you also allow empty strings","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    utils.check_auth(flask.request)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    finished \u003d flask.request.args.get(\u0027finished\u0027, default\u003dNone)"},{"line_number":233,"context_line":"    if finished:"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            finished \u003d strutils.bool_from_string(finished, strict\u003dTrue)"},{"line_number":236,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_189116f1","line":233,"in_reply_to":"3ac371cc_f393c54d","updated":"2016-09-15 16:02:21.000000000","message":"Done","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"de2543358da765f0a8ce167bfe4c03ae29b5d196","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"def _limit_arg(default):"},{"line_number":228,"context_line":"    limit \u003d flask.request.args.get(\u0027limit\u0027, default\u003ddefault)"},{"line_number":229,"context_line":"    if limit !\u003d default:"},{"line_number":230,"context_line":"        # if a limit was provided as an arg. Mind the type e.g: \u002750\u0027 !\u003d 50"},{"line_number":231,"context_line":"        try:"},{"line_number":232,"context_line":"            limit \u003d int(limit)"},{"line_number":233,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_d2bc78bd","line":230,"range":{"start_line":229,"start_character":0,"end_line":230,"end_character":74},"updated":"2016-09-16 08:31:35.000000000","message":"Please take a look on ironic api as example, we need configuration option max_limit, and use it as default if no other provided","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"e9e3a98d9f50c6a619a1d6f6783f19acd1fe30bf","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"def _limit_arg(default):"},{"line_number":228,"context_line":"    limit \u003d flask.request.args.get(\u0027limit\u0027, default\u003ddefault)"},{"line_number":229,"context_line":"    if limit !\u003d default:"},{"line_number":230,"context_line":"        # if a limit was provided as an arg. Mind the type e.g: \u002750\u0027 !\u003d 50"},{"line_number":231,"context_line":"        try:"},{"line_number":232,"context_line":"            limit \u003d int(limit)"},{"line_number":233,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_155dea78","line":230,"range":{"start_line":229,"start_character":0,"end_line":230,"end_character":74},"in_reply_to":"7a8ec9b2_d2bc78bd","updated":"2016-09-16 08:40:22.000000000","message":"will do","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"de2543358da765f0a8ce167bfe4c03ae29b5d196","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if limit \u003c 0:"},{"line_number":237,"context_line":"            raise utils.Error(_(\u0027Negative limit argument value: %s\u0027) % limit,"},{"line_number":238,"context_line":"                              code\u003d400)"},{"line_number":239,"context_line":"    # limit arg \u003d\u003d 0 means unlimited (None for pagination)"},{"line_number":240,"context_line":"    return limit or None"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_7218041f","line":239,"range":{"start_line":239,"start_character":4,"end_line":239,"end_character":58},"updated":"2016-09-16 08:31:35.000000000","message":"In case 0 or limit \u003e max_limit, we should return max_limit. One of the idea of limit is to avoid crashing on big queries.","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"e9e3a98d9f50c6a619a1d6f6783f19acd1fe30bf","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if limit \u003c 0:"},{"line_number":237,"context_line":"            raise utils.Error(_(\u0027Negative limit argument value: %s\u0027) % limit,"},{"line_number":238,"context_line":"                              code\u003d400)"},{"line_number":239,"context_line":"    # limit arg \u003d\u003d 0 means unlimited (None for pagination)"},{"line_number":240,"context_line":"    return limit or None"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_f5579e57","line":239,"range":{"start_line":239,"start_character":4,"end_line":239,"end_character":58},"in_reply_to":"7a8ec9b2_7218041f","updated":"2016-09-16 08:40:22.000000000","message":"will do, with the pagination in place, this now makes sense","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"85b6fa611fb3fe2af29633da59ebc8e2ae010220","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                              finished, code\u003d400)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    nodes \u003d node_cache.get_node_list(finished\u003dfinished, marker\u003d_marker_arg(),"},{"line_number":268,"context_line":"                                     limit\u003d_limit_arg(50))"},{"line_number":269,"context_line":"    return flask.json.jsonify(statuses\u003dgenerate_introspection_statuses(nodes))"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7a8ec9b2_0e281e99","line":268,"range":{"start_line":268,"start_character":54,"end_line":268,"end_character":56},"updated":"2016-09-19 12:10:06.000000000","message":"Why do you need default 50? config max_limit should be by default, now I can\u0027t setup limit more than 50.","commit_id":"ff9fd54e7ad020eff09863b9e58f45e749dd7338"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"26fa899bd0dcee5a5f0bb944f5f397c838ae45f9","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                              finished, code\u003d400)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    nodes \u003d node_cache.get_node_list(finished\u003dfinished, marker\u003d_marker_arg(),"},{"line_number":268,"context_line":"                                     limit\u003d_limit_arg(50))"},{"line_number":269,"context_line":"    return flask.json.jsonify(statuses\u003dgenerate_introspection_statuses(nodes))"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7a8ec9b2_32953888","line":268,"range":{"start_line":268,"start_character":54,"end_line":268,"end_character":56},"in_reply_to":"7a8ec9b2_0e281e99","updated":"2016-09-19 13:27:08.000000000","message":"how about we have two config options: default_limit \u0026 max_limit instead? I\u0027d like to be able to distinguish between a maximum possible limit value vs a reasonable default limit value. Wdyt?","commit_id":"ff9fd54e7ad020eff09863b9e58f45e749dd7338"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"792e202be9fdc75c712cb55ba6095a45588456bd","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                              finished, code\u003d400)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    nodes \u003d node_cache.get_node_list(finished\u003dfinished, marker\u003d_marker_arg(),"},{"line_number":268,"context_line":"                                     limit\u003d_limit_arg(50))"},{"line_number":269,"context_line":"    return flask.json.jsonify(statuses\u003dgenerate_introspection_statuses(nodes))"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7a8ec9b2_38951988","line":268,"range":{"start_line":268,"start_character":54,"end_line":268,"end_character":56},"in_reply_to":"7a8ec9b2_32953888","updated":"2016-09-19 13:46:13.000000000","message":"Not sure why do you need 2 options, operator will setup reasonable max_limit and can specify value they needed via API. Using 2 options is unusual for me, but let see what other think.\n\nAlso I\u0027d prefer to keep some consistency with other OS services.","commit_id":"ff9fd54e7ad020eff09863b9e58f45e749dd7338"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"8c16264e3b956d7435e019baa5c6b8b426e93a2b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    data \u003d []"},{"line_number":138,"context_line":"    for node in nodes:"},{"line_number":139,"context_line":"        item \u003d {}"},{"line_number":140,"context_line":"        item[\u0027uuid\u0027] \u003d node.uuid"},{"line_number":141,"context_line":"        item[\u0027finished\u0027] \u003d bool(node.finished_at)"},{"line_number":142,"context_line":"        item[\u0027error\u0027] \u003d node.error"},{"line_number":143,"context_line":"        item[\u0027links\u0027] \u003d create_link_object("},{"line_number":144,"context_line":"            [\"v%s/introspection/%s\" % (CURRENT_API_VERSION[0], node.uuid)])"},{"line_number":145,"context_line":"        data.append(item)"},{"line_number":146,"context_line":"    return data"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_70f5f181","line":144,"range":{"start_line":140,"start_character":0,"end_line":144,"end_character":75},"updated":"2016-09-22 10:27:59.000000000","message":"As you have filters by time, it seams reasonable to get time too","commit_id":"60f5b9eaeda1ce6c1a8a3d11b67f6eb94323b895"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"f031b7487c64ae7c351451d0c28576241372114b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    data \u003d []"},{"line_number":138,"context_line":"    for node in nodes:"},{"line_number":139,"context_line":"        item \u003d {}"},{"line_number":140,"context_line":"        item[\u0027uuid\u0027] \u003d node.uuid"},{"line_number":141,"context_line":"        item[\u0027finished\u0027] \u003d bool(node.finished_at)"},{"line_number":142,"context_line":"        item[\u0027error\u0027] \u003d node.error"},{"line_number":143,"context_line":"        item[\u0027links\u0027] \u003d create_link_object("},{"line_number":144,"context_line":"            [\"v%s/introspection/%s\" % (CURRENT_API_VERSION[0], node.uuid)])"},{"line_number":145,"context_line":"        data.append(item)"},{"line_number":146,"context_line":"    return data"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_babbcf0d","line":144,"range":{"start_line":140,"start_character":0,"end_line":144,"end_character":75},"in_reply_to":"5a8bc5a2_70f5f181","updated":"2016-09-22 12:17:00.000000000","message":"yeah, I thought the same. Then I thought let\u0027s keep the list api small (even kick the error) and let\u0027s keep just uuid and state instead in favor of /v1/introspection/uuid, which should possibly contain all the details (eventually) wdyt?\n\nPlease, mind also this patch may be -2-ed to first have a short Spec about it.","commit_id":"60f5b9eaeda1ce6c1a8a3d11b67f6eb94323b895"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"8c16264e3b956d7435e019baa5c6b8b426e93a2b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                  error\u003dnode_info.error or None)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"def _request_query(query_name, default\u003dNone, coerce\u003dlambda x: x,"},{"line_number":227,"context_line":"                   assertion\u003dlambda x: x):"},{"line_number":228,"context_line":"    query \u003d flask.request.args.get(query_name, default)"},{"line_number":229,"context_line":"    if query !\u003d default:"},{"line_number":230,"context_line":"        try:"},{"line_number":231,"context_line":"            query \u003d assertion(coerce(query))"},{"line_number":232,"context_line":"        except ValueError as exc:"},{"line_number":233,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %(name)s\u003d%(value)s \u0027"},{"line_number":234,"context_line":"                                \u0027(%(exc)s)\u0027) % dict(name\u003dquery_name,"},{"line_number":235,"context_line":"                                                    value\u003dquery, exc\u003dexc),"},{"line_number":236,"context_line":"                              code\u003d400)"},{"line_number":237,"context_line":"        except AssertionError as exc:"},{"line_number":238,"context_line":"            raise utils.Error(_(\u0027Query value check failed: %(name)s\u003d%(value)s \u0027"},{"line_number":239,"context_line":"                                \u0027(%(exc)s)\u0027) % dict(name\u003dquery_name,"},{"line_number":240,"context_line":"                                                    value\u003dquery, exc\u003dexc),"},{"line_number":241,"context_line":"                              code\u003d400)"},{"line_number":242,"context_line":"    return query_name, query"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"def _limit_query():"},{"line_number":246,"context_line":"    default \u003d CONF.api.max_limit"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def assertion(limit):"},{"line_number":249,"context_line":"        assert limit \u003e 0, _(\u0027Limit cannot be negative\u0027)"},{"line_number":250,"context_line":"        return limit"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    return _request_query(\u0027limit\u0027, default,"},{"line_number":253,"context_line":"                          # limit of zero means default limit"},{"line_number":254,"context_line":"                          lambda limit: min(int(limit), default) or default,"},{"line_number":255,"context_line":"                          assertion)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"def _marker_query():"},{"line_number":259,"context_line":"    def assertion(marker):"},{"line_number":260,"context_line":"        assert uuidutils.is_uuid_like(marker), _(\u0027Marker not UUID-like\u0027)"},{"line_number":261,"context_line":"        return marker"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    return _request_query(\u0027marker\u0027, assertion\u003dassertion)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def _float_query(query_name, default\u003dNone, assertion\u003dlambda x: x):"},{"line_number":267,"context_line":"    return _request_query(query_name, default\u003ddefault, coerce\u003dfloat,"},{"line_number":268,"context_line":"                          assertion\u003dassertion)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"@app.route(\u0027/v1/introspection\u0027, methods\u003d[\u0027GET\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_b01db9bf","line":268,"range":{"start_line":226,"start_character":0,"end_line":268,"end_character":46},"updated":"2016-09-22 10:27:59.000000000","message":"I\u0027d move this stuff to utils, main file is growing","commit_id":"60f5b9eaeda1ce6c1a8a3d11b67f6eb94323b895"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"f031b7487c64ae7c351451d0c28576241372114b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                  error\u003dnode_info.error or None)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"def _request_query(query_name, default\u003dNone, coerce\u003dlambda x: x,"},{"line_number":227,"context_line":"                   assertion\u003dlambda x: x):"},{"line_number":228,"context_line":"    query \u003d flask.request.args.get(query_name, default)"},{"line_number":229,"context_line":"    if query !\u003d default:"},{"line_number":230,"context_line":"        try:"},{"line_number":231,"context_line":"            query \u003d assertion(coerce(query))"},{"line_number":232,"context_line":"        except ValueError as exc:"},{"line_number":233,"context_line":"            raise utils.Error(_(\u0027Invalid query value: %(name)s\u003d%(value)s \u0027"},{"line_number":234,"context_line":"                                \u0027(%(exc)s)\u0027) % dict(name\u003dquery_name,"},{"line_number":235,"context_line":"                                                    value\u003dquery, exc\u003dexc),"},{"line_number":236,"context_line":"                              code\u003d400)"},{"line_number":237,"context_line":"        except AssertionError as exc:"},{"line_number":238,"context_line":"            raise utils.Error(_(\u0027Query value check failed: %(name)s\u003d%(value)s \u0027"},{"line_number":239,"context_line":"                                \u0027(%(exc)s)\u0027) % dict(name\u003dquery_name,"},{"line_number":240,"context_line":"                                                    value\u003dquery, exc\u003dexc),"},{"line_number":241,"context_line":"                              code\u003d400)"},{"line_number":242,"context_line":"    return query_name, query"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"def _limit_query():"},{"line_number":246,"context_line":"    default \u003d CONF.api.max_limit"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def assertion(limit):"},{"line_number":249,"context_line":"        assert limit \u003e 0, _(\u0027Limit cannot be negative\u0027)"},{"line_number":250,"context_line":"        return limit"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    return _request_query(\u0027limit\u0027, default,"},{"line_number":253,"context_line":"                          # limit of zero means default limit"},{"line_number":254,"context_line":"                          lambda limit: min(int(limit), default) or default,"},{"line_number":255,"context_line":"                          assertion)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"def _marker_query():"},{"line_number":259,"context_line":"    def assertion(marker):"},{"line_number":260,"context_line":"        assert uuidutils.is_uuid_like(marker), _(\u0027Marker not UUID-like\u0027)"},{"line_number":261,"context_line":"        return marker"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    return _request_query(\u0027marker\u0027, assertion\u003dassertion)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def _float_query(query_name, default\u003dNone, assertion\u003dlambda x: x):"},{"line_number":267,"context_line":"    return _request_query(query_name, default\u003ddefault, coerce\u003dfloat,"},{"line_number":268,"context_line":"                          assertion\u003dassertion)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"@app.route(\u0027/v1/introspection\u0027, methods\u003d[\u0027GET\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_3a2b3f32","line":268,"range":{"start_line":226,"start_character":0,"end_line":268,"end_character":46},"in_reply_to":"5a8bc5a2_b01db9bf","updated":"2016-09-22 12:17:00.000000000","message":"ack, api_utils.py with separate unittests. Makes sense.","commit_id":"60f5b9eaeda1ce6c1a8a3d11b67f6eb94323b895"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f19c5da17a1df1aa47ee77b4ff7cd390bbe338d7","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        limit\u003dapi_tools.limit_field()"},{"line_number":238,"context_line":"    )"},{"line_number":239,"context_line":"    data \u003d {"},{"line_number":240,"context_line":"        \u0027introspection\u0027: [generate_introspection_status(node)"},{"line_number":241,"context_line":"                          for node in nodes]"},{"line_number":242,"context_line":"    }"},{"line_number":243,"context_line":"    return flask.json.jsonify(data)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_d6bcab6e","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":24},"updated":"2016-11-16 12:10:51.000000000","message":"why do we need `introspection` key here?","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"144f1424dee4d5ba2dcb257f1b6edfe17e1756e4","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        limit\u003dapi_tools.limit_field()"},{"line_number":238,"context_line":"    )"},{"line_number":239,"context_line":"    data \u003d {"},{"line_number":240,"context_line":"        \u0027introspection\u0027: [generate_introspection_status(node)"},{"line_number":241,"context_line":"                          for node in nodes]"},{"line_number":242,"context_line":"    }"},{"line_number":243,"context_line":"    return flask.json.jsonify(data)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_eccab619","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":24},"in_reply_to":"7a77a97e_d6bcab6e","updated":"2016-11-16 14:15:19.000000000","message":"This is to match the api-wg recommendation[1]\nGET @/v1/introspection returns some \"introspection\" object this way\n\n[1] https://github.com/openstack/api-wg/blob/master/guidelines/pagination_filter_sort.rst#filtering","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"}],"ironic_inspector/node_cache.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    :param finished: optional filtering finished status"},{"line_number":618,"context_line":"    :returns: a list of NodeInfo."},{"line_number":619,"context_line":"    \"\"\""},{"line_number":620,"context_line":"    if finished is True:"},{"line_number":621,"context_line":"        rows \u003d db.model_query(db.Node).filter("},{"line_number":622,"context_line":"            db.Node.finished_at !\u003d sql.null()).all()"},{"line_number":623,"context_line":"    elif finished is False:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_f94b4a57","line":620,"updated":"2016-08-04 11:25:12.000000000","message":"just \"if finished\"","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":620,"context_line":"    if finished is True:"},{"line_number":621,"context_line":"        rows \u003d db.model_query(db.Node).filter("},{"line_number":622,"context_line":"            db.Node.finished_at !\u003d sql.null()).all()"},{"line_number":623,"context_line":"    elif finished is False:"},{"line_number":624,"context_line":"        rows \u003d db.model_query(db.Node).filter_by(finished_at\u003dNone).all()"},{"line_number":625,"context_line":"    else:"},{"line_number":626,"context_line":"        rows \u003d db.model_query(db.Node).all()"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_d946464e","line":623,"updated":"2016-08-04 11:25:12.000000000","message":"\"elif finished is not None\"","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":623,"context_line":"    elif finished is False:"},{"line_number":624,"context_line":"        rows \u003d db.model_query(db.Node).filter_by(finished_at\u003dNone).all()"},{"line_number":625,"context_line":"    else:"},{"line_number":626,"context_line":"        rows \u003d db.model_query(db.Node).all()"},{"line_number":627,"context_line":"    return [NodeInfo.from_row(row, ironic\u003dironic) for row in rows]"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_3974c29a","line":626,"updated":"2016-08-04 11:25:12.000000000","message":"you don\u0027t need all() in any of the cases, it will be done automatically.","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b5cda92ca55a1ebf567f400515ad9941a678cdc6","unresolved":false,"context_lines":[{"line_number":656,"context_line":"        rows \u003d db.model_query(db.Node)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # order based on started_at\u0026finished_at; newer first"},{"line_number":659,"context_line":"    rows \u003d db_utils.paginate_query(rows, db.Node, limit,"},{"line_number":660,"context_line":"                                   (\u0027started_at\u0027, \u0027finished_at\u0027),"},{"line_number":661,"context_line":"                                   marker\u003dmarker, sort_dir\u003d\u0027desc-nullsfirst\u0027)"},{"line_number":662,"context_line":"    return [NodeInfo.from_row(row, ironic\u003dironic) for row in rows]"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8ec9b2_34c04be0","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":34},"updated":"2016-09-15 16:04:47.000000000","message":"Unfortunately, there\u0027s a bug in paginate_query (https://bugs.launchpad.net/oslo.db/+bug/1594352)","commit_id":"8983fcf63c16a61257ed6f246398431e8e354bcd"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"de2543358da765f0a8ce167bfe4c03ae29b5d196","unresolved":false,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # order based on started_at\u0026finished_at; newer first"},{"line_number":659,"context_line":"    rows \u003d db_utils.paginate_query(rows, db.Node, limit,"},{"line_number":660,"context_line":"                                   (\u0027started_at\u0027, \u0027finished_at\u0027),"},{"line_number":661,"context_line":"                                   marker\u003dmarker, sort_dir\u003d\u0027desc-nullsfirst\u0027)"},{"line_number":662,"context_line":"    return [NodeInfo.from_row(row, ironic\u003dironic) for row in rows]"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_356ae6b3","line":660,"range":{"start_line":660,"start_character":51,"end_line":660,"end_character":62},"updated":"2016-09-16 08:31:35.000000000","message":"So it will fail if we have nodes on introspection, right? maybe just sor on started_at for now, wdyt?","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"e9e3a98d9f50c6a619a1d6f6783f19acd1fe30bf","unresolved":false,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    # order based on started_at\u0026finished_at; newer first"},{"line_number":659,"context_line":"    rows \u003d db_utils.paginate_query(rows, db.Node, limit,"},{"line_number":660,"context_line":"                                   (\u0027started_at\u0027, \u0027finished_at\u0027),"},{"line_number":661,"context_line":"                                   marker\u003dmarker, sort_dir\u003d\u0027desc-nullsfirst\u0027)"},{"line_number":662,"context_line":"    return [NodeInfo.from_row(row, ironic\u003dironic) for row in rows]"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_f5cebe2b","line":660,"range":{"start_line":660,"start_character":51,"end_line":660,"end_character":62},"in_reply_to":"7a8ec9b2_356ae6b3","updated":"2016-09-16 08:40:22.000000000","message":"I\u0027ve got a workaround, see my last patch","commit_id":"652c8220086f31dd3ebaaaf0b4d5f13ed5df538c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"af31506cb428fc7d33711d90d6655a59b5238291","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        return add_node(node.uuid, ironic\u003dironic)"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"def get_node_list(ironic\u003dNone, marker\u003dNone, limit\u003dCONF.api.max_limit):"},{"line_number":631,"context_line":"    \"\"\"Get node list from the cache."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    The list of the nodes is ordered based on the (started_at, uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_0990d242","line":630,"range":{"start_line":630,"start_character":50,"end_line":630,"end_character":69},"updated":"2016-10-12 09:00:44.000000000","message":"lets not use conf value as function deafult arg.\n\nThey are created at the time that the statement that defines the function is executed, and new value could be not initialized at this time.","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"1e9bd6206e8ecebb38e913ef74e88697c7fe6d69","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        return add_node(node.uuid, ironic\u003dironic)"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"def get_node_list(ironic\u003dNone, marker\u003dNone, limit\u003dCONF.api.max_limit):"},{"line_number":631,"context_line":"    \"\"\"Get node list from the cache."},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    The list of the nodes is ordered based on the (started_at, uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_3dedd025","line":630,"range":{"start_line":630,"start_character":50,"end_line":630,"end_character":69},"in_reply_to":"fa6399be_0990d242","updated":"2016-10-12 09:54:37.000000000","message":"Done","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    \"\"\""},{"line_number":641,"context_line":"    if marker is not None:"},{"line_number":642,"context_line":"        # uuid marker -\u003e row marker for pagination"},{"line_number":643,"context_line":"        marker \u003d db.model_query(db.Node).filter_by(uuid\u003dmarker).first()"},{"line_number":644,"context_line":"        if marker is None:"},{"line_number":645,"context_line":"            raise utils.Error(_(\u0027Node not found for marker: %s\u0027) % marker,"},{"line_number":646,"context_line":"                              code\u003d404)"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_d9f02f94","line":643,"updated":"2016-10-13 10:46:49.000000000","message":"uuid is a primary key, so you can just use model_query(db.Node).get(marker)","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f19c5da17a1df1aa47ee77b4ff7cd390bbe338d7","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        if marker is None:"},{"line_number":645,"context_line":"            raise utils.Error(_(\u0027Node not found for marker: %s\u0027) % marker,"},{"line_number":646,"context_line":"                              code\u003d404)"},{"line_number":647,"context_line":"    if limit is None:"},{"line_number":648,"context_line":"        limit \u003d CONF.api_max_limit"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    rows \u003d db.model_query(db.Node)"},{"line_number":651,"context_line":"    # ordered based on (started_at, uuid); newer first"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_e9caa819","line":648,"range":{"start_line":647,"start_character":0,"end_line":648,"end_character":34},"updated":"2016-11-16 12:10:51.000000000","message":"nit: redundant","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"ce00feb199f0e7a37a9727ecf0a790b3d17bbd83","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        if marker is None:"},{"line_number":645,"context_line":"            raise utils.Error(_(\u0027Node not found for marker: %s\u0027) % marker,"},{"line_number":646,"context_line":"                              code\u003d404)"},{"line_number":647,"context_line":"    if limit is None:"},{"line_number":648,"context_line":"        limit \u003d CONF.api_max_limit"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    rows \u003d db.model_query(db.Node)"},{"line_number":651,"context_line":"    # ordered based on (started_at, uuid); newer first"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_5075ea95","line":648,"range":{"start_line":647,"start_character":0,"end_line":648,"end_character":34},"in_reply_to":"7a77a97e_8cfdc23c","updated":"2016-11-16 17:45:06.000000000","message":"Done","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"144f1424dee4d5ba2dcb257f1b6edfe17e1756e4","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        if marker is None:"},{"line_number":645,"context_line":"            raise utils.Error(_(\u0027Node not found for marker: %s\u0027) % marker,"},{"line_number":646,"context_line":"                              code\u003d404)"},{"line_number":647,"context_line":"    if limit is None:"},{"line_number":648,"context_line":"        limit \u003d CONF.api_max_limit"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"    rows \u003d db.model_query(db.Node)"},{"line_number":651,"context_line":"    # ordered based on (started_at, uuid); newer first"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a77a97e_8cfdc23c","line":648,"range":{"start_line":647,"start_character":0,"end_line":648,"end_character":34},"in_reply_to":"7a77a97e_e9caa819","updated":"2016-11-16 14:15:19.000000000","message":"yeah, will fix","commit_id":"8011b30fd513d39372bcadcd2acd383ac2444475"}],"ironic_inspector/test/functional.py":[{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"25220c4c8c66a9dcdb11807b9fd00f40a0dae087","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            \u0027statuses\u0027: [{\u0027finished\u0027: False, \u0027error\u0027: None,"},{"line_number":470,"context_line":"                          \u0027uuid\u0027: self.uuid, \u0027links\u0027: links}]}, statuses)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"@contextlib.contextmanager"},{"line_number":474,"context_line":"def mocked_server():"},{"line_number":475,"context_line":"    d \u003d tempfile.mkdtemp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_215b6256","line":472,"updated":"2016-08-08 10:58:23.000000000","message":"I\u0027d add self.call_continue(self.data) and asserted both that the introspection finished (self.call_get_status(self.uuid)) and that the call_get_statuses works as expected","commit_id":"9b1afbf4496bd7a3037976550f682d9dad871249"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"419b16876267a4dba49cb8c04cd1f0a05fd173b9","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    def call_get_status(self, uuid, **kwargs):"},{"line_number":160,"context_line":"        return self.call(\u0027get\u0027, \u0027/v1/introspection/%s\u0027 % uuid, **kwargs).json()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @_query_string(\u0027started_before\u0027, \u0027started_after\u0027, \u0027finished_before\u0027,"},{"line_number":163,"context_line":"                   \u0027finished_after\u0027, \u0027marker\u0027, \u0027limit\u0027)"},{"line_number":164,"context_line":"    def call_get_statuses(self, query_string\u003d\u0027\u0027, **kwargs):"},{"line_number":165,"context_line":"        path \u003d \u0027/v1/introspection\u0027"},{"line_number":166,"context_line":"        return self.call(\u0027get\u0027, path + query_string, **kwargs).json()"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_89048118","line":163,"range":{"start_line":162,"start_character":19,"end_line":163,"end_character":35},"updated":"2016-10-07 14:20:39.000000000","message":"Oops! missed these.","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"af31506cb428fc7d33711d90d6655a59b5238291","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        # we use the marker"},{"line_number":266,"context_line":"        statuses \u003d self.call_get_statuses(marker\u003dstr(self.uuid), limit\u003d1)"},{"line_number":267,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":268,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":269,"context_line":"            self.assertEqual(1, len(statuses))"},{"line_number":270,"context_line":"            self.assertNotEqual(self.uuid, statuses[0].get(\u0027uuid\u0027))"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        self.call_continue(self.data)"},{"line_number":273,"context_line":"        eventlet.greenthread.sleep(DEFAULT_SLEEP)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_6c16bc56","line":270,"range":{"start_line":268,"start_character":0,"end_line":270,"end_character":67},"updated":"2016-10-12 09:00:44.000000000","message":"conditions in tests make me think that we will regret on it","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"d45593096143584df384271d63b45a44aad6b926","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":268,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":269,"context_line":"            self.assertEqual(1, len(statuses))"},{"line_number":270,"context_line":"            self.assertNotEqual(self.uuid, statuses[0].get(\u0027uuid\u0027))"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        self.call_continue(self.data)"},{"line_number":273,"context_line":"        eventlet.greenthread.sleep(DEFAULT_SLEEP)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_1f6e392f","line":270,"in_reply_to":"fa6399be_5d10c401","updated":"2016-10-12 13:07:35.000000000","message":"That assumes tests are run in alphabetical order; even if that\u0027s true, it\u0027s not something we should rely on.\n\nThe Right Thing, IMHO, is to make the tests fully self-contained, by having each test start with a clean slate and clean up after itself when finished.","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"1e9bd6206e8ecebb38e913ef74e88697c7fe6d69","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        # we use the marker"},{"line_number":266,"context_line":"        statuses \u003d self.call_get_statuses(marker\u003dstr(self.uuid), limit\u003d1)"},{"line_number":267,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":268,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":269,"context_line":"            self.assertEqual(1, len(statuses))"},{"line_number":270,"context_line":"            self.assertNotEqual(self.uuid, statuses[0].get(\u0027uuid\u0027))"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        self.call_continue(self.data)"},{"line_number":273,"context_line":"        eventlet.greenthread.sleep(DEFAULT_SLEEP)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_5d10c401","line":270,"range":{"start_line":268,"start_character":0,"end_line":270,"end_character":67},"in_reply_to":"fa6399be_6c16bc56","updated":"2016-10-12 09:54:37.000000000","message":"yeah, the thing is there can be as many statuses as there are test cases in this module. The actual count also depends on the test execution ordering. If the test name was zzz_test_... then we could possibly use the amount of test methods as a number of statuses, wdyt?","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def outer(func):"},{"line_number":81,"context_line":"        @six.wraps(func)"},{"line_number":82,"context_line":"        def inner(*args, **kwargs):"},{"line_number":83,"context_line":"            queries \u003d []"},{"line_number":84,"context_line":"            for query_name in query_names:"},{"line_number":85,"context_line":"                query \u003d kwargs.pop(query_name, None)"},{"line_number":86,"context_line":"                if query is not None:"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa6399be_39320b60","line":83,"updated":"2016-10-13 10:46:49.000000000","message":"please call these \"parameters\", \"queries\" is pretty confusing","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        # check we\u0027ve got some result with uuid !\u003d self.uuid if"},{"line_number":291,"context_line":"        # we use the marker"},{"line_number":292,"context_line":"        statuses \u003d self.call_get_statuses("},{"line_number":293,"context_line":"            marker\u003dstr(self.uuid), limit\u003d1).get(\u0027introspection\u0027)"},{"line_number":294,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":295,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":296,"context_line":"            self.assertEqual(1, len(statuses))"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_3b2496c3","line":293,"updated":"2016-11-10 13:00:43.000000000","message":"nit: str() seems redundant","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        # check we\u0027ve got some result with uuid !\u003d self.uuid if"},{"line_number":291,"context_line":"        # we use the marker"},{"line_number":292,"context_line":"        statuses \u003d self.call_get_statuses("},{"line_number":293,"context_line":"            marker\u003dstr(self.uuid), limit\u003d1).get(\u0027introspection\u0027)"},{"line_number":294,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":295,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":296,"context_line":"            self.assertEqual(1, len(statuses))"}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_b17b4b7a","line":293,"in_reply_to":"9a629dbe_3b2496c3","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"204b45522066c332350721a35465ceb826789d9c","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        statuses \u003d self.call_get_statuses("},{"line_number":293,"context_line":"            marker\u003dstr(self.uuid), limit\u003d1).get(\u0027introspection\u0027)"},{"line_number":294,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":295,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":296,"context_line":"            self.assertEqual(1, len(statuses))"},{"line_number":297,"context_line":"            self.assertNotEqual(self.uuid, statuses[0].get(\u0027uuid\u0027))"},{"line_number":298,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_5b2dcaa6","line":295,"updated":"2016-11-10 13:00:43.000000000","message":"we should not really have such non-determenistic checks in tests. could you please figure out what actually happens (assuming functional tests do not run in parallel)","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"98d2ab2adf18eb63755f0b2c471d3c7f4815f393","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        statuses \u003d self.call_get_statuses("},{"line_number":293,"context_line":"            marker\u003dstr(self.uuid), limit\u003d1).get(\u0027introspection\u0027)"},{"line_number":294,"context_line":"        # in case the marker happened not to be the last item"},{"line_number":295,"context_line":"        if len(statuses) \u003e 0:"},{"line_number":296,"context_line":"            self.assertEqual(1, len(statuses))"},{"line_number":297,"context_line":"            self.assertNotEqual(self.uuid, statuses[0].get(\u0027uuid\u0027))"},{"line_number":298,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9a629dbe_4d02460b","line":295,"in_reply_to":"9a629dbe_5b2dcaa6","updated":"2016-11-11 10:50:41.000000000","message":"Done","commit_id":"4b8a0932c1f899573e0231497534146a87be7781"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            for field_name in field_names:"},{"line_number":90,"context_line":"                field \u003d kwargs.pop(field_name, None)"},{"line_number":91,"context_line":"                if field is not None:"},{"line_number":92,"context_line":"                    queries.append(\u0027%s\u003d%s\u0027 % (field_name, field))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            query_string \u003d \u0027\u0026\u0027.join(queries)"},{"line_number":95,"context_line":"            if query_string:"}],"source_content_type":"text/x-python","patch_set":36,"id":"7a77a97e_f98536ad","line":92,"updated":"2016-11-22 10:04:17.000000000","message":"nit: field should be escaped (not a huge dial for tests)","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"}],"ironic_inspector/test/unit/test_api_tools.py":[{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"af31506cb428fc7d33711d90d6655a59b5238291","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import flask"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"import pytz"},{"line_number":18,"context_line":"import six"},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_config import cfg"},{"line_number":22,"context_line":"from oslo_utils import uuidutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic_inspector import api_tools"},{"line_number":25,"context_line":"import ironic_inspector.test.base as test_base"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_3f2148a0","line":22,"range":{"start_line":14,"start_character":0,"end_line":22,"end_character":32},"updated":"2016-10-12 09:00:44.000000000","message":"order please","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"1e9bd6206e8ecebb38e913ef74e88697c7fe6d69","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import flask"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"import pytz"},{"line_number":18,"context_line":"import six"},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_config import cfg"},{"line_number":22,"context_line":"from oslo_utils import uuidutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic_inspector import api_tools"},{"line_number":25,"context_line":"import ironic_inspector.test.base as test_base"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa6399be_7d2ae82d","line":22,"range":{"start_line":14,"start_character":0,"end_line":22,"end_character":32},"in_reply_to":"fa6399be_3f2148a0","updated":"2016-10-12 09:54:37.000000000","message":"Done","commit_id":"83195b0e9555d26a3abf783165c930fabb79dfc7"}],"ironic_inspector/test/unit/test_main.py":[{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d7a903f4c3685a4997a03e60cf100ab1b2a264f7","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class TestApiListStatus(BaseAPITest):"},{"line_number":201,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":202,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":203,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":204,"context_line":"                                                      started_at\u003d42.0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_8ceadeaa","line":201,"updated":"2016-07-25 17:04:08.000000000","message":"please, add a test case that asserts ``list_mock`` is called properly even if ``filter`` parameter isn\u0027t passed to the API call","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"21d3c05f84cee7e997bd7f632ddb95d069af736a","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class TestApiListStatus(BaseAPITest):"},{"line_number":201,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":202,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":203,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":204,"context_line":"                                                      started_at\u003d42.0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_4aef01e9","line":201,"in_reply_to":"dada55a8_8ceadeaa","updated":"2016-07-27 03:37:20.000000000","message":"Done","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d7a903f4c3685a4997a03e60cf100ab1b2a264f7","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class TestApiListStatus(BaseAPITest):"},{"line_number":201,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":202,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":203,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":204,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":205,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":206,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":207,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":208,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":209,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"},{"line_number":210,"context_line":"                                        \u0027error\u0027: \u0027boom\u0027,"},{"line_number":211,"context_line":"                                        \u0027uuid\u0027: self.uuid}]},"},{"line_number":212,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":215,"context_line":"    def test_list_introspection_not_finished(self, list_mock):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_ece71a10","line":212,"range":{"start_line":202,"start_character":0,"end_line":212,"end_character":62},"updated":"2016-07-25 17:04:08.000000000","message":"this test should check passing of the ``finished\u003dTrue`` parameter only (such as ``list_mock.assert_called_once_with...``)","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"21d3c05f84cee7e997bd7f632ddb95d069af736a","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class TestApiListStatus(BaseAPITest):"},{"line_number":201,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":202,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":203,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":204,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":205,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":206,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":207,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":208,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":209,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"},{"line_number":210,"context_line":"                                        \u0027error\u0027: \u0027boom\u0027,"},{"line_number":211,"context_line":"                                        \u0027uuid\u0027: self.uuid}]},"},{"line_number":212,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":215,"context_line":"    def test_list_introspection_not_finished(self, list_mock):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_8462603c","line":212,"range":{"start_line":202,"start_character":0,"end_line":212,"end_character":62},"in_reply_to":"dada55a8_ece71a10","updated":"2016-07-27 03:37:20.000000000","message":"Done","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d7a903f4c3685a4997a03e60cf100ab1b2a264f7","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":215,"context_line":"    def test_list_introspection_not_finished(self, list_mock):"},{"line_number":216,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":217,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":218,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dfalse\u0027)"},{"line_number":219,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":220,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: False,"},{"line_number":221,"context_line":"                                        \u0027error\u0027: None,"},{"line_number":222,"context_line":"                                        \u0027uuid\u0027: self.uuid}]},"},{"line_number":223,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":226,"context_line":"    def test_list_introspection_wrong_finished(self, list_mock):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_ec7c3a22","line":223,"range":{"start_line":215,"start_character":1,"end_line":223,"end_character":62},"updated":"2016-07-25 17:04:08.000000000","message":"Ditto. this test should check passing of the ``finished\u003dFalse`` flag.","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"21d3c05f84cee7e997bd7f632ddb95d069af736a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":215,"context_line":"    def test_list_introspection_not_finished(self, list_mock):"},{"line_number":216,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":217,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":218,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dfalse\u0027)"},{"line_number":219,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":220,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: False,"},{"line_number":221,"context_line":"                                        \u0027error\u0027: None,"},{"line_number":222,"context_line":"                                        \u0027uuid\u0027: self.uuid}]},"},{"line_number":223,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":226,"context_line":"    def test_list_introspection_wrong_finished(self, list_mock):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_449228f7","line":223,"range":{"start_line":215,"start_character":1,"end_line":223,"end_character":62},"in_reply_to":"dada55a8_ec7c3a22","updated":"2016-07-27 03:37:20.000000000","message":"Done","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d7a903f4c3685a4997a03e60cf100ab1b2a264f7","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.assertEqual("},{"line_number":231,"context_line":"            \u0027Invalid boolean value for finished: foo\u0027,"},{"line_number":232,"context_line":"            json.loads(res.data.decode(\u0027utf-8\u0027))[\u0027error\u0027][\u0027message\u0027])"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"class TestApiGetData(BaseAPITest):"},{"line_number":236,"context_line":"    @mock.patch.object(main.swift, \u0027SwiftAPI\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_0c4a6eac","line":233,"updated":"2016-07-25 17:04:08.000000000","message":"Please, add test cases to check generating of statuses explicitly, such as with:\n* NodeInfo(...)\n* NodeInfo(..., error\u003dNone, finished_at\u003d100.1)\n* NodeInfo(..., error\u003d\"Error string\", finished_at\u003d100.1)","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"21d3c05f84cee7e997bd7f632ddb95d069af736a","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.assertEqual("},{"line_number":231,"context_line":"            \u0027Invalid boolean value for finished: foo\u0027,"},{"line_number":232,"context_line":"            json.loads(res.data.decode(\u0027utf-8\u0027))[\u0027error\u0027][\u0027message\u0027])"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"class TestApiGetData(BaseAPITest):"},{"line_number":236,"context_line":"    @mock.patch.object(main.swift, \u0027SwiftAPI\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_844c209f","line":233,"in_reply_to":"dada55a8_0c4a6eac","updated":"2016-07-27 03:37:20.000000000","message":"Thanks Milan, I will combine this with a new added test case which tests list without \u0027finished\u0027 filter.","commit_id":"95fb1c8ee791de963c5c3273f8629e2c015e6726"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"347348a3630ba7173e90ec8ca261b4fbc5045df3","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":205,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":206,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":207,"context_line":"                                                      error\u003d\u0027boom\u0027),"},{"line_number":208,"context_line":"                                  node_cache.NodeInfo(uuid\u003duuid2,"},{"line_number":209,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":210,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_9d396844","line":207,"range":{"start_line":207,"start_character":54,"end_line":207,"end_character":66},"updated":"2016-07-29 09:46:15.000000000","message":"Nit: to check all combinations, error\u003dNone\u0026finished_at\u003d100.1 is missing in the tests. But I think it\u0027s OK.","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3458b2dacaa6823855911394a5724ebae77e6bba","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":205,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":206,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":207,"context_line":"                                                      error\u003d\u0027boom\u0027),"},{"line_number":208,"context_line":"                                  node_cache.NodeInfo(uuid\u003duuid2,"},{"line_number":209,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":210,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_19773ea0","line":207,"updated":"2016-08-04 11:25:12.000000000","message":"We\u0027re not changing output based on errors, so I agree that it\u0027s fine.","commit_id":"74baed447c742cd2fbf3395f373bafe93b08b614"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"19ebd8eb71b9aabafb39a9610ef88334e1430ded","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            {u\u0027href\u0027: u\u0027http://localhost/v1/introspection/%s\u0027 % self.uuid,"},{"line_number":206,"context_line":"             u\u0027rel\u0027: u\u0027self\u0027}]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":209,"context_line":"    def test_list_introspection(self, list_mock):"},{"line_number":210,"context_line":"        uuid2 \u003d uuidutils.generate_uuid()"},{"line_number":211,"context_line":"        links2 \u003d ["}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_eedb377a","line":208,"range":{"start_line":208,"start_character":4,"end_line":208,"end_character":22},"updated":"2016-08-11 12:00:31.000000000","message":"Nit: one could patch the whole class as this mock is used in all the tests","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"4a195cef8ae082e4a86ec244ebc5e01033afddec","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            {u\u0027href\u0027: u\u0027http://localhost/v1/introspection/%s\u0027 % self.uuid,"},{"line_number":206,"context_line":"             u\u0027rel\u0027: u\u0027self\u0027}]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":209,"context_line":"    def test_list_introspection(self, list_mock):"},{"line_number":210,"context_line":"        uuid2 \u003d uuidutils.generate_uuid()"},{"line_number":211,"context_line":"        links2 \u003d ["}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_67445c49","line":208,"range":{"start_line":208,"start_character":4,"end_line":208,"end_character":22},"in_reply_to":"9ad45d7e_eedb377a","updated":"2016-08-12 03:19:55.000000000","message":"Done","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"19ebd8eb71b9aabafb39a9610ef88334e1430ded","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":234,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":235,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":236,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":237,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":238,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":239,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":240,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":241,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_ee933759","line":238,"range":{"start_line":235,"start_character":33,"end_line":238,"end_character":68},"updated":"2016-08-11 12:00:31.000000000","message":"please, add the non-finished node here too","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"4a195cef8ae082e4a86ec244ebc5e01033afddec","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":234,"context_line":"    def test_list_introspection_finished(self, list_mock):"},{"line_number":235,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":236,"context_line":"                                                      started_at\u003d42.0,"},{"line_number":237,"context_line":"                                                      finished_at\u003d100.1,"},{"line_number":238,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":239,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":240,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":241,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_47c2f885","line":238,"range":{"start_line":235,"start_character":33,"end_line":238,"end_character":68},"in_reply_to":"9ad45d7e_ee933759","updated":"2016-08-12 03:19:55.000000000","message":"hi Milan, as get_node_list called with finished True here, so there\u0027s no non-finished node included in return value.","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"19ebd8eb71b9aabafb39a9610ef88334e1430ded","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    @mock.patch.object(node_cache, \u0027get_node_list\u0027, autospec\u003dTrue)"},{"line_number":249,"context_line":"    def test_list_introspection_not_finished(self, list_mock):"},{"line_number":250,"context_line":"        list_mock.return_value \u003d [node_cache.NodeInfo(uuid\u003dself.uuid,"},{"line_number":251,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":252,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dfalse\u0027)"},{"line_number":253,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":254,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: False,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_eea17795","line":251,"range":{"start_line":250,"start_character":33,"end_line":251,"end_character":71},"updated":"2016-08-11 12:00:31.000000000","message":"please, add the finished node here too","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f9269329192ac8ed3aaf64d5b2436267e4f0b0de","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":238,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":239,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":240,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"},{"line_number":241,"context_line":"                                        \u0027error\u0027: \u0027boom\u0027,"},{"line_number":242,"context_line":"                                        \u0027uuid\u0027: self.uuid,"},{"line_number":243,"context_line":"                                        \u0027links\u0027: self.links}]},"},{"line_number":244,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":245,"context_line":"        list_mock.assert_called_once_with(finished\u003dTrue)"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_00944935","line":243,"range":{"start_line":240,"start_character":39,"end_line":243,"end_character":63},"updated":"2016-08-15 10:23:43.000000000","message":"nit: would be better to have 2 nodes as in first test case","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                                                      error\u003d\u0027boom\u0027)]"},{"line_number":238,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dtrue\u0027)"},{"line_number":239,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":240,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: True,"},{"line_number":241,"context_line":"                                        \u0027error\u0027: \u0027boom\u0027,"},{"line_number":242,"context_line":"                                        \u0027uuid\u0027: self.uuid,"},{"line_number":243,"context_line":"                                        \u0027links\u0027: self.links}]},"},{"line_number":244,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":245,"context_line":"        list_mock.assert_called_once_with(finished\u003dTrue)"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_f6b9d6ea","line":243,"range":{"start_line":240,"start_character":39,"end_line":243,"end_character":63},"in_reply_to":"3ac371cc_00944935","updated":"2016-09-15 16:02:21.000000000","message":"I\u0027m afraid there\u0027s little extra coverage in that as we mock the node_cache.get_node_list function here (this function performs the filtering actually)","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f9269329192ac8ed3aaf64d5b2436267e4f0b0de","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":250,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dfalse\u0027)"},{"line_number":251,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":252,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: False,"},{"line_number":253,"context_line":"                                        \u0027error\u0027: None,"},{"line_number":254,"context_line":"                                        \u0027uuid\u0027: self.uuid,"},{"line_number":255,"context_line":"                                        \u0027links\u0027: self.links}]},"},{"line_number":256,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":257,"context_line":"        list_mock.assert_called_once_with(finished\u003dFalse)"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_409e4157","line":255,"range":{"start_line":252,"start_character":36,"end_line":255,"end_character":63},"updated":"2016-08-15 10:23:43.000000000","message":"ditto","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                                                      started_at\u003d42.0)]"},{"line_number":250,"context_line":"        res \u003d self.app.get(\u0027/v1/introspection?finished\u003dfalse\u0027)"},{"line_number":251,"context_line":"        self.assertEqual(200, res.status_code)"},{"line_number":252,"context_line":"        self.assertEqual({\u0027statuses\u0027: [{\u0027finished\u0027: False,"},{"line_number":253,"context_line":"                                        \u0027error\u0027: None,"},{"line_number":254,"context_line":"                                        \u0027uuid\u0027: self.uuid,"},{"line_number":255,"context_line":"                                        \u0027links\u0027: self.links}]},"},{"line_number":256,"context_line":"                         json.loads(res.data.decode(\u0027utf-8\u0027)))"},{"line_number":257,"context_line":"        list_mock.assert_called_once_with(finished\u003dFalse)"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_36c89e55","line":255,"range":{"start_line":252,"start_character":36,"end_line":255,"end_character":63},"in_reply_to":"3ac371cc_409e4157","updated":"2016-09-15 16:02:21.000000000","message":"ditto","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"}],"ironic_inspector/test/unit/test_node_cache.py":[{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"19ebd8eb71b9aabafb39a9610ef88334e1430ded","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(self.uuid, nodes[0].uuid)"},{"line_number":745,"context_line":"        self.assertIsNone(nodes[0].finished_at)"},{"line_number":746,"context_line":"        self.assertEqual(self.uuid2, nodes[1].uuid)"},{"line_number":747,"context_line":"        self.assertTrue(nodes[1].finished_at)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_4e9363fa","line":744,"range":{"start_line":744,"start_character":41,"end_line":744,"end_character":44},"updated":"2016-08-11 12:00:31.000000000","message":"Is the order of rows returned always consistent with the insertion order?","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"4a195cef8ae082e4a86ec244ebc5e01033afddec","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(self.uuid, nodes[0].uuid)"},{"line_number":745,"context_line":"        self.assertIsNone(nodes[0].finished_at)"},{"line_number":746,"context_line":"        self.assertEqual(self.uuid2, nodes[1].uuid)"},{"line_number":747,"context_line":"        self.assertTrue(nodes[1].finished_at)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_9648a4b4","line":744,"range":{"start_line":744,"start_character":41,"end_line":744,"end_character":44},"in_reply_to":"9ad45d7e_4e9363fa","updated":"2016-08-12 03:19:55.000000000","message":"seems not, will update to use a more stable way.","commit_id":"79a153323950c9dd66342597a7571ee7c860ddba"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f9269329192ac8ed3aaf64d5b2436267e4f0b0de","unresolved":false,"context_lines":[{"line_number":740,"context_line":"    def test_list_node(self):"},{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(set([self.uuid, self.uuid2]),"},{"line_number":745,"context_line":"                         set([node.uuid for node in nodes]))"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def test_list_node_finished(self):"},{"line_number":748,"context_line":"        nodes \u003d node_cache.get_node_list(finished\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_96899fcd","line":745,"range":{"start_line":743,"start_character":0,"end_line":745,"end_character":60},"updated":"2016-08-15 10:23:43.000000000","message":"nit: you could replace this with six.assertCountEqual","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"50bcfd38f4de57bcf40cde202407f333c1ff972b","unresolved":false,"context_lines":[{"line_number":740,"context_line":"    def test_list_node(self):"},{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(set([self.uuid, self.uuid2]),"},{"line_number":745,"context_line":"                         set([node.uuid for node in nodes]))"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def test_list_node_finished(self):"},{"line_number":748,"context_line":"        nodes \u003d node_cache.get_node_list(finished\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_62cd3d5d","line":745,"range":{"start_line":743,"start_character":0,"end_line":745,"end_character":60},"in_reply_to":"3ac371cc_3181d54b","updated":"2016-08-19 06:28:39.000000000","message":"good to know, thx!","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":740,"context_line":"    def test_list_node(self):"},{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(set([self.uuid, self.uuid2]),"},{"line_number":745,"context_line":"                         set([node.uuid for node in nodes]))"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def test_list_node_finished(self):"},{"line_number":748,"context_line":"        nodes \u003d node_cache.get_node_list(finished\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_f9bb8970","line":745,"range":{"start_line":743,"start_character":0,"end_line":745,"end_character":60},"in_reply_to":"3ac371cc_62cd3d5d","updated":"2016-09-15 16:02:21.000000000","message":"Done","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d8b95b7353f90e3d5e19473bb6f863a59a40b453","unresolved":false,"context_lines":[{"line_number":740,"context_line":"    def test_list_node(self):"},{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(set([self.uuid, self.uuid2]),"},{"line_number":745,"context_line":"                         set([node.uuid for node in nodes]))"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def test_list_node_finished(self):"},{"line_number":748,"context_line":"        nodes \u003d node_cache.get_node_list(finished\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_f64e1395","line":745,"range":{"start_line":743,"start_character":0,"end_line":745,"end_character":60},"in_reply_to":"3ac371cc_96899fcd","updated":"2016-08-15 10:24:51.000000000","message":"I\u0027d prefer we compare actual values, not only count.","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"cedafc6fd3c8171202ec380a0f51c35a8fc63f5b","unresolved":false,"context_lines":[{"line_number":740,"context_line":"    def test_list_node(self):"},{"line_number":741,"context_line":"        nodes \u003d node_cache.get_node_list()"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        self.assertEqual(2, len(nodes))"},{"line_number":744,"context_line":"        self.assertEqual(set([self.uuid, self.uuid2]),"},{"line_number":745,"context_line":"                         set([node.uuid for node in nodes]))"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def test_list_node_finished(self):"},{"line_number":748,"context_line":"        nodes \u003d node_cache.get_node_list(finished\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_3181d54b","line":745,"range":{"start_line":743,"start_character":0,"end_line":745,"end_character":60},"in_reply_to":"3ac371cc_f64e1395","updated":"2016-08-15 10:37:06.000000000","message":"yep, it exactly do this. It\u0027s alias for assertCountEqual() on Python 3 and assertItemsEqual() on Python 2. And also shows diff seq in case fail","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"fb260297ad75ee90e4a0f7d02464c2da86be9b8c","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            db.Node(uuid\u003dself.uuid2, started_at\u003d42.24,"},{"line_number":738,"context_line":"                    finished_at\u003d100.0).save(session)"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    # mind please node(self.uuid).started_at \u003e node(self.uuid2).statrted_at"},{"line_number":741,"context_line":"    # and the result ordering is strict in node_cache.get_node_list newer first"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_node(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_f86f8cf9","line":740,"updated":"2016-10-07 14:51:34.000000000","message":"Typo: \"started_at\"","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"ab3e301f079b0380294d71b594f08b3386c35dda","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            db.Node(uuid\u003dself.uuid2, started_at\u003d42.24,"},{"line_number":738,"context_line":"                    finished_at\u003d100.0).save(session)"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    # mind please node(self.uuid).started_at \u003e node(self.uuid2).statrted_at"},{"line_number":741,"context_line":"    # and the result ordering is strict in node_cache.get_node_list newer first"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_node(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a95cdbc_d141cb64","line":740,"in_reply_to":"1a95cdbc_f86f8cf9","updated":"2016-10-07 15:44:59.000000000","message":"Oops! :) will fix in next revision","commit_id":"519a447f40878f46944fbb24226ed39fbf29e57b"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"cea34d9519ea503ea9fb010276af7525ac358a60","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            db.Node(uuid\u003dself.uuid2, started_at\u003d42.24,"},{"line_number":738,"context_line":"                    finished_at\u003d100.0).save(session)"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    # mind please node(self.uuid).started_at \u003e node(self.uuid2).statrted_at"},{"line_number":741,"context_line":"    # and the result ordering is strict in node_cache.get_node_list newer first"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_node(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a77a97e_67252a09","line":740,"range":{"start_line":740,"start_character":64,"end_line":740,"end_character":75},"updated":"2016-11-21 13:39:06.000000000","message":"s/statrted_at/started_at","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d44c4b17ecadb5320a6b97ea46b08b2424fa763b","unresolved":false,"context_lines":[{"line_number":737,"context_line":"            db.Node(uuid\u003dself.uuid2, started_at\u003d42.24,"},{"line_number":738,"context_line":"                    finished_at\u003d100.0).save(session)"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    # mind please node(self.uuid).started_at \u003e node(self.uuid2).statrted_at"},{"line_number":741,"context_line":"    # and the result ordering is strict in node_cache.get_node_list newer first"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"    def test_list_node(self):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a77a97e_decec7b6","line":740,"range":{"start_line":740,"start_character":64,"end_line":740,"end_character":75},"in_reply_to":"7a77a97e_67252a09","updated":"2016-11-21 15:00:24.000000000","message":"Done","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"}],"releasenotes/notes/add-support-for-listing-all-introspection-statuses-2a3d4379c3854894.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"660730ef10bb1c9a0620d08408c752c8cd7363dc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add API for listing introspection statuses, operators"},{"line_number":4,"context_line":"    can get status for all introspection processing running"},{"line_number":5,"context_line":"    or run previously."},{"line_number":6,"context_line":"    Support filtering by \u0027finished\u0027 parameter,"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3ac371cc_138f8124","line":3,"updated":"2016-08-15 09:53:41.000000000","message":"if you want formatting (newlines, lists, etc) to work, use a different syntax:\n\n features:\n   - |\n     Blah-blah\n\nyou can check the formatting by running \"tox -ereleasenotes\" and then pointing your browser at releasenotes/build/html/index.html","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"53e3d0d93bd4106125f21f876ea248a3f52e9342","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add API for listing introspection statuses, operators"},{"line_number":4,"context_line":"    can get status for all introspection processing running"},{"line_number":5,"context_line":"    or run previously."},{"line_number":6,"context_line":"    Support filtering by \u0027finished\u0027 parameter,"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"7a8ec9b2_64f0ac91","line":3,"in_reply_to":"3ac371cc_138f8124","updated":"2016-09-15 16:02:21.000000000","message":"Done","commit_id":"d041a664f199d5bb3b8682b8983fb345c3aae39c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"   Introducing a new configuration section ``[api]`` and"},{"line_number":9,"context_line":"   the ``api.max_limit`` option that affects the pagination"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"other:"},{"line_number":12,"context_line":"  - pytz is now a dependency"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"fa6399be_f9edf3b7","line":9,"updated":"2016-10-13 10:46:49.000000000","message":"this is not an upgrade concern, as pagination was not a thing before. Please merge it into the feature above","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"8b4cca1985b875b3b0b0ba9f489c30923484896a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"   the ``api.max_limit`` option that affects the pagination"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"other:"},{"line_number":12,"context_line":"  - pytz is now a dependency"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"fa6399be_192d47fe","line":12,"updated":"2016-10-13 10:46:49.000000000","message":"and this should actually go to \"upgrade\"","commit_id":"801eb553dff181c13bbbf9eec3df01d8c9e4c503"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"cea34d9519ea503ea9fb010276af7525ac358a60","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"   Add an API endpoint for listing introspection statuses, operators can get"},{"line_number":5,"context_line":"   status for all introspection processing running or run previously."},{"line_number":6,"context_line":"   Introducing a new configuration option ``api_max_limit`` that affects the"},{"line_number":7,"context_line":"   pagination"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a77a97e_27e7b2ad","line":5,"range":{"start_line":5,"start_character":18,"end_line":5,"end_character":68},"updated":"2016-11-21 13:39:06.000000000","message":"for all running or previously run introspection processing.","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d44c4b17ecadb5320a6b97ea46b08b2424fa763b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"   Add an API endpoint for listing introspection statuses, operators can get"},{"line_number":5,"context_line":"   status for all introspection processing running or run previously."},{"line_number":6,"context_line":"   Introducing a new configuration option ``api_max_limit`` that affects the"},{"line_number":7,"context_line":"   pagination"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a77a97e_7ef5b3c9","line":5,"range":{"start_line":5,"start_character":18,"end_line":5,"end_character":68},"in_reply_to":"7a77a97e_27e7b2ad","updated":"2016-11-21 15:00:24.000000000","message":"Done","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"cea34d9519ea503ea9fb010276af7525ac358a60","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"   Add an API endpoint for listing introspection statuses, operators can get"},{"line_number":5,"context_line":"   status for all introspection processing running or run previously."},{"line_number":6,"context_line":"   Introducing a new configuration option ``api_max_limit`` that affects the"},{"line_number":7,"context_line":"   pagination"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a77a97e_07671626","line":7,"range":{"start_line":6,"start_character":3,"end_line":7,"end_character":13},"updated":"2016-11-21 13:39:06.000000000","message":"I feel like this should be a separate bullet point and info on how it affact pagination would be nice too, something like: \n\n- Introduced a new configuration option ``api_max_limit`` that defines the maximum number of items per page when API results are paginated.","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"d44c4b17ecadb5320a6b97ea46b08b2424fa763b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"   Add an API endpoint for listing introspection statuses, operators can get"},{"line_number":5,"context_line":"   status for all introspection processing running or run previously."},{"line_number":6,"context_line":"   Introducing a new configuration option ``api_max_limit`` that affects the"},{"line_number":7,"context_line":"   pagination"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a77a97e_beff4ba9","line":7,"range":{"start_line":6,"start_character":3,"end_line":7,"end_character":13},"in_reply_to":"7a77a97e_07671626","updated":"2016-11-21 15:00:24.000000000","message":"Done","commit_id":"7dc36a24930196bc370c2614a822cec370a57bc9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3580d4d0183f9cfaeab5afce050666cfba384ea9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Introduced a new configuration option ``api_max_limit`` that defines the"},{"line_number":9,"context_line":"    maximum number of items per page when API results are paginated."}],"source_content_type":"text/x-yaml","patch_set":36,"id":"7a77a97e_59bb8a75","line":9,"updated":"2016-11-22 10:04:17.000000000","message":"nit: this is not a separate feature, rather part of the previous one","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"1364f39b645ef6f170f547987517a726d1c8e90e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Introduced a new configuration option ``api_max_limit`` that defines the"},{"line_number":9,"context_line":"    maximum number of items per page when API results are paginated."}],"source_content_type":"text/x-yaml","patch_set":36,"id":"5a74a57a_8d997571","line":9,"in_reply_to":"7a77a97e_12cd56b7","updated":"2016-11-23 15:18:25.000000000","message":"The reason I suggested it be separate is because it isn\u0027t/shouldn\u0027t be seen as being tied to just the introspection list API (even if that might be the only one using it right now)","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"},{"author":{"_account_id":18653,"name":"Milan Kováčik","email":"mkovacik@redhat.com","username":"dparalen"},"change_message_id":"b238f582bb62449b15807c83b172396bbea96cbb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Introduced a new configuration option ``api_max_limit`` that defines the"},{"line_number":9,"context_line":"    maximum number of items per page when API results are paginated."}],"source_content_type":"text/x-yaml","patch_set":36,"id":"7a77a97e_12cd56b7","line":9,"in_reply_to":"7a77a97e_59bb8a75","updated":"2016-11-22 15:33:56.000000000","message":"hmmm, Sam wanted it as a separate bullet, not sure what to do","commit_id":"7cb40d5fec9e78b68223d5efdbc4bee30b02c3ee"}]}
