)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4f58186386bb320055484dc554f83ef09d586eb0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"was updated anyway) to make the base aggregate policy require the"},{"line_number":17,"context_line":"\u0027admin_api\u0027 rule (i.e., to be consistent with the policy.json file)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Also added the corresponding API test cases."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I8a88824bbb41807fad849ad15af4411d3a3dca6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAUH%2F%2F9Ng%3D","line":19,"updated":"2014-01-06 08:36:19.000000000","message":"Please add the DocImpact flag","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"738f9fce7bff24594a2985554a8ad10957f03385","unresolved":false,"context_lines":[{"line_number":16,"context_line":"was updated anyway) to make the base aggregate policy require the"},{"line_number":17,"context_line":"\u0027admin_api\u0027 rule (i.e., to be consistent with the policy.json file)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Also added the corresponding API test cases."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I8a88824bbb41807fad849ad15af4411d3a3dca6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAUH%2F%2F9JU%3D","line":19,"in_reply_to":"AAAAUH%2F%2F9Ng%3D","updated":"2014-01-06 08:55:17.000000000","message":"Will do.","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":16,"context_line":"updated anyway) to make the base aggregate policy require the"},{"line_number":17,"context_line":"\u0027admin_api\u0027 rule (i.e., to be consistent with the policy.json file)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Also added the corresponding API test cases."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"DocImpact"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F%2F85c%3D","line":19,"updated":"2014-01-06 10:36:52.000000000","message":"Joe, I think that we need a bp to trace this feature.","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f6e62e475686e77a3c52e00ce3cbb3fb6cb1eb50","unresolved":false,"context_lines":[{"line_number":16,"context_line":"updated anyway) to make the base aggregate policy require the"},{"line_number":17,"context_line":"\u0027admin_api\u0027 rule (i.e., to be consistent with the policy.json file)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Also added the corresponding API test cases."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"DocImpact"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F%2F5%2BM%3D","line":19,"in_reply_to":"AAAAUH%2F%2F85c%3D","updated":"2014-01-07 00:08:58.000000000","message":"Joe, I think that when you log your bp, you can mention make all APIs have such feature and we can implement it one by one.","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2c0757cba3a1f0baf1ff041d9d27bba521caf6d7","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Also added the corresponding API test cases."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"DocImpact"},{"line_number":24,"context_line":"Implements: blueprint aggregate-api-policy"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I8a88824bbb41807fad849ad15af4411d3a3dca6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2FyNc%3D","line":23,"updated":"2014-01-08 14:22:29.000000000","message":"What\u0027s the doc impact so the doc writers know what to do with this?  See the definition of this tag here:\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Including_external_references","commit_id":"0e66b7d45ee3062f4111f7ddbb7ec37d94d7101e"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"85cf6d45137e8528ce832fe2a056a9d379b7cc4a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Also added the corresponding API test cases."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"DocImpact"},{"line_number":24,"context_line":"Implements: blueprint aggregate-api-policy"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I8a88824bbb41807fad849ad15af4411d3a3dca6e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F%2FxzU%3D","line":23,"in_reply_to":"AAAAUH%2F%2FyNc%3D","updated":"2014-01-08 15:40:43.000000000","message":"Done","commit_id":"0e66b7d45ee3062f4111f7ddbb7ec37d94d7101e"}],"etc/nova/policy.json":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4f58186386bb320055484dc554f83ef09d586eb0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":2,"id":"AAAAUH%2F%2F9NE%3D","line":65,"updated":"2014-01-06 08:36:19.000000000","message":"This is not used anymore is it?","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"738f9fce7bff24594a2985554a8ad10957f03385","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":2,"id":"AAAAUH%2F%2F9JE%3D","line":65,"in_reply_to":"AAAAUH%2F%2F9NE%3D","updated":"2014-01-06 08:55:17.000000000","message":"I\u0027ve left it for consistency with the rest of the APIs (e.g., admin-actions) -- it appears in all instances the \"base\" entry is left as well.","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \"compute_extension:v3:os-admin-actions:migrate\": \"rule:admin_api\","},{"line_number":54,"context_line":"    \"compute_extension:v3:os-admin-password\": \"\","},{"line_number":55,"context_line":"    \"compute_extension:v3:os-admin-password:discoverable\": \"\","},{"line_number":56,"context_line":"    \"compute_extension:aggregates\": \"rule:admin_api\","},{"line_number":57,"context_line":"    \"compute_extension:aggregates:index\": \"rule:admin_api\","},{"line_number":58,"context_line":"    \"compute_extension:aggregates:create\": \"rule:admin_api\","},{"line_number":59,"context_line":"    \"compute_extension:aggregates:show\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F80I%3D","line":56,"updated":"2014-01-06 10:36:52.000000000","message":"Does this still needed?","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"2626f32e3f7beb54c8b16e43f0de5c7bb4a68f30","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \"compute_extension:v3:os-admin-actions:migrate\": \"rule:admin_api\","},{"line_number":54,"context_line":"    \"compute_extension:v3:os-admin-password\": \"\","},{"line_number":55,"context_line":"    \"compute_extension:v3:os-admin-password:discoverable\": \"\","},{"line_number":56,"context_line":"    \"compute_extension:aggregates\": \"rule:admin_api\","},{"line_number":57,"context_line":"    \"compute_extension:aggregates:index\": \"rule:admin_api\","},{"line_number":58,"context_line":"    \"compute_extension:aggregates:create\": \"rule:admin_api\","},{"line_number":59,"context_line":"    \"compute_extension:aggregates:show\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F7k0%3D","line":56,"in_reply_to":"AAAAUH%2F%2F80I%3D","updated":"2014-01-06 16:30:32.000000000","message":"This isn\u0027t, but leaving for consistency with others (and not sure we\u0027ll support this for the v2 APIs -- pending discussion).","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F80E%3D","line":65,"updated":"2014-01-06 10:36:52.000000000","message":"ditto","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"610d6bf55c543a361d2f47bb8267a9fd3277ac6d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F00k%3D","line":65,"in_reply_to":"AAAAUH%2F%2F5%2Bc%3D","updated":"2014-01-08 01:09:57.000000000","message":"Removing the entire \"compute_extension:v3:os-aggregates\": \"rule:admin_api\", line results in several test failures that indicate the policy doesn\u0027t allow those actions.  If we feel like it should work without that, then I think there is a bug somewhere else in the policy processing, which is independent of this change.  Note I\u0027m not suggesting we shouldn\u0027t investigate, I\u0027m just stating that this change doesn\u0027t really impact that.  :-)","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f6e62e475686e77a3c52e00ce3cbb3fb6cb1eb50","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F5%2Bc%3D","line":65,"in_reply_to":"AAAAUH%2F%2F7kw%3D","updated":"2014-01-07 00:08:58.000000000","message":"yes, I mean that we still leave \"discoverable\" but how about only remove \u003c\"compute_extension:v3:os-aggregates\": \"rule:admin_api\",\u003e --Discussion needed here","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"2626f32e3f7beb54c8b16e43f0de5c7bb4a68f30","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"compute_extension:aggregates:addHost\": \"rule:admin_api\","},{"line_number":63,"context_line":"    \"compute_extension:aggregates:removeHost\": \"rule:admin_api\","},{"line_number":64,"context_line":"    \"compute_extension:aggregates:setMetadata\": \"rule:admin_api\","},{"line_number":65,"context_line":"    \"compute_extension:v3:os-aggregates\": \"rule:admin_api\","},{"line_number":66,"context_line":"    \"compute_extension:v3:os-aggregates:discoverable\": \"\","},{"line_number":67,"context_line":"    \"compute_extension:v3:os-aggregates:index\": \"rule:admin_api\","},{"line_number":68,"context_line":"    \"compute_extension:v3:os-aggregates:create\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUH%2F%2F7kw%3D","line":65,"in_reply_to":"AAAAUH%2F%2F80E%3D","updated":"2014-01-06 16:30:32.000000000","message":"The v3 APIs require this for the discoverable properties, otherwise things blow up.","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"}],"nova/api/openstack/compute/contrib/aggregates.py":[{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova import utils"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"authorize \u003d extensions.extension_authorizer(\u0027compute\u0027, \u0027aggregates\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def _get_context(req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F80M%3D","line":30,"updated":"2014-01-06 10:36:52.000000000","message":"Do we need to update authorize to make sure it works? Otherwise, how it handle the parameter of action?","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"f6e62e475686e77a3c52e00ce3cbb3fb6cb1eb50","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova import utils"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"authorize \u003d extensions.extension_authorizer(\u0027compute\u0027, \u0027aggregates\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def _get_context(req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F5%2FE%3D","line":30,"in_reply_to":"AAAAUH%2F%2F7wE%3D","updated":"2014-01-07 00:08:58.000000000","message":"Thanks Joe. My bad, I did not notice that you are using keyword \u0027action\u0027","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"2626f32e3f7beb54c8b16e43f0de5c7bb4a68f30","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from nova import utils"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"authorize \u003d extensions.extension_authorizer(\u0027compute\u0027, \u0027aggregates\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def _get_context(req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F7wE%3D","line":30,"in_reply_to":"AAAAUH%2F%2F80M%3D","updated":"2014-01-06 16:30:32.000000000","message":"No, this is sufficient.  Action is an optional parameter provided by the function returned by extensions.extension_authorizer.  :-)","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def index(self, req):"},{"line_number":54,"context_line":"        \"\"\"Returns a list a host aggregate\u0027s id, name, availability_zone.\"\"\""},{"line_number":55,"context_line":"        context \u003d _get_context(req)"},{"line_number":56,"context_line":"        authorize(context, action\u003d\u0027index\u0027)"},{"line_number":57,"context_line":"        aggregates \u003d self.api.get_aggregate_list(context)"},{"line_number":58,"context_line":"        return {\u0027aggregates\u0027: [self._marshall_aggregate(a)[\u0027aggregate\u0027]"},{"line_number":59,"context_line":"                               for a in aggregates]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F80Y%3D","line":56,"updated":"2014-01-06 10:36:52.000000000","message":"This will break backward compatibility, perhaps we need api extension to do this.\n\nYou can refer to https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/contrib/services.py#L150\n\nAlso I\u0027m not sure if we need to cover this for v2 API, according to @Joe Grodon, v2 api is planning to be frozen in icehouse-2 (or else icehoues-3)","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"2626f32e3f7beb54c8b16e43f0de5c7bb4a68f30","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def index(self, req):"},{"line_number":54,"context_line":"        \"\"\"Returns a list a host aggregate\u0027s id, name, availability_zone.\"\"\""},{"line_number":55,"context_line":"        context \u003d _get_context(req)"},{"line_number":56,"context_line":"        authorize(context, action\u003d\u0027index\u0027)"},{"line_number":57,"context_line":"        aggregates \u003d self.api.get_aggregate_list(context)"},{"line_number":58,"context_line":"        return {\u0027aggregates\u0027: [self._marshall_aggregate(a)[\u0027aggregate\u0027]"},{"line_number":59,"context_line":"                               for a in aggregates]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F7vg%3D","line":56,"in_reply_to":"AAAAUH%2F%2F80Y%3D","updated":"2014-01-06 16:30:32.000000000","message":"I think to do the access checking appropriately, we\u0027d need to leave it this way.  If the v2 API compatibility is a problem (which could be eliminated by updating the policy.json file), we could always just put this in the v3 APIs.","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"}],"nova/api/openstack/compute/plugins/v3/aggregates.py":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4f58186386bb320055484dc554f83ef09d586eb0","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def _add_host(self, req, id, host):"},{"line_number":158,"context_line":"        \"\"\"Adds a host to the specified aggregate.\"\"\""},{"line_number":159,"context_line":"        context \u003d _get_context(req)"},{"line_number":160,"context_line":"        authorize(context, \u0027addHost\u0027)"},{"line_number":161,"context_line":"        try:"},{"line_number":162,"context_line":"            aggregate \u003d self.api.add_host_to_aggregate(context, id, host)"},{"line_number":163,"context_line":"        except (exception.AggregateNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9OI%3D","line":160,"updated":"2014-01-06 08:36:19.000000000","message":"for the V3 API please use snake_case rather than CamelCase","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"738f9fce7bff24594a2985554a8ad10957f03385","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def _add_host(self, req, id, host):"},{"line_number":158,"context_line":"        \"\"\"Adds a host to the specified aggregate.\"\"\""},{"line_number":159,"context_line":"        context \u003d _get_context(req)"},{"line_number":160,"context_line":"        authorize(context, \u0027addHost\u0027)"},{"line_number":161,"context_line":"        try:"},{"line_number":162,"context_line":"            aggregate \u003d self.api.add_host_to_aggregate(context, id, host)"},{"line_number":163,"context_line":"        except (exception.AggregateNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9I4%3D","line":160,"in_reply_to":"AAAAUH%2F%2F9OI%3D","updated":"2014-01-06 08:55:17.000000000","message":"Good catch!  Done.","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4f58186386bb320055484dc554f83ef09d586eb0","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _remove_host(self, req, id, host):"},{"line_number":176,"context_line":"        \"\"\"Removes a host from the specified aggregate.\"\"\""},{"line_number":177,"context_line":"        context \u003d _get_context(req)"},{"line_number":178,"context_line":"        authorize(context, \u0027removeHost\u0027)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            aggregate \u003d self.api.remove_host_from_aggregate(context, id, host)"},{"line_number":181,"context_line":"        except (exception.AggregateNotFound, exception.AggregateHostNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9OE%3D","line":178,"updated":"2014-01-06 08:36:19.000000000","message":"ditto","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"738f9fce7bff24594a2985554a8ad10957f03385","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _remove_host(self, req, id, host):"},{"line_number":176,"context_line":"        \"\"\"Removes a host from the specified aggregate.\"\"\""},{"line_number":177,"context_line":"        context \u003d _get_context(req)"},{"line_number":178,"context_line":"        authorize(context, \u0027removeHost\u0027)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            aggregate \u003d self.api.remove_host_from_aggregate(context, id, host)"},{"line_number":181,"context_line":"        except (exception.AggregateNotFound, exception.AggregateHostNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9I0%3D","line":178,"in_reply_to":"AAAAUH%2F%2F9OE%3D","updated":"2014-01-06 08:55:17.000000000","message":"Done","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4f58186386bb320055484dc554f83ef09d586eb0","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def _set_metadata(self, req, id, body):"},{"line_number":195,"context_line":"        \"\"\"Replaces the aggregate\u0027s existing metadata with new metadata.\"\"\""},{"line_number":196,"context_line":"        context \u003d _get_context(req)"},{"line_number":197,"context_line":"        authorize(context, \u0027setMetadata\u0027)"},{"line_number":198,"context_line":"        if not self.is_valid_body(body, \u0027set_metadata\u0027):"},{"line_number":199,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":200,"context_line":"        if not self.is_valid_body(body[\"set_metadata\"], \"metadata\"):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9OA%3D","line":197,"updated":"2014-01-06 08:36:19.000000000","message":"ditto","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"738f9fce7bff24594a2985554a8ad10957f03385","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def _set_metadata(self, req, id, body):"},{"line_number":195,"context_line":"        \"\"\"Replaces the aggregate\u0027s existing metadata with new metadata.\"\"\""},{"line_number":196,"context_line":"        context \u003d _get_context(req)"},{"line_number":197,"context_line":"        authorize(context, \u0027setMetadata\u0027)"},{"line_number":198,"context_line":"        if not self.is_valid_body(body, \u0027set_metadata\u0027):"},{"line_number":199,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":200,"context_line":"        if not self.is_valid_body(body[\"set_metadata\"], \"metadata\"):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2F9Iw%3D","line":197,"in_reply_to":"AAAAUH%2F%2F9OA%3D","updated":"2014-01-06 08:55:17.000000000","message":"Done","commit_id":"205acae81e47574b3dcf733e3f0670013143c5f4"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"4aaa2590a32cc78769b016e2f9e9bdcd7d24e133","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova import utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"ALIAS \u003d \"os-aggregates\""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"authorize \u003d extensions.extension_authorizer(\u0027compute\u0027, \"v3:\" + ALIAS)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F80U%3D","line":33,"updated":"2014-01-06 10:36:52.000000000","message":"dose this needs to be updated?","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"2626f32e3f7beb54c8b16e43f0de5c7bb4a68f30","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova import utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"ALIAS \u003d \"os-aggregates\""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"authorize \u003d extensions.extension_authorizer(\u0027compute\u0027, \"v3:\" + ALIAS)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2F7t4%3D","line":33,"in_reply_to":"AAAAUH%2F%2F80U%3D","updated":"2014-01-06 16:30:32.000000000","message":"Nope, as mentioned earlier - the function returned by this supports an optional parameter called \u0027action\u0027 - so we\u0027re all good!","commit_id":"10c699a7f55a4fada85ac96f548ea044e3af1dcf"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def show(self, req, id):"},{"line_number":103,"context_line":"        \"\"\"Shows the details of an aggregate, hosts and metadata included.\"\"\""},{"line_number":104,"context_line":"        context \u003d _get_context(req)"},{"line_number":105,"context_line":"        authorize(context, \u0027show\u0027)"},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            aggregate \u003d self.api.get_aggregate(context, id)"},{"line_number":108,"context_line":"        except exception.AggregateNotFound as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0nM%3D","line":105,"updated":"2014-01-08 02:55:05.000000000","message":"we should use \u0027authorize(context, action\u003d\u0027show\u0027)\u0027\n\nBecause the signature is:\ndef authorize(context, target\u003dNone, action\u003dNone):\n\n\"authorize(context, \u0027show\u0027)\" means pass \u0027show\u0027 to the target, not the action.","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def show(self, req, id):"},{"line_number":103,"context_line":"        \"\"\"Shows the details of an aggregate, hosts and metadata included.\"\"\""},{"line_number":104,"context_line":"        context \u003d _get_context(req)"},{"line_number":105,"context_line":"        authorize(context, \u0027show\u0027)"},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            aggregate \u003d self.api.get_aggregate(context, id)"},{"line_number":108,"context_line":"        except exception.AggregateNotFound as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0bQ%3D","line":105,"in_reply_to":"AAAAUH%2F%2F0nM%3D","updated":"2014-01-08 04:25:54.000000000","message":"Good catch.  This is actually why the tests were failing when v3:os-aggregates rule was removed.  Now things behave properly.  :)","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def update(self, req, id, body):"},{"line_number":114,"context_line":"        \"\"\"Updates the name and/or availability_zone of given aggregate.\"\"\""},{"line_number":115,"context_line":"        context \u003d _get_context(req)"},{"line_number":116,"context_line":"        authorize(context, \u0027update\u0027)"},{"line_number":117,"context_line":"        if not self.is_valid_body(body, \u0027aggregate\u0027):"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":119,"context_line":"        updates \u003d body[\"aggregate\"]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0nI%3D","line":116,"updated":"2014-01-08 02:55:05.000000000","message":"ditto","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def update(self, req, id, body):"},{"line_number":114,"context_line":"        \"\"\"Updates the name and/or availability_zone of given aggregate.\"\"\""},{"line_number":115,"context_line":"        context \u003d _get_context(req)"},{"line_number":116,"context_line":"        authorize(context, \u0027update\u0027)"},{"line_number":117,"context_line":"        if not self.is_valid_body(body, \u0027aggregate\u0027):"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":119,"context_line":"        updates \u003d body[\"aggregate\"]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0bM%3D","line":116,"in_reply_to":"AAAAUH%2F%2F0nI%3D","updated":"2014-01-08 04:25:54.000000000","message":"Done","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def delete(self, req, id):"},{"line_number":145,"context_line":"        \"\"\"Removes an aggregate by id.\"\"\""},{"line_number":146,"context_line":"        context \u003d _get_context(req)"},{"line_number":147,"context_line":"        authorize(context, \u0027delete\u0027)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            self.api.delete_aggregate(context, id)"},{"line_number":150,"context_line":"        except exception.AggregateNotFound as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0m4%3D","line":147,"updated":"2014-01-08 02:55:05.000000000","message":"ditto","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def delete(self, req, id):"},{"line_number":145,"context_line":"        \"\"\"Removes an aggregate by id.\"\"\""},{"line_number":146,"context_line":"        context \u003d _get_context(req)"},{"line_number":147,"context_line":"        authorize(context, \u0027delete\u0027)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            self.api.delete_aggregate(context, id)"},{"line_number":150,"context_line":"        except exception.AggregateNotFound as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0bI%3D","line":147,"in_reply_to":"AAAAUH%2F%2F0m4%3D","updated":"2014-01-08 04:25:54.000000000","message":"Done","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def _add_host(self, req, id, host):"},{"line_number":158,"context_line":"        \"\"\"Adds a host to the specified aggregate.\"\"\""},{"line_number":159,"context_line":"        context \u003d _get_context(req)"},{"line_number":160,"context_line":"        authorize(context, \u0027add_host\u0027)"},{"line_number":161,"context_line":"        try:"},{"line_number":162,"context_line":"            aggregate \u003d self.api.add_host_to_aggregate(context, id, host)"},{"line_number":163,"context_line":"        except (exception.AggregateNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0m0%3D","line":160,"updated":"2014-01-08 02:55:05.000000000","message":"ditto","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def _add_host(self, req, id, host):"},{"line_number":158,"context_line":"        \"\"\"Adds a host to the specified aggregate.\"\"\""},{"line_number":159,"context_line":"        context \u003d _get_context(req)"},{"line_number":160,"context_line":"        authorize(context, \u0027add_host\u0027)"},{"line_number":161,"context_line":"        try:"},{"line_number":162,"context_line":"            aggregate \u003d self.api.add_host_to_aggregate(context, id, host)"},{"line_number":163,"context_line":"        except (exception.AggregateNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0bA%3D","line":160,"in_reply_to":"AAAAUH%2F%2F0m0%3D","updated":"2014-01-08 04:25:54.000000000","message":"Done","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _remove_host(self, req, id, host):"},{"line_number":176,"context_line":"        \"\"\"Removes a host from the specified aggregate.\"\"\""},{"line_number":177,"context_line":"        context \u003d _get_context(req)"},{"line_number":178,"context_line":"        authorize(context, \u0027remove_host\u0027)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            aggregate \u003d self.api.remove_host_from_aggregate(context, id, host)"},{"line_number":181,"context_line":"        except (exception.AggregateNotFound, exception.AggregateHostNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0mw%3D","line":178,"updated":"2014-01-08 02:55:05.000000000","message":"ditto","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _remove_host(self, req, id, host):"},{"line_number":176,"context_line":"        \"\"\"Removes a host from the specified aggregate.\"\"\""},{"line_number":177,"context_line":"        context \u003d _get_context(req)"},{"line_number":178,"context_line":"        authorize(context, \u0027remove_host\u0027)"},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            aggregate \u003d self.api.remove_host_from_aggregate(context, id, host)"},{"line_number":181,"context_line":"        except (exception.AggregateNotFound, exception.AggregateHostNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0a8%3D","line":178,"in_reply_to":"AAAAUH%2F%2F0mw%3D","updated":"2014-01-08 04:25:54.000000000","message":"Done","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def _set_metadata(self, req, id, body):"},{"line_number":195,"context_line":"        \"\"\"Replaces the aggregate\u0027s existing metadata with new metadata.\"\"\""},{"line_number":196,"context_line":"        context \u003d _get_context(req)"},{"line_number":197,"context_line":"        authorize(context, \u0027set_metadata\u0027)"},{"line_number":198,"context_line":"        if not self.is_valid_body(body, \u0027set_metadata\u0027):"},{"line_number":199,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":200,"context_line":"        if not self.is_valid_body(body[\"set_metadata\"], \"metadata\"):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0mo%3D","line":197,"updated":"2014-01-08 02:55:05.000000000","message":"ditto","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def _set_metadata(self, req, id, body):"},{"line_number":195,"context_line":"        \"\"\"Replaces the aggregate\u0027s existing metadata with new metadata.\"\"\""},{"line_number":196,"context_line":"        context \u003d _get_context(req)"},{"line_number":197,"context_line":"        authorize(context, \u0027set_metadata\u0027)"},{"line_number":198,"context_line":"        if not self.is_valid_body(body, \u0027set_metadata\u0027):"},{"line_number":199,"context_line":"            raise exc.HTTPBadRequest(explanation\u003d_(\"Invalid request body\"))"},{"line_number":200,"context_line":"        if not self.is_valid_body(body[\"set_metadata\"], \"metadata\"):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0a4%3D","line":197,"in_reply_to":"AAAAUH%2F%2F0mo%3D","updated":"2014-01-08 04:25:54.000000000","message":"Done","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"}],"nova/tests/api/openstack/compute/plugins/v3/test_aggregates.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2965486214002a88004e6f125b491cbe1a70f651","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.assertEqual(AGGREGATE_LIST, result[\"aggregates\"])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_index_no_admin(self):"},{"line_number":62,"context_line":"        self.assertRaises(exception.NotAuthorized, self.controller.index,"},{"line_number":63,"context_line":"                          self.user_req)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_create(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0mI%3D","line":62,"updated":"2014-01-08 02:55:05.000000000","message":"NotAuthorized is too generic, we better to use PolicyNotAuthorized.\n\nwe also can assert the message for ensuring the specific policy check failed. like this:\nhttps://review.openstack.org/#/c/63690/5/nova/tests/api/openstack/compute/plugins/v3/test_servers.py","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"715011fb355b4625922de408178c9967576e8465","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.assertEqual(AGGREGATE_LIST, result[\"aggregates\"])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_index_no_admin(self):"},{"line_number":62,"context_line":"        self.assertRaises(exception.NotAuthorized, self.controller.index,"},{"line_number":63,"context_line":"                          self.user_req)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_create(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2F0ao%3D","line":62,"in_reply_to":"AAAAUH%2F%2F0mI%3D","updated":"2014-01-08 04:25:54.000000000","message":"I was thinking that too, but it seemed the other APIs used NotAuthorized for some reason.  I\u0027ll make it more specific.","commit_id":"14c8e2b798cb52a90e83a74d4a6743e2e6f4023f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"399bbaa7eb1889f73f40035286c52e3b5f445121","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.assertEqual(AGGREGATE_LIST, result[\"aggregates\"])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_index_no_admin(self):"},{"line_number":62,"context_line":"        self.assertRaisesRegexp(exception.PolicyNotAuthorized,"},{"line_number":63,"context_line":"                                \u0027compute_extension:v3:os-aggregates:index\u0027,"},{"line_number":64,"context_line":"                                self.controller.index,"},{"line_number":65,"context_line":"                                self.user_req)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2F0R0%3D","line":62,"updated":"2014-01-08 05:31:07.000000000","message":"just found python 2.6 didn\u0027t support assertRaisesRegexp...\n\nhttp://logs.openstack.org/66/63566/10/check/gate-nova-python26/3939337/testr_results.html.gz\n\nsorry for that. I didn\u0027t found it because jenkins can\u0027t run yesterday.","commit_id":"476086e924ac7600e8ada097e66b2759565aa54b"}]}
