)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8a50d7e55d5e4a3090a703150a14157b778ddf53","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements bp:service-catalog-tng"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I12d41255e7b809111fd26eb6588ea24e9b4cb3af"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Co-Authored-By: Augustina Ragwitz \u003cauggy@cpan.org\u003e"},{"line_number":22,"context_line":"Change-Id: Id92251243d9e92f30e466419110fce5781304823"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa80f949_4b85fd04","line":19,"updated":"2015-11-06 00:22:56.000000000","message":"This needs to depend on https://review.openstack.org/#/c/181393/ also for concrete consensus on whole OpenStack projects.","commit_id":"bac899d175206eabf541fd7fa8cf19b0b5a3643a"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"4d4d67972a33326c0e2f8f9f2b85383102fa5b51","unresolved":false,"context_lines":[{"line_number":12,"context_line":"A change had to be made to the invalid version tests, because the"},{"line_number":13,"context_line":"routes that were not previously valid, now are."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Before Merge: needs unit tests"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements bp:service-catalog-tng"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9a8ffd7b_30ad589b","line":15,"updated":"2015-12-03 02:06:08.000000000","message":"Current patch contains unit tests.\nSo can we remove this line?","commit_id":"4ffd2c9018ba2bbe86cc0bc6b3b2f133c819f6bc"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"e2bb957ba1fab3d576251d83064bbba19b9cbccc","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make project_id optional in v2.1 urls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The follow establishes a set of routes that makes project_id an"},{"line_number":10,"context_line":"optional construct in v2.1."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"A change had to be made to the invalid version tests, because the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa69d971_5ac6e868","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":10},"updated":"2016-01-06 02:03:11.000000000","message":"following","commit_id":"48e436bc85803cb474b78e9d7a04cd25efe7027d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"5a46b03c78b6bee96567bd75b76c88a4bae7d903","unresolved":false,"context_lines":[{"line_number":13,"context_line":"routes that were not previously valid, now are."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements bp:service-catalog-tng"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Co-Authored-By: Augustina Ragwitz \u003cauggy@cpan.org\u003e"},{"line_number":18,"context_line":"Change-Id: Id92251243d9e92f30e466419110fce5781304823"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"fa69d971_777d93e6","line":16,"updated":"2016-01-08 02:58:28.000000000","message":"I tested this patch and confirmed this works fine like:\n\n* Without project-id and microversion\n $ curl -g -i -X GET http://192.168.11.66:8774/v2.1/servers -H \"Accept: application/json\" -H \"X-Auth-Token: fe44fb29762b46588d8fd732316417f3\"\n HTTP/1.1 200 OK\n Content-Length: 15\n Content-Type: application/json\n X-Openstack-Nova-Api-Version: 2.1\n Vary: X-OpenStack-Nova-API-Version\n X-Compute-Request-Id: req-937dfd32-1e0e-45e0-9699-2b6e4c17b923\n Date: Fri, 08 Jan 2016 02:53:43 GMT\n \n {\"servers\": []}\n\n* Without project-id\n $ curl -g -i -X GET http://192.168.11.66:8774/v2.1/servers -H \"Accept: application/json\" -H \"X-OpenStack-Nova-API-Version: 2.15\" -H \"X-Auth-Token: fe44fb29762b46588d8fd732316417f3\"\n HTTP/1.1 200 OK\n Content-Length: 15\n Content-Type: application/json\n X-Openstack-Nova-Api-Version: 2.15\n Vary: X-OpenStack-Nova-API-Version\n X-Compute-Request-Id: req-aaa214a5-62ac-4127-b10d-02657ff68954\n Date: Fri, 08 Jan 2016 02:54:12 GMT\n \n {\"servers\": []}\n\n* With project-id\n $ curl -g -i -X GET http://192.168.11.66:8774/v2.1/79c88c8a244b4b0c9a774c49c65c0dd6/servers -H \"Accept: application/json\" -H \"X-Auth-Token: fe44fb29762b46588d8fd732316417f3\"\n HTTP/1.1 200 OK\n Content-Length: 15\n Content-Type: application/json\n X-Openstack-Nova-Api-Version: 2.1\n Vary: X-OpenStack-Nova-API-Version\n X-Compute-Request-Id: req-51a14b25-1f13-4072-9a46-8eb89654335c\n Date: Fri, 08 Jan 2016 02:54:47 GMT\n \n {\"servers\": []}\n\nSo technically, this patch is good for me. but as I said, the corresponding openstack-spec(https://review.openstack.org/#/c/181393/) is not approved yet.\nSo if this commit message contains the following line, I +2 for this.\n\n Depends-On: I1d74149b1f9f7739a630e2b52392a786a414776e","commit_id":"03bda3d9d41f0f88e0a66f82b1df4193b9af90d9"}],"nova/api/openstack/__init__.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"decc9a65b9495425931208ad0e4659b80de2220d","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                                   p_member)"},{"line_number":221,"context_line":"        routes.Mapper.resource(self, member_name,"},{"line_number":222,"context_line":"                                     collection_name,"},{"line_number":223,"context_line":"                                     **kwargs)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"class PlainMapper(APIMapper):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a740942_73566fcf","line":223,"updated":"2015-12-14 06:43:07.000000000","message":"We have legacy v2 compatible mode for v2.1 wsgi stack. So I guess we need skip those when this is legacy v2 compatible mode.","commit_id":"4235ef4fb4227d7592e96b44efb5ff4c2a2b3a0a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"35466625821c08b3f8d4224f334477e23336f413","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                                   p_member)"},{"line_number":221,"context_line":"        routes.Mapper.resource(self, member_name,"},{"line_number":222,"context_line":"                                     collection_name,"},{"line_number":223,"context_line":"                                     **kwargs)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"class PlainMapper(APIMapper):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a710552_d75258dd","line":223,"in_reply_to":"5a710552_614bbe2c","updated":"2015-12-15 08:03:07.000000000","message":"I dig into the code today. Found this isn\u0027t easy. :( I only found this way https://review.openstack.org/#/c/257719/  And It feel like a little hacky.","commit_id":"4235ef4fb4227d7592e96b44efb5ff4c2a2b3a0a"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"47589642825c3574293dedac7579a685eda9c578","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                                   p_member)"},{"line_number":221,"context_line":"        routes.Mapper.resource(self, member_name,"},{"line_number":222,"context_line":"                                     collection_name,"},{"line_number":223,"context_line":"                                     **kwargs)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"class PlainMapper(APIMapper):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a710552_614bbe2c","line":223,"in_reply_to":"7a740942_73566fcf","updated":"2015-12-14 18:35:32.000000000","message":"That\u0027s probably a good point, got a suggestion on how to best detect that?","commit_id":"4235ef4fb4227d7592e96b44efb5ff4c2a2b3a0a"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    \u0027After that point you have to run all of the API.\u0027,"},{"line_number":63,"context_line":"                    deprecated_for_removal\u003dTrue, deprecated_group\u003d\u0027osapi_v21\u0027),"},{"line_number":64,"context_line":"        cfg.StrOpt(\u0027project_id_regex\u0027,"},{"line_number":65,"context_line":"                   default\u003dNone,"},{"line_number":66,"context_line":"                   help\u003d\u0027DEPRECATED: The validation regex for project_ids \u0027"},{"line_number":67,"context_line":"                   \u0027used in urls. This defaults to [0-9a-f\\-]+ if not set, \u0027"},{"line_number":68,"context_line":"                   \u0027which matches normal uuids created by keystone.\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_7554efc8","line":65,"updated":"2016-01-15 14:20:05.000000000","message":"I\u0027m not using default on purpose so that we can figure out later if someone set this in their file or not.","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    \u0027After that point you have to run all of the API.\u0027,"},{"line_number":63,"context_line":"                    deprecated_for_removal\u003dTrue, deprecated_group\u003d\u0027osapi_v21\u0027),"},{"line_number":64,"context_line":"        cfg.StrOpt(\u0027project_id_regex\u0027,"},{"line_number":65,"context_line":"                   default\u003dNone,"},{"line_number":66,"context_line":"                   help\u003d\u0027DEPRECATED: The validation regex for project_ids \u0027"},{"line_number":67,"context_line":"                   \u0027used in urls. This defaults to [0-9a-f\\-]+ if not set, \u0027"},{"line_number":68,"context_line":"                   \u0027which matches normal uuids created by keystone.\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_3092054d","line":65,"updated":"2016-01-15 14:41:52.000000000","message":"default is not used so we can figure out later if someone set this value (even to the default value that we have).","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def resource(self, member_name, collection_name, **kwargs):"},{"line_number":205,"context_line":"        # NOTE(sdague): project_id parameter is only valid if it looks"},{"line_number":206,"context_line":"        # like a project_id, which is exactly 32 hex characters, lower"},{"line_number":207,"context_line":"        # case, no dashes."},{"line_number":208,"context_line":"        project_id_regex \u003d \u0027[0-9a-f\\-]+\u0027"},{"line_number":209,"context_line":"        if CONF.osapi_v21.project_id_regex:"},{"line_number":210,"context_line":"            project_id_regex \u003d CONF.osapi_v21.project_id_regex"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_d11e0a5e","line":207,"updated":"2016-01-15 15:26:49.000000000","message":"This comment is now out of date with the addition of \\-. Maybe add a little \"oh yeah, we also added this bit of flexibility just in case\"","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0f176be12dd067d30e8c7e710642e5edec70ac29","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                p_member)"},{"line_number":223,"context_line":"        routes.Mapper.resource(self, member_name,"},{"line_number":224,"context_line":"                                     collection_name,"},{"line_number":225,"context_line":"                                     **kwargs)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # while we are in transition mode, create additional routes"},{"line_number":228,"context_line":"        # for the resource that do not include project_id."}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_abc76494","line":225,"updated":"2016-01-15 15:18:34.000000000","message":"These are indented too much.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"07c273ad45a7f9f58a48b2a0da3a26879cb1d6e8","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            self,"},{"line_number":225,"context_line":"            member_name,"},{"line_number":226,"context_line":"            collection_name,"},{"line_number":227,"context_line":"            **kwargs)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # while we are in transition mode, create additional routes"},{"line_number":230,"context_line":"        # for the resource that do not include project_id."}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_b1491633","line":227,"updated":"2016-01-15 15:32:23.000000000","message":"Was this underindenting a snarky reply to Dan? :)","commit_id":"554e74cc931632be6d0e486ff12461d95a70360b"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"832be848fc8b255726c6a7f880b0125a83e20c51","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            self,"},{"line_number":225,"context_line":"            member_name,"},{"line_number":226,"context_line":"            collection_name,"},{"line_number":227,"context_line":"            **kwargs)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # while we are in transition mode, create additional routes"},{"line_number":230,"context_line":"        # for the resource that do not include project_id."}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_f1846ed3","line":227,"in_reply_to":"da6ed579_b1491633","updated":"2016-01-15 15:41:24.000000000","message":"this is valid indenting... are we really going to bike shed on it?","commit_id":"554e74cc931632be6d0e486ff12461d95a70360b"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"65766aee8c9ffd4a143cccaeaccb70efe7396b7f","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            self,"},{"line_number":225,"context_line":"            member_name,"},{"line_number":226,"context_line":"            collection_name,"},{"line_number":227,"context_line":"            **kwargs)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # while we are in transition mode, create additional routes"},{"line_number":230,"context_line":"        # for the resource that do not include project_id."}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_d4b113e1","line":227,"in_reply_to":"da6ed579_f1846ed3","updated":"2016-01-15 17:09:18.000000000","message":"Heh, not at all. I just saw that you copied the identical indentation on L240-241, and instead of pointing that out, went to the opposite extreme.","commit_id":"554e74cc931632be6d0e486ff12461d95a70360b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a53235ded1455ebc9e67e7914d9c16f16c26ef72","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def resource(self, member_name, collection_name, **kwargs):"},{"line_number":205,"context_line":"        # NOTE(sdague): project_id parameter is only valid it it\u0027s hex"},{"line_number":206,"context_line":"        # or hex + dashes (note, integers are a subset of this). This"},{"line_number":207,"context_line":"        # is required to hand our overlaping routes issues."},{"line_number":208,"context_line":"        project_id_regex \u003d \u0027[0-9a-f\\-]+\u0027"},{"line_number":209,"context_line":"        if CONF.osapi_v21.project_id_regex:"},{"line_number":210,"context_line":"            project_id_regex \u003d CONF.osapi_v21.project_id_regex"}],"source_content_type":"text/x-python","patch_set":23,"id":"da6ed579_d41ef85d","line":207,"updated":"2016-01-15 15:44:28.000000000","message":"handle? :)","commit_id":"b407f4efd6b6ee1f569232740f35c8d909c3194f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ec2654ca072b1c38e51dced73cc19f475c67bba","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def resource(self, member_name, collection_name, **kwargs):"},{"line_number":205,"context_line":"        # NOTE(sdague): project_id parameter is only valid it it\u0027s hex"},{"line_number":206,"context_line":"        # or hex + dashes (note, integers are a subset of this). This"},{"line_number":207,"context_line":"        # is required to handle our overlaping routes issues."},{"line_number":208,"context_line":"        project_id_regex \u003d \u0027[0-9a-f\\-]+\u0027"},{"line_number":209,"context_line":"        if CONF.osapi_v21.project_id_regex:"},{"line_number":210,"context_line":"            project_id_regex \u003d CONF.osapi_v21.project_id_regex"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_54bd2800","line":207,"range":{"start_line":207,"start_character":36,"end_line":207,"end_character":46},"updated":"2016-01-15 15:48:04.000000000","message":"overlapping :)","commit_id":"942427c2fc5d3cc0f6a706765a69fe133cd6f9d8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8906afee60d6ee2db82146371f5161d2852b603d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    \u0027After that point you have to run all of the API.\u0027,"},{"line_number":63,"context_line":"                    deprecated_for_removal\u003dTrue, deprecated_group\u003d\u0027osapi_v21\u0027),"},{"line_number":64,"context_line":"        cfg.StrOpt(\u0027project_id_regex\u0027,"},{"line_number":65,"context_line":"                   default\u003dNone,"},{"line_number":66,"context_line":"                   help\u003d\u0027DEPRECATED: The validation regex for project_ids \u0027"},{"line_number":67,"context_line":"                   \u0027used in urls. This defaults to [0-9a-f\\-]+ if not set, \u0027"},{"line_number":68,"context_line":"                   \u0027which matches normal uuids created by keystone.\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_ea1af516","line":65,"updated":"2016-01-19 13:34:19.000000000","message":"Nit, I think we usually leave off the default for StrOpts now, if we use it like this.","commit_id":"e6cb55d3a58b6c2f5fb2cd8471d5e4d776d0c058"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"eaffe5bf18e36dc4015d0c18793294cdf60ba921","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"class ProjectMapper(APIMapper):"},{"line_number":204,"context_line":"    def resource(self, member_name, collection_name, **kwargs):"},{"line_number":205,"context_line":"        # NOTE(sdague): project_id parameter is only valid it it\u0027s hex"},{"line_number":206,"context_line":"        # or hex + dashes (note, integers are a subset of this). This"},{"line_number":207,"context_line":"        # is required to hand our overlaping routes issues."},{"line_number":208,"context_line":"        project_id_regex \u003d \u0027[0-9a-f\\-]+\u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba63e191_0532daf1","line":205,"range":{"start_line":205,"start_character":53,"end_line":205,"end_character":58},"updated":"2016-01-19 13:37:16.000000000","message":"s/it/if/","commit_id":"86ca213817e4c896425c1ad24dbaadce9bf73596"}],"nova/api/openstack/auth.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eeba9193d850d0f1b17231feb1756c793f1a36f3","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"# NOTE(auggy): used to make project_id optional for functional tests"},{"line_number":78,"context_line":"class NoAuthMiddlewareV2_15(NoAuthMiddlewareBase):"},{"line_number":79,"context_line":"    \"\"\"Return a fake token if one isn\u0027t specified."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    This provides a version of the middleware which does not add"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_d0528966","line":78,"updated":"2016-01-15 15:04:09.000000000","message":"This should be bumped to the current proposed microversion, v2.16","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e90b7fd80a6d9799df6b615205df9c67dbe91398","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return self.base_call(req, True, always_admin\u003dFalse)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class NoAuthMiddlewareV2_16(NoAuthMiddlewareBase):"},{"line_number":78,"context_line":"    \"\"\"Return a fake token if one isn\u0027t specified."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    This provides a version of the middleware which does not add"}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_7c25735a","line":77,"range":{"start_line":77,"start_character":0,"end_line":77,"end_character":50},"updated":"2016-01-18 07:31:57.000000000","message":"Not sure we still need keep this class. As there isn\u0027t anyone use it in the real world","commit_id":"ab34aee7143e7c6d943f2676a46ce92fe2153e4b"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"18eb72e101b0c73bcfbf534e3707edd56c338651","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return self.base_call(req, True, always_admin\u003dFalse)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"class NoAuthMiddlewareV2_16(NoAuthMiddlewareBase):"},{"line_number":78,"context_line":"    \"\"\"Return a fake token if one isn\u0027t specified."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    This provides a version of the middleware which does not add"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_10353d45","line":77,"range":{"start_line":77,"start_character":0,"end_line":77,"end_character":50},"in_reply_to":"da6ed579_7c25735a","updated":"2016-01-19 12:01:16.000000000","message":"We need it for testing","commit_id":"ab34aee7143e7c6d943f2676a46ce92fe2153e4b"}],"nova/api/openstack/compute/image_metadata.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def image_metadata_map(self, mapper, wsgi_resource):"},{"line_number":153,"context_line":"        mapper.connect(\"metadata\","},{"line_number":154,"context_line":"                       \"/{project_id}/images/{image_id}/metadata\","},{"line_number":155,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":156,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":157,"context_line":"        # Also connect the non project_id route"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_35d67728","line":154,"updated":"2016-01-15 14:20:05.000000000","message":"because this route is really deep (and can\u0027t overlap), we don\u0027t need to validate project_id here","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def image_metadata_map(self, mapper, wsgi_resource):"},{"line_number":153,"context_line":"        mapper.connect(\"metadata\","},{"line_number":154,"context_line":"                       \"/{project_id}/images/{image_id}/metadata\","},{"line_number":155,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":156,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":157,"context_line":"        # Also connect the non project_id route"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_d0a12995","line":154,"updated":"2016-01-15 14:41:52.000000000","message":"we don\u0027t need to be strict on project_id here because the routes are so deep that overlap will not happen.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e90b7fd80a6d9799df6b615205df9c67dbe91398","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def image_metadata_map(self, mapper, wsgi_resource):"},{"line_number":153,"context_line":"        mapper.connect(\"metadata\","},{"line_number":154,"context_line":"                       \"/{project_id}/images/{image_id}/metadata\","},{"line_number":155,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":156,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":157,"context_line":"        # Also connect the non project_id route"}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_d6a560b5","line":154,"range":{"start_line":154,"start_character":25,"end_line":154,"end_character":37},"updated":"2016-01-18 07:31:57.000000000","message":"we need regex also at here if I didn\u0027t miss something.","commit_id":"ab34aee7143e7c6d943f2676a46ce92fe2153e4b"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"18eb72e101b0c73bcfbf534e3707edd56c338651","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def image_metadata_map(self, mapper, wsgi_resource):"},{"line_number":153,"context_line":"        mapper.connect(\"metadata\","},{"line_number":154,"context_line":"                       \"/{project_id}/images/{image_id}/metadata\","},{"line_number":155,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":156,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":157,"context_line":"        # Also connect the non project_id route"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_d03fa523","line":154,"range":{"start_line":154,"start_character":25,"end_line":154,"end_character":37},"in_reply_to":"da6ed579_d6a560b5","updated":"2016-01-19 12:01:16.000000000","message":"as explained in earlier patch sets, we don\u0027t, becauce the resource is so deep it won\u0027t match.","commit_id":"ab34aee7143e7c6d943f2676a46ce92fe2153e4b"}],"nova/api/openstack/compute/server_metadata.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def server_metadata_map(self, mapper, wsgi_resource):"},{"line_number":190,"context_line":"        mapper.connect(\"metadata\","},{"line_number":191,"context_line":"                       \"/{project_id}/servers/{server_id}/metadata\","},{"line_number":192,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":193,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":194,"context_line":"        # Also connect the non project_id routes"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_f5dbff4c","line":191,"updated":"2016-01-15 14:20:05.000000000","message":"because this route is really deep (and can\u0027t overlap), we don\u0027t need to validate project_id here","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def server_metadata_map(self, mapper, wsgi_resource):"},{"line_number":190,"context_line":"        mapper.connect(\"metadata\","},{"line_number":191,"context_line":"                       \"/{project_id}/servers/{server_id}/metadata\","},{"line_number":192,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":193,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":194,"context_line":"        # Also connect the non project_id routes"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_30b9a5cc","line":191,"updated":"2016-01-15 14:41:52.000000000","message":"we don\u0027t need to be strict on project_id here because the routes are so deep that overlap will not happen.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e90b7fd80a6d9799df6b615205df9c67dbe91398","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def server_metadata_map(self, mapper, wsgi_resource):"},{"line_number":190,"context_line":"        mapper.connect(\"metadata\","},{"line_number":191,"context_line":"                       \"/{project_id}/servers/{server_id}/metadata\","},{"line_number":192,"context_line":"                       controller\u003dwsgi_resource,"},{"line_number":193,"context_line":"                       action\u003d\u0027update_all\u0027, conditions\u003d{\"method\": [\u0027PUT\u0027]})"},{"line_number":194,"context_line":"        # Also connect the non project_id routes"}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_76b3540b","line":191,"range":{"start_line":191,"start_character":25,"end_line":191,"end_character":37},"updated":"2016-01-18 07:31:57.000000000","message":"We need regex at here also","commit_id":"ab34aee7143e7c6d943f2676a46ce92fe2153e4b"}],"nova/tests/functional/api_paste_fixture.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            \"paste.filter_factory \u003d nova.api.openstack.auth:\""},{"line_number":64,"context_line":"            \"NoAuthMiddleware.factory\","},{"line_number":65,"context_line":"            \"paste.filter_factory \u003d nova.api.openstack.auth:\""},{"line_number":66,"context_line":"            \"NoAuthMiddlewareV2_15.factory\")"},{"line_number":67,"context_line":"        target_file.write(line)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_913df2c5","line":66,"updated":"2016-01-15 15:26:49.000000000","message":"Is this 2_15 here and above related to the microversion? If so, should it be 16 now? If not, where is the number coming from?","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eeba9193d850d0f1b17231feb1756c793f1a36f3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            \"paste.filter_factory \u003d nova.api.openstack.auth:\""},{"line_number":64,"context_line":"            \"NoAuthMiddleware.factory\","},{"line_number":65,"context_line":"            \"paste.filter_factory \u003d nova.api.openstack.auth:\""},{"line_number":66,"context_line":"            \"NoAuthMiddlewareV2_15.factory\")"},{"line_number":67,"context_line":"        target_file.write(line)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_50f45959","line":66,"range":{"start_line":66,"start_character":28,"end_line":66,"end_character":34},"updated":"2016-01-15 15:04:09.000000000","message":"This should be bumped to the current proposed microversion, v2.16","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"}],"nova/tests/functional/api_sample_tests/api_sample_base.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                api_paste_fixture.ApiPasteLegacyV2Fixture]}),"},{"line_number":87,"context_line":"        # test v2.13 code without project id"},{"line_number":88,"context_line":"        (\u0027v2_1_noproject_id\u0027, {"},{"line_number":89,"context_line":"            \u0027_api_version\u0027: \u0027v2.1\u0027,"},{"line_number":90,"context_line":"            \u0027_project_id\u0027: False,"},{"line_number":91,"context_line":"            \u0027_additional_fixtures\u0027: ["},{"line_number":92,"context_line":"                api_paste_fixture.ApiPasteNoProjectId]})"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_55a76bbc","line":89,"updated":"2016-01-15 14:20:05.000000000","message":"gah, this was missed. Will update with this being api_major_version.","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eeba9193d850d0f1b17231feb1756c793f1a36f3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            \u0027_legacy_v2_code\u0027: True,"},{"line_number":85,"context_line":"            \u0027_additional_fixtures\u0027: ["},{"line_number":86,"context_line":"                api_paste_fixture.ApiPasteLegacyV2Fixture]}),"},{"line_number":87,"context_line":"        # test v2.13 code without project id"},{"line_number":88,"context_line":"        (\u0027v2_1_noproject_id\u0027, {"},{"line_number":89,"context_line":"            \u0027api_major_version\u0027: \u0027v2.1\u0027,"},{"line_number":90,"context_line":"            \u0027_project_id\u0027: False,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_8b4f0033","line":87,"range":{"start_line":87,"start_character":15,"end_line":87,"end_character":20},"updated":"2016-01-15 15:04:09.000000000","message":"This should be bumped to the current proposed microversion, v2.16","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            \u0027api_major_version\u0027: \u0027v2.1\u0027,"},{"line_number":90,"context_line":"            \u0027_project_id\u0027: False,"},{"line_number":91,"context_line":"            \u0027_additional_fixtures\u0027: ["},{"line_number":92,"context_line":"                api_paste_fixture.ApiPasteNoProjectId]})"},{"line_number":93,"context_line":"    ]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_d0c84957","line":92,"updated":"2016-01-15 14:41:52.000000000","message":"this is how we test things, we run another run of all samples tests without the project_id in the url","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"eaffe5bf18e36dc4015d0c18793294cdf60ba921","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            \u0027_legacy_v2_code\u0027: True,"},{"line_number":85,"context_line":"            \u0027_additional_fixtures\u0027: ["},{"line_number":86,"context_line":"                api_paste_fixture.ApiPasteLegacyV2Fixture]}),"},{"line_number":87,"context_line":"        # test v2.16 code without project id"},{"line_number":88,"context_line":"        (\u0027v2_1_noproject_id\u0027, {"},{"line_number":89,"context_line":"            \u0027api_major_version\u0027: \u0027v2.1\u0027,"},{"line_number":90,"context_line":"            \u0027_project_id\u0027: False,"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba63e191_453f72b4","line":87,"range":{"start_line":87,"start_character":18,"end_line":87,"end_character":20},"updated":"2016-01-19 13:37:16.000000000","message":"s/16/17/","commit_id":"86ca213817e4c896425c1ad24dbaadce9bf73596"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8f061fd5699ff26c74c78cc5899185938c908472","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            \u0027_legacy_v2_code\u0027: True,"},{"line_number":85,"context_line":"            \u0027_additional_fixtures\u0027: ["},{"line_number":86,"context_line":"                api_paste_fixture.ApiPasteLegacyV2Fixture]}),"},{"line_number":87,"context_line":"        # test v2.16 code without project id"},{"line_number":88,"context_line":"        (\u0027v2_1_noproject_id\u0027, {"},{"line_number":89,"context_line":"            \u0027api_major_version\u0027: \u0027v2.1\u0027,"},{"line_number":90,"context_line":"            \u0027_project_id\u0027: False,"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba63e191_30a4faa4","line":87,"range":{"start_line":87,"start_character":18,"end_line":87,"end_character":20},"in_reply_to":"ba63e191_453f72b4","updated":"2016-01-19 13:57:54.000000000","message":"lets fix that in a follow up patch.","commit_id":"86ca213817e4c896425c1ad24dbaadce9bf73596"}],"nova/tests/functional/api_samples_test_base.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"7e9d99b7ad76506fe677d928581390c1cbcae120","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        new_url \u003d self._get_host()"},{"line_number":263,"context_line":"        if self._project_id:"},{"line_number":264,"context_line":"            new_url +\u003d \"/openstack\""},{"line_number":265,"context_line":"        updated_data \u003d re.sub(url_re, new_url, updated_data)"},{"line_number":266,"context_line":"        return updated_data"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def _verify_response(self, name, subs, response, exp_code,"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_f510df5a","line":265,"updated":"2016-01-15 14:26:01.000000000","message":"This is pretty much the only tricky part. The templates have service_url in them so when running with no_project_id they don\u0027t have it. However the samples/docs do. This let\u0027s us on the fly transfor the doc files to drop the \u0027openstack\u0027 tenant out of links so the compare still works.","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        new_url \u003d self._get_host()"},{"line_number":263,"context_line":"        if self._project_id:"},{"line_number":264,"context_line":"            new_url +\u003d \"/openstack\""},{"line_number":265,"context_line":"        updated_data \u003d re.sub(url_re, new_url, updated_data)"},{"line_number":266,"context_line":"        return updated_data"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def _verify_response(self, name, subs, response, exp_code,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_f081cdc3","line":265,"updated":"2016-01-15 14:41:52.000000000","message":"This is the trickiest part of this patch.\n\nOur api_samples templates now have %(compute_endpoint) in them, so when testing samples templates we\u0027re fine with or without project_id.\n\nHowever, we also then test the generated content from the templates against the stack \u0027docs/\u0027, which embed \u0027openstack\u0027 as the project_id. So that we don\u0027t also generate a whole new doc set, we munge links in the docs when testing so they can go either way.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        new_url \u003d self._get_host()"},{"line_number":263,"context_line":"        if self._project_id:"},{"line_number":264,"context_line":"            new_url +\u003d \"/openstack\""},{"line_number":265,"context_line":"        updated_data \u003d re.sub(url_re, new_url, updated_data)"},{"line_number":266,"context_line":"        return updated_data"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def _verify_response(self, name, subs, response, exp_code,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_f121ce9e","line":265,"updated":"2016-01-15 15:26:49.000000000","message":"seems reasonable","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"}],"nova/tests/unit/api/openstack/compute/test_auth.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova.tests.unit.api.openstack import fakes"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestNoAuthMiddleware(testscenarios.WithScenarios, test.NoDBTestCase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    scenarios \u003d ["},{"line_number":33,"context_line":"        (\u0027project_id\u0027, {"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_10a10146","line":30,"updated":"2016-01-15 14:41:52.000000000","message":"This is slightly more refactoring than I normally like with a test, however the alternative test patch was really gorpy. This makes it more clear that we\u0027re running all the tests with 2 scenarios and the only differences is middleware and expected url.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eeba9193d850d0f1b17231feb1756c793f1a36f3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            \u0027auth_middleware\u0027: auth.NoAuthMiddleware}),"},{"line_number":36,"context_line":"        (\u0027no_project_id\u0027, {"},{"line_number":37,"context_line":"            \u0027expected_url\u0027: \u0027http://localhost/v2.1\u0027,"},{"line_number":38,"context_line":"            \u0027auth_middleware\u0027: auth.NoAuthMiddlewareV2_15}),"},{"line_number":39,"context_line":"    ]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_2bf1346b","line":38,"range":{"start_line":38,"start_character":52,"end_line":38,"end_character":57},"updated":"2016-01-15 15:04:09.000000000","message":"This should be bumped to the current proposed microversion, v2.16","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"}],"nova/tests/unit/api/openstack/compute/test_versions.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self._test_get_version_2_detail(\u0027/\u0027, accept\u003daccept)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_get_version_2_versions_invalid(self):"},{"line_number":197,"context_line":"        req \u003d webob.Request.blank(\u0027/v2/versions/1234/foo\u0027)"},{"line_number":198,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":199,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":200,"context_line":"        self.assertEqual(404, res.status_int)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_f5ae9f7f","line":197,"updated":"2016-01-15 14:20:05.000000000","message":"the new regexes made this match","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self._test_get_version_2_detail(\u0027/\u0027, accept\u003daccept)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_get_version_2_versions_invalid(self):"},{"line_number":197,"context_line":"        req \u003d webob.Request.blank(\u0027/v2/versions/1234/foo\u0027)"},{"line_number":198,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":199,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":200,"context_line":"        self.assertEqual(404, res.status_int)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_712e3e8d","line":197,"updated":"2016-01-15 15:26:49.000000000","message":"gabbi and wsgi-intercet! ;)","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        self._test_get_version_2_detail(\u0027/\u0027, accept\u003daccept)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_get_version_2_versions_invalid(self):"},{"line_number":197,"context_line":"        req \u003d webob.Request.blank(\u0027/v2/versions/1234/foo\u0027)"},{"line_number":198,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":199,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":200,"context_line":"        self.assertEqual(404, res.status_int)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_90a4114b","line":197,"updated":"2016-01-15 14:41:52.000000000","message":"these started overlapping with the new regex, so they were adjusted. fakes.wsgi_app... are quite bad replications of wsgi apps sadly.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"}],"nova/tests/unit/conf_fixture.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"dff706ea70354ec1b8204e05070342b13318e158","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da6ed579_75c38f38","line":67,"updated":"2016-01-15 14:20:05.000000000","message":"This means openstack and fake can also match","commit_id":"d8fe7f7d2c9069ba3e26dcb2d410326d60627cd4"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_5133faf5","line":67,"updated":"2016-01-15 15:26:49.000000000","message":"This would be more clear as (?:[0-9a-f\\-]+|fake|openstack) (or whatever the correct regex is). What you\u0027ve got is fun, but should either be explicit or have a comment explaining its weirdness. And maybe a \"kill me later please\" NOTE.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"ad27e0eab1456ea6bb08a50493c3b5452704706f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_b07a75bb","line":67,"updated":"2016-01-15 14:41:52.000000000","message":"and now we have project_ids that also match \u0027fake\u0027 and \u0027openstack\u0027","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"df8d31f3dd86fe6ae70baa249db3162f96480ab3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_71fddeaf","line":67,"in_reply_to":"da6ed579_5133faf5","updated":"2016-01-15 15:33:04.000000000","message":"because routes.Mapper.resource does not yet support \u0027requirements\u0027 param (PR is up and ready to go), the complexity level of regex that can be used is actually pretty low, because it is parsed out of the string by a not very robust parser. Adding our own () probably breaks the extraction of project_id.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eeba9193d850d0f1b17231feb1756c793f1a36f3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_cbf17702","line":67,"in_reply_to":"da6ed579_b07a75bb","updated":"2016-01-15 15:04:09.000000000","message":"But they will also match a lot more than that, too, such as \u0027kook\u0027 and \u0027post\u0027 and \u0027oooooooo\u0027. This pattern will *only* match hex with or without dashes, \u0027fake\u0027, and \u0027openstack\u0027.\n\n\u0027[0-9a-f-]+|openstack|fake\u0027\n\nLater when we clean up the tests, we can remove the two extra cases from the regex when they are no longer needed.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"7706089a39c7cd11eab1b9f544bf065b0f239895","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.conf.set_default(\u0027fatal_exception_format_errors\u0027, True)"},{"line_number":65,"context_line":"        self.conf.set_default(\u0027enabled\u0027, True, \u0027osapi_v21\u0027)"},{"line_number":66,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":67,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":68,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":69,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":70,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_eb6ebbfe","line":67,"in_reply_to":"da6ed579_cbf17702","updated":"2016-01-15 15:10:51.000000000","message":"it\u0027s ok, as long as it doesn\u0027t match \u0027extensions\u0027 we\u0027re good. So basically we need to keep i and x out of the regex.","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8f061fd5699ff26c74c78cc5899185938c908472","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # \u0027openstack\u0027 as well. We should fix the tests to use real"},{"line_number":68,"context_line":"        # UUIDs then drop this work around."},{"line_number":69,"context_line":"        self.conf.set_default(\u0027project_id_regex\u0027,"},{"line_number":70,"context_line":"                              \u0027[0-9a-fopnstk\\-]+\u0027, \u0027osapi_v21\u0027)"},{"line_number":71,"context_line":"        self.conf.set_default(\u0027force_dhcp_release\u0027, False)"},{"line_number":72,"context_line":"        self.conf.set_default(\u0027periodic_enable\u0027, False)"},{"line_number":73,"context_line":"        policy_opts.set_defaults(self.conf)"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba63e191_b060ea36","line":70,"updated":"2016-01-19 13:57:54.000000000","message":"This is a great compromise.","commit_id":"86ca213817e4c896425c1ad24dbaadce9bf73596"}],"releasenotes/notes/optional_project_id-6aebf1cb394d498f.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4d97901fea9815515d4e801dd2d1063216c46fe7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"  - Provides API 2.16, which makes the user of project_ids in API urls"},{"line_number":5,"context_line":"    optional."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"da6ed579_b13836d4","line":4,"updated":"2016-01-15 15:26:49.000000000","message":"s/user/use/","commit_id":"6a14476f4bea6a0f1d71f4f5f436d18929fc1ca3"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"f6c3b4251875ec79a2fab6324e730232acef0c3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"  - Provides API 2.16, which makes the use of project_ids in API urls"},{"line_number":5,"context_line":"    optional."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"ba63e191_6a7cc572","line":4,"range":{"start_line":4,"start_character":17,"end_line":4,"end_character":21},"updated":"2016-01-19 13:24:50.000000000","message":"this need to be updated","commit_id":"e6cb55d3a58b6c2f5fb2cd8471d5e4d776d0c058"}]}
