)]}'
{"doc/source/policies.rst":[{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"9df0d631762f92f96320f46062ab91729e8f65c2","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"* ``upload_image`` - Upload binary image data"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"  * ``PUT /v1/images/\u003cIMAGE_ID\u003e``"},{"line_number":56,"context_line":"  * ``PUT /v2/images/\u003cIMAGE_ID\u003e/file``"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"* ``add_image`` - Create an image entity"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAATn%2F%2BT3k%3D","line":55,"updated":"2013-11-27 14:50:25.000000000","message":"Does this include create call as well? Should we include the POST call then?\n\nhttps://github.com/openstack/glance/blob/master/glance/api/v1/router.py#L38","commit_id":"5520e0819e5088ce159ec0b0e247efac24b4c079"}],"glance/api/v1/images.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"9ccd3f7410847f92fdff409697fe160e2ae300c7","unresolved":false,"context_lines":[{"line_number":653,"context_line":"                                 request\u003dreq,"},{"line_number":654,"context_line":"                                 content_type\u003d\"text/plain\")"},{"line_number":655,"context_line":"        if image_data:"},{"line_number":656,"context_line":"            self._enforce(req, \u0027upload_image\u0027)"},{"line_number":657,"context_line":"            image_meta \u003d self._validate_image_for_activation(req,"},{"line_number":658,"context_line":"                                                             image_id,"},{"line_number":659,"context_line":"                                                             image_meta)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BRNI%3D","line":656,"updated":"2013-11-28 05:38:17.000000000","message":"I have a little bit concern about the place to check the permission. See my comment in line 752.","commit_id":"4863a909c61bfcf7793c32a08d11398357109456"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"9ccd3f7410847f92fdff409697fe160e2ae300c7","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        if is_public:"},{"line_number":749,"context_line":"            self._enforce(req, \u0027publicize_image\u0027)"},{"line_number":750,"context_line":"        if Controller._copy_from(req):"},{"line_number":751,"context_line":"            self._enforce(req, \u0027copy_from\u0027)"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self._enforce_create_protected_props(image_meta[\u0027properties\u0027].keys(),"},{"line_number":754,"context_line":"                                             req)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BRNM%3D","line":751,"updated":"2013-11-28 05:38:17.000000000","message":"How about check the policy at here before calling self._reserve(req, image_mata)? Because after calling self._reserve(), the image record will be created and the image.recreate notification will be sent. It doesn\u0027t make sense for me.","commit_id":"4863a909c61bfcf7793c32a08d11398357109456"}],"glance/tests/unit/v1/test_api.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"e49913d1ef5fe4edd11b2be8b2076ff75a6df9ff","unresolved":false,"context_lines":[{"line_number":727,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":728,"context_line":"        self.assertEqual(res.status_int, 403)"},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"    def test_add_copy_from_image_authorized_upload_image_unauthorized(self):"},{"line_number":731,"context_line":"        rules \u003d {\"add_image\": \u0027@\u0027, \"copy_from\": \u0027@\u0027, \"upload_image\": \u0027!\u0027}"},{"line_number":732,"context_line":"        self.set_policy_rules(rules)"},{"line_number":733,"context_line":"        fixture_headers \u003d {\u0027x-image-meta-store\u0027: \u0027file\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BJuQ%3D","line":730,"updated":"2013-12-01 15:06:09.000000000","message":"How about just rename this with \"test_add_copy_from_upload_image_unauthorized\"?","commit_id":"e25aaff5e6d29238c442b352827faa35c5432f27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"e49913d1ef5fe4edd11b2be8b2076ff75a6df9ff","unresolved":false,"context_lines":[{"line_number":744,"context_line":"        req.headers[\u0027Content-Type\u0027] \u003d \u0027application/octet-stream\u0027"},{"line_number":745,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":746,"context_line":"        self.assertEqual(res.status_int, 403)"},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"    def test_add_copy_from_image_authorized_upload_image_authorized(self):"},{"line_number":749,"context_line":"        rules \u003d {\"add_image\": \u0027@\u0027, \"copy_from\": \u0027@\u0027, \"upload_image\": \u0027@\u0027}"},{"line_number":750,"context_line":"        self.set_policy_rules(rules)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BJuI%3D","line":747,"updated":"2013-12-01 15:06:09.000000000","message":"I\u0027m thinking if we need a case for update image by copy_from when upload image unauthorized.","commit_id":"e25aaff5e6d29238c442b352827faa35c5432f27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"e49913d1ef5fe4edd11b2be8b2076ff75a6df9ff","unresolved":false,"context_lines":[{"line_number":834,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":835,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def test_upload_image_when_new_unauthorized(self):"},{"line_number":838,"context_line":"        rules \u003d {\"upload_image\": \u0027!\u0027, \"modify_image\": \u0027@\u0027,"},{"line_number":839,"context_line":"                 \"add_image\": \u0027@\u0027}"},{"line_number":840,"context_line":"        self.set_policy_rules(rules)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BJuA%3D","line":837,"updated":"2013-12-01 15:06:09.000000000","message":"I would be nice if the name can be consistent with above cases. How about rename it with \"test_add_data_upload_image_unauthorized\"?","commit_id":"e25aaff5e6d29238c442b352827faa35c5432f27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"e49913d1ef5fe4edd11b2be8b2076ff75a6df9ff","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":858,"context_line":"        self.assertEqual(res.status_int, 403)"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"    def test_upload_image_when_existing_unauthorized(self):"},{"line_number":861,"context_line":"        rules \u003d {\"upload_image\": \u0027!\u0027, \"modify_image\": \u0027@\u0027,"},{"line_number":862,"context_line":"                 \"add_image\": \u0027@\u0027}"},{"line_number":863,"context_line":"        self.set_policy_rules(rules)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BJuE%3D","line":860,"updated":"2013-12-01 15:06:09.000000000","message":"How about rename it with \"test_update_data_upload_image_unauthorized\"?","commit_id":"e25aaff5e6d29238c442b352827faa35c5432f27"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b290f625dd0be019df5e0f434fb8bbc0e811b199","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        rules \u003d {\"upload_image\": \u0027!\u0027, \"modify_image\": \u0027@\u0027,"},{"line_number":862,"context_line":"                 \"add_image\": \u0027@\u0027}"},{"line_number":863,"context_line":"        self.set_policy_rules(rules)"},{"line_number":864,"context_line":"        \"\"\"Tests creates a queued image for no body and no loc header\"\"\""},{"line_number":865,"context_line":"        self.config(image_size_cap\u003d512)"},{"line_number":866,"context_line":"        fixture_headers \u003d {\u0027x-image-meta-store\u0027: \u0027file\u0027,"},{"line_number":867,"context_line":"                           \u0027x-image-meta-name\u0027: \u0027fake image #3\u0027}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F95Yk%3D","line":864,"updated":"2013-12-04 19:08:42.000000000","message":"why is the doc string in the middle of the method definition?","commit_id":"ab7ea6baf7e67ee6353257f112e315369dd8d36e"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b290f625dd0be019df5e0f434fb8bbc0e811b199","unresolved":false,"context_lines":[{"line_number":873,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":874,"context_line":"        self.assertEqual(res.status_int, 201)"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"        res_body \u003d json.loads(res.body)[\u0027image\u0027]"},{"line_number":877,"context_line":"        self.assertEqual(\u0027queued\u0027, res_body[\u0027status\u0027])"},{"line_number":878,"context_line":"        image_id \u003d res_body[\u0027id\u0027]"},{"line_number":879,"context_line":"        req \u003d webob.Request.blank(\"/images/%s\" % image_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F95UM%3D","line":876,"updated":"2013-12-04 19:08:42.000000000","message":"not a big deal - however, if you happen to change something in the next PS, can you please use glance.openstack.common.jsonutils for the above operation?","commit_id":"ab7ea6baf7e67ee6353257f112e315369dd8d36e"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b290f625dd0be019df5e0f434fb8bbc0e811b199","unresolved":false,"context_lines":[{"line_number":902,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":903,"context_line":"        self.assertEqual(res.status_int, 201)"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        res_body \u003d json.loads(res.body)[\u0027image\u0027]"},{"line_number":906,"context_line":"        self.assertEqual(\u0027queued\u0027, res_body[\u0027status\u0027])"},{"line_number":907,"context_line":"        image_id \u003d res_body[\u0027id\u0027]"},{"line_number":908,"context_line":"        req \u003d webob.Request.blank(\"/images/%s\" % image_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F95UE%3D","line":905,"updated":"2013-12-04 19:08:42.000000000","message":"ditto","commit_id":"ab7ea6baf7e67ee6353257f112e315369dd8d36e"}]}
