)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"870c6ba7198db1c1f5bfacc802122d46a087cedb","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-02-19 12:42:57 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add ability to deactivate an image"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If a questionable image is present in a deployment, admins may"},{"line_number":10,"context_line":"want to prevent use of the image until further investigation."},{"line_number":11,"context_line":"This patch provides the ability to \u0027deactivate\u0027 an image by"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba7be1f8_6c8c7e36","line":8,"updated":"2015-02-23 16:13:19.000000000","message":"I think that the commit message needs to be more explicit. If you can provide a gist of the changes here like listing the API calls that are being added. Also, something that is relevant to the change in the GET calls like new expected status might be useful.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"870c6ba7198db1c1f5bfacc802122d46a087cedb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add ability to deactivate an image"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If a questionable image is present in a deployment, admins may"},{"line_number":10,"context_line":"want to prevent use of the image until further investigation."},{"line_number":11,"context_line":"This patch provides the ability to \u0027deactivate\u0027 an image by"},{"line_number":12,"context_line":"providing two new API calls and a new image status \u0027deactivated\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba7be1f8_2c728649","line":9,"updated":"2015-02-23 16:13:19.000000000","message":"This use case can be removed as it should become clear from reading the spec.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"870c6ba7198db1c1f5bfacc802122d46a087cedb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Attempting to download a deactivated image will result in a"},{"line_number":14,"context_line":"403 \u0027Forbidden\u0027 return code."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I32b7cc7ce8404457a87c8c05041aa2a30152b930"},{"line_number":19,"context_line":"Implements: bp deactivate-image"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba7be1f8_acb4b6d1","line":16,"updated":"2015-02-23 16:13:19.000000000","message":"API Impact\n\nFor more info and additional flags to be added like UpgradeImpact may be, please see\nhttp://docs.openstack.org/infra/manual/developers.html#cross-project-dependencies","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"634080eedd5d828350bdf010ab47f298b4d1995b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Attempting to download a deactivated image will result in a"},{"line_number":14,"context_line":"403 \u0027Forbidden\u0027 return code."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I32b7cc7ce8404457a87c8c05041aa2a30152b930"},{"line_number":19,"context_line":"Implements: bp deactivate-image"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba7be1f8_9ae90e1d","line":16,"updated":"2015-02-23 17:49:01.000000000","message":"Please add APIImpact flag here","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/api/middleware/cache.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"98644ec7c3c5265673d31d05d425fa4caa3fde40","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        # Deactivated images shall not be served from cache"},{"line_number":159,"context_line":"        if image_metadata[\u0027status\u0027] \u003d\u003d \u0027deactivated\u0027:"},{"line_number":160,"context_line":"            return None"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            self._enforce(request, \u0027download_image\u0027, target\u003dimage_metadata)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_e353ed14","line":160,"updated":"2015-03-12 22:04:09.000000000","message":"Thanks for the offline explanation, this looks good!","commit_id":"f8c5cd5ee49235d216881db688d9129c33121b66"}],"glance/api/policy.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"528c2cd4f2b212725b8a76ff08fea1440783ddbb","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.image.deactivate()"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def reactivate(self):"},{"line_number":175,"context_line":"        LOG.debug(\u0027Attempting reactivate\u0027)"},{"line_number":176,"context_line":"        self.policy.enforce(self.context, \u0027reactivate\u0027, {})"},{"line_number":177,"context_line":"        LOG.debug(\u0027Reactivate allowed, continue\u0027)"},{"line_number":178,"context_line":"        self.image.reactivate()"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_c2f50858","line":175,"updated":"2015-02-03 23:30:53.000000000","message":"I assume you were using these while developing and they\u0027re not going to remain?","commit_id":"f8b7ef5dfd5b9b48941ceb2c40c2f1630003a4f0"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"6ecafd63fc8ab4776ad8dfbb4298ef28727464b2","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def deactivate(self):"},{"line_number":169,"context_line":"        LOG.debug(\u0027Attempting deactivate\u0027)"},{"line_number":170,"context_line":"        self.policy.enforce(self.context, \u0027deactivate\u0027, {})"},{"line_number":171,"context_line":"        LOG.debug(\u0027Deactivate allowed, continue\u0027)"},{"line_number":172,"context_line":"        self.image.deactivate()"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da86d52c_3f4696a7","line":170,"updated":"2015-02-23 21:55:05.000000000","message":"Can we please pass ImageTarget(self.image) as the third argument to policy.enforce? (Same below)\n\nI know most of the other calls don\u0027t do this, but it will give users far better control (through the policy file) of how this works.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"5d8915aa3ec73c352dc4b1e1a361fe0d610fd6be","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def deactivate(self):"},{"line_number":169,"context_line":"        LOG.debug(\u0027Attempting deactivate\u0027)"},{"line_number":170,"context_line":"        self.policy.enforce(self.context, \u0027deactivate\u0027, {})"},{"line_number":171,"context_line":"        LOG.debug(\u0027Deactivate allowed, continue\u0027)"},{"line_number":172,"context_line":"        self.image.deactivate()"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_5c528135","line":170,"in_reply_to":"da86d52c_3f4696a7","updated":"2015-02-26 07:37:17.000000000","message":"IIRC, you have a dedicated change/idea to cover them all together? @Ian","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/api/v1/controller.py":[{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            msg \u003d \"Image %s is deactivated\" % image_id"},{"line_number":63,"context_line":"            LOG.debug(msg)"},{"line_number":64,"context_line":"            raise webob.exc.HTTPForbidden("},{"line_number":65,"context_line":"                msg, request\u003drequest, content_type\u003d\u0027type/plain\u0027)"},{"line_number":66,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027active\u0027:"},{"line_number":67,"context_line":"            msg \u003d \"Image %s is not active\" % image_id"},{"line_number":68,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_6e270e65","line":65,"updated":"2015-02-23 18:45:44.000000000","message":"exception messages should be translated with the standard _() function. As the same message is used as DEBUG log message, you would need to double that.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/api/v2/image_actions.py":[{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"c28814a6c1cad14358e56e776f9d150d39409918","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"_ \u003d i18n._"},{"line_number":31,"context_line":"_LE \u003d i18n._LE"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class ImageActionsController(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_290d973e","line":31,"updated":"2015-02-19 14:21:20.000000000","message":"LOG is not used anywhere.","commit_id":"f8b7ef5dfd5b9b48941ceb2c40c2f1630003a4f0"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"c28814a6c1cad14358e56e776f9d150d39409918","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            image \u003d image_repo.get(image_id)"},{"line_number":49,"context_line":"            image.deactivate()"},{"line_number":50,"context_line":"            image_repo.save(image)"},{"line_number":51,"context_line":"        except exception.NotFound as e:"},{"line_number":52,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":53,"context_line":"        except exception.Forbidden as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_842caa94","line":50,"updated":"2015-02-19 14:21:20.000000000","message":"What about adding debug log that image was deactivated?","commit_id":"f8b7ef5dfd5b9b48941ceb2c40c2f1630003a4f0"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"c28814a6c1cad14358e56e776f9d150d39409918","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        try:"},{"line_number":64,"context_line":"            image \u003d image_repo.get(image_id)"},{"line_number":65,"context_line":"            image.reactivate()"},{"line_number":66,"context_line":"            image_repo.save(image)"},{"line_number":67,"context_line":"        except exception.NotFound as e:"},{"line_number":68,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":69,"context_line":"        except exception.Forbidden as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_e45486ff","line":66,"updated":"2015-02-19 14:21:20.000000000","message":"ditto","commit_id":"f8b7ef5dfd5b9b48941ceb2c40c2f1630003a4f0"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"870c6ba7198db1c1f5bfacc802122d46a087cedb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_6c647e49","line":1,"updated":"2015-02-23 16:13:19.000000000","message":"2015","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":"_ \u003d i18n._"},{"line_number":31,"context_line":"_LE \u003d i18n._LE"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class ImageActionsController(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_ac1e6f61","line":31,"updated":"2015-02-23 18:45:44.000000000","message":"None of these are in use.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            image \u003d image_repo.get(image_id)"},{"line_number":49,"context_line":"            image.deactivate()"},{"line_number":50,"context_line":"            image_repo.save(image)"},{"line_number":51,"context_line":"        except exception.NotFound as e:"},{"line_number":52,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":53,"context_line":"        except exception.Forbidden as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_2ea276ae","line":50,"updated":"2015-02-23 18:45:44.000000000","message":"INFO level logging on successful de-/reactivation would not hurt.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/api/v2/image_data.py":[{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"634080eedd5d828350bdf010ab47f298b4d1995b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            image \u003d image_repo.get(image_id)"},{"line_number":172,"context_line":"            if image.status \u003d\u003d \u0027deactivated\u0027:"},{"line_number":173,"context_line":"                msg \u003d _(\u0027The requested image has been deactivated. \u0027"},{"line_number":174,"context_line":"                        \u0027Image data download is forbidden.\u0027)"},{"line_number":175,"context_line":"                raise exception.Forbidden(message\u003dmsg)"},{"line_number":176,"context_line":"            if not image.locations:"},{"line_number":177,"context_line":"                raise exception.ImageDataNotFound()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_fd2f369f","line":174,"updated":"2015-02-23 17:49:01.000000000","message":"How about a debug log here?","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            image \u003d image_repo.get(image_id)"},{"line_number":172,"context_line":"            if image.status \u003d\u003d \u0027deactivated\u0027:"},{"line_number":173,"context_line":"                msg \u003d _(\u0027The requested image has been deactivated. \u0027"},{"line_number":174,"context_line":"                        \u0027Image data download is forbidden.\u0027)"},{"line_number":175,"context_line":"                raise exception.Forbidden(message\u003dmsg)"},{"line_number":176,"context_line":"            if not image.locations:"},{"line_number":177,"context_line":"                raise exception.ImageDataNotFound()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_2eb7d6d9","line":174,"in_reply_to":"ba7be1f8_fd2f369f","updated":"2015-02-23 18:45:44.000000000","message":"I don\u0027t think a) this is right place for it and b) as we\u0027re not logging any other download exceptions below, I\u0027m not sure if we should do it with these either.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/api/v2/router.py":[{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        mapper.connect(\u0027/images/{image_id}/actions/deactivate\u0027,"},{"line_number":453,"context_line":"                       controller\u003dimage_actions_resource,"},{"line_number":454,"context_line":"                       action\u003d\u0027deactivate\u0027,"},{"line_number":455,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":456,"context_line":"        mapper.connect(\u0027/images/{image_id}/actions/reactivate\u0027,"},{"line_number":457,"context_line":"                       controller\u003dimage_actions_resource,"},{"line_number":458,"context_line":"                       action\u003d\u0027reactivate\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_4e088a91","line":455,"updated":"2015-02-23 18:45:44.000000000","message":"By the looks of it, PUT would be consistent method rather than POST with rest of our API.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ddb7ae2529768d2867be321a1901269732e04a22","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        mapper.connect(\u0027/images/{image_id}/actions/deactivate\u0027,"},{"line_number":453,"context_line":"                       controller\u003dimage_actions_resource,"},{"line_number":454,"context_line":"                       action\u003d\u0027deactivate\u0027,"},{"line_number":455,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":456,"context_line":"        mapper.connect(\u0027/images/{image_id}/actions/reactivate\u0027,"},{"line_number":457,"context_line":"                       controller\u003dimage_actions_resource,"},{"line_number":458,"context_line":"                       action\u003d\u0027reactivate\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_ec906745","line":455,"in_reply_to":"ba7be1f8_4e088a91","updated":"2015-02-23 18:55:40.000000000","message":"This has been the topic of a huge debate with API WG :)\nI think we decided on POST being the correct verb, some of the references are documented in the spec, https://github.com/openstack/glance-specs/blob/master/specs/kilo/deactivate-image.rst","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        mapper.connect(\u0027/images/{image_id}/actions/reactivate\u0027,"},{"line_number":467,"context_line":"                       controller\u003dreject_method_resource,"},{"line_number":468,"context_line":"                       action\u003d\u0027reject\u0027,"},{"line_number":469,"context_line":"                       allowed_methods\u003d\u0027POST\u0027,"},{"line_number":470,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027, \u0027PUT\u0027, \u0027DELETE\u0027, \u0027PATCH\u0027,"},{"line_number":471,"context_line":"                                              \u0027HEAD\u0027]})"},{"line_number":472,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_cef39a9d","line":469,"updated":"2015-02-23 18:45:44.000000000","message":"Ditto","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/db/simple/api.py":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"f4179d5ef246f024b6da3f9b56bdad5e019f7e3f","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        for tag in tags:"},{"line_number":727,"context_line":"            image_tag_delete(context, image_id, tag)"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        return _normalize_locations(copy.deepcopy(DATA[\u0027images\u0027][image_id]), context)"},{"line_number":730,"context_line":"    except KeyError:"},{"line_number":731,"context_line":"        raise exception.NotFound()"},{"line_number":732,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d2019a3a","line":729,"updated":"2015-03-11 16:41:35.000000000","message":"This line is too long. http://logs.openstack.org/17/132717/6/check/gate-glance-pep8/9f5f4d2/console.html#_2015-03-09_03_24_47_665","commit_id":"e5a4cef78e4962a0a4463a69fe79a0fee497d7f6"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"c878989857e36aee147ec82939f1a08f27ee4a43","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    return _normalize_locations(image_ref, context)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"def _normalize_locations(image, context, force_show_deleted\u003dFalse):"},{"line_number":166,"context_line":"    \"\"\""},{"line_number":167,"context_line":"    Generate suitable dictionary list for locations field of image."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_27607fce","line":165,"updated":"2015-03-09 06:19:16.000000000","message":"nit: it will be better if place \u0027context\u0027 at first argument for consistence with other existing api functions.","commit_id":"e5a4cef78e4962a0a4463a69fe79a0fee497d7f6"}],"glance/domain/__init__.py":[{"author":{"_account_id":11864,"name":"Ben Roble","email":"ben.roble@rackspace.com","username":"broble"},"change_message_id":"911a9c7ad877c7ff025f13e512ecdad883f75604","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        \u0027killed\u0027: (\u0027deleted\u0027),"},{"line_number":109,"context_line":"        \u0027pending_delete\u0027: (\u0027deleted\u0027),"},{"line_number":110,"context_line":"        \u0027deleted\u0027: (),"},{"line_number":111,"context_line":"        \u0027deactivated\u0027: (\u0027active\u0027, \u0027deactivated\u0027, \u0027deleted\u0027),"},{"line_number":112,"context_line":"    }"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def __init__(self, image_id, status, created_at, updated_at, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_899ab612","line":111,"updated":"2014-11-10 21:13:03.000000000","message":"Why is it useful to have a deactivated -\u003e deactivated state?\nAlso I dont see a deactivated-\u003edeleted state change in the code (but this is certainly a useful state transition)","commit_id":"6298923bb6df40f84324a509243801bec5f685a3"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"634080eedd5d828350bdf010ab47f298b4d1995b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \u0027killed\u0027: (\u0027deleted\u0027,),"},{"line_number":111,"context_line":"        \u0027pending_delete\u0027: (\u0027deleted\u0027,),"},{"line_number":112,"context_line":"        \u0027deleted\u0027: (),"},{"line_number":113,"context_line":"        \u0027deactivated\u0027: (\u0027active\u0027, \u0027deactivated\u0027, \u0027deleted\u0027),"},{"line_number":114,"context_line":"    }"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, image_id, status, created_at, updated_at, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_3861dc39","line":113,"updated":"2015-02-23 17:49:01.000000000","message":"Why allow deactivated to deactivated?","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \u0027killed\u0027: (\u0027deleted\u0027,),"},{"line_number":111,"context_line":"        \u0027pending_delete\u0027: (\u0027deleted\u0027,),"},{"line_number":112,"context_line":"        \u0027deleted\u0027: (),"},{"line_number":113,"context_line":"        \u0027deactivated\u0027: (\u0027active\u0027, \u0027deactivated\u0027, \u0027deleted\u0027),"},{"line_number":114,"context_line":"    }"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __init__(self, image_id, status, created_at, updated_at, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_8e39a243","line":113,"in_reply_to":"ba7be1f8_3861dc39","updated":"2015-02-23 18:45:44.000000000","message":"++","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"634080eedd5d828350bdf010ab47f298b4d1995b","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            self.status \u003d \u0027deleted\u0027"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def deactivate(self):"},{"line_number":250,"context_line":"        self.status \u003d \u0027deactivated\u0027"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def reactivate(self):"},{"line_number":253,"context_line":"        if self.status \u003d\u003d \u0027deactivated\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_188fb8cd","line":250,"updated":"2015-02-23 17:49:01.000000000","message":"Is there a reason we are not doing an explicit noop like we are doing for reactivation?","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"634080eedd5d828350bdf010ab47f298b4d1995b","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            pass"},{"line_number":258,"context_line":"        else:"},{"line_number":259,"context_line":"            kw \u003d {\u0027cur_status\u0027: self.status, \u0027new_status\u0027: \u0027active\u0027}"},{"line_number":260,"context_line":"            raise exception.InvalidImageStatusTransition(**kw)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def get_data(self, *args, **kwargs):"},{"line_number":263,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_53d4b146","line":260,"updated":"2015-02-23 17:49:01.000000000","message":"I\u0027m thinking this maybe a bit misleading in some cases. Let\u0027s say you are trying to reactivate a queued image. In this case, it would complain that queued to active is an invalid status transition, which it isn\u0027t really. But, in the context of reactivation, yes, it does make sense. We probably need a different way to handle this. What do you think?","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b4f8e27caa0b7be63446e121088717ca7538021d","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            pass"},{"line_number":258,"context_line":"        else:"},{"line_number":259,"context_line":"            kw \u003d {\u0027cur_status\u0027: self.status, \u0027new_status\u0027: \u0027active\u0027}"},{"line_number":260,"context_line":"            raise exception.InvalidImageStatusTransition(**kw)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def get_data(self, *args, **kwargs):"},{"line_number":263,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_6e5b8e87","line":260,"in_reply_to":"ba7be1f8_53d4b146","updated":"2015-02-23 18:45:44.000000000","message":"Good catch Hemanth!","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/tests/functional/v2/test_images.py":[{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"e4312aa580d82d1b65ac49a7be11fd9225412c73","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        # Should be able to deactivate image"},{"line_number":436,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/actions/deactivate\u0027 % image_id)"},{"line_number":437,"context_line":"        response \u003d requests.post(path, data\u003d{}, headers\u003dself._headers())"},{"line_number":438,"context_line":"        self.assertEqual(204, response.status_code)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        # And the should be able to reactivate image"},{"line_number":441,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/actions/reactivate\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_5ba5beb3","line":438,"updated":"2014-11-05 12:08:05.000000000","message":"Nit: Perhaps you could add a test that shows that everything is ok when trying to deactivate already deactivated image?","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":5347,"name":"Eddie Sheffield","email":"eddie.sheffield@rackspace.com","username":"eddie-sheffield"},"change_message_id":"3af8aac4dbe19391ee30bb7eaad567a0459e3de0","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        # Should be able to deactivate image"},{"line_number":436,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/actions/deactivate\u0027 % image_id)"},{"line_number":437,"context_line":"        response \u003d requests.post(path, data\u003d{}, headers\u003dself._headers())"},{"line_number":438,"context_line":"        self.assertEqual(204, response.status_code)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        # And the should be able to reactivate image"},{"line_number":441,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/actions/reactivate\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_eaaa0e18","line":438,"in_reply_to":"7a8c0949_5ba5beb3","updated":"2014-11-05 16:39:20.000000000","message":"Sounds reasonable","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"f6a25043202e5f9f9c5496a608554344031ccbf4","unresolved":false,"context_lines":[{"line_number":432,"context_line":"        self.assertEqual(image2_id, images[0][\u0027id\u0027])"},{"line_number":433,"context_line":"        self.assertEqual(image_id, images[1][\u0027id\u0027])"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        # And the should be able to reactivate image"},{"line_number":436,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/actions/reactivate\u0027 % image_id)"},{"line_number":437,"context_line":"        response \u003d requests.post(path, data\u003d{}, headers\u003dself._headers())"},{"line_number":438,"context_line":"        self.assertEqual(204, response.status_code)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_e0666dba","line":435,"updated":"2015-03-03 10:19:31.000000000","message":"something is missing here in the comment.","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}],"glance/tests/unit/v2/test_image_actions_resource.py":[{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"e4312aa580d82d1b65ac49a7be11fd9225412c73","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.assertEqual(\u0027deactivated\u0027, image[\u0027status\u0027])"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _test_deactivate_from_wrong_status(self, status):"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        # deactivate will yield an error if the initial status is anything"},{"line_number":109,"context_line":"        # other than \u0027active\u0027 or \u0027deactivated\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_9b5c86ef","line":106,"updated":"2014-11-05 12:08:05.000000000","message":"The same idea as in test_reactivate_from_wrong_status: why not substitute oneliners test_deactivate_from_[queued|saving|killed ...] with one general test_deactivate_from_wrong_statuses method?","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":5347,"name":"Eddie Sheffield","email":"eddie.sheffield@rackspace.com","username":"eddie-sheffield"},"change_message_id":"3af8aac4dbe19391ee30bb7eaad567a0459e3de0","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.assertEqual(\u0027deactivated\u0027, image[\u0027status\u0027])"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _test_deactivate_from_wrong_status(self, status):"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        # deactivate will yield an error if the initial status is anything"},{"line_number":109,"context_line":"        # other than \u0027active\u0027 or \u0027deactivated\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_8aba6a6c","line":106,"in_reply_to":"7a8c0949_9b5c86ef","updated":"2014-11-05 16:39:20.000000000","message":"See comments below","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"e4312aa580d82d1b65ac49a7be11fd9225412c73","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _test_reactivate_from_wrong_status(self, status):"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        # reactivate will yield an error if the initial status is anything"},{"line_number":154,"context_line":"        # other than \u0027active\u0027 or \u0027deactivated\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_1be33634","line":151,"updated":"2014-11-05 12:08:05.000000000","message":"I\u0027d have a single test for bad status reactivation checks, instead of multiple test_reactivate_from_somestatus methods. Something like the following:\n\ntest_reactivate_from_wrong_status(self):\n    for status in [\u0027queued\u0027, \u0027saving\u0027, \u0027killed\u0027, \u0027pending_delete\u0027, \u0027deleted\u0027]:\n        self._create_image(status)\n        request \u003d unit_test_utils.get_fake_request()\t\n\tself.assertRaises(webob.exc.HTTPBadRequest, self.controller.reactivate,\n\t\t\t             request, UUID1)\n\nImho it makes the idea of reactivation in deactivated/active status clearer.","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":5347,"name":"Eddie Sheffield","email":"eddie.sheffield@rackspace.com","username":"eddie-sheffield"},"change_message_id":"3af8aac4dbe19391ee30bb7eaad567a0459e3de0","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _test_reactivate_from_wrong_status(self, status):"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        # reactivate will yield an error if the initial status is anything"},{"line_number":154,"context_line":"        # other than \u0027active\u0027 or \u0027deactivated\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_6ab7fe86","line":151,"in_reply_to":"7a8c0949_1be33634","updated":"2014-11-05 16:39:20.000000000","message":"I debated back and forth in my head between the approach I ultimately used and something similar to your suggestion. I finally settled on what I used because I felt it made it clearer in the event of a failure exactly which status(es) are behaving incorrectly whereas the loop style will fail on the first incorrect one when there may be other incorrect ones as well but they won\u0027t get picked up until after the first one is fixed. In general it\u0027s better to have several smaller highly focused tests that test one thing. That said I\u0027ll give this some more thought.","commit_id":"1de2c9ad60636d70d91921aa903ad0ad7d490941"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"870c6ba7198db1c1f5bfacc802122d46a087cedb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_acecb690","line":1,"updated":"2015-02-23 16:13:19.000000000","message":"2015","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"f6a25043202e5f9f9c5496a608554344031ccbf4","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def test_reactivate_from_reactivated(self):"},{"line_number":142,"context_line":"        self._create_image(\u0027deactivated\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_8096914a","line":141,"updated":"2015-03-03 10:19:31.000000000","message":"should it be \"test_reactivate_from_deactivated\"?","commit_id":"680c7dca13899dde32e4562f0bffc27f7fee1a16"}]}
