)]}'
{"glance/api/authorization.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"class ImageMemberRepoProxy(glance.domain.proxy.MemberRepo):"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def __init__(self, image, member_repo, context):"},{"line_number":120,"context_line":"        self.image \u003d image"},{"line_number":121,"context_line":"        self.member_repo \u003d member_repo"},{"line_number":122,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_19884cc4","line":119,"updated":"2015-09-30 16:51:20.000000000","message":"Can we avoid the change in the order of the constructor attributes?\n\nAlso, it probably reads better to pass the repo first since this is a repo proxy. In other parts, AFAICT, we pass the factory/repo first.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"class ImageMemberRepoProxy(glance.domain.proxy.MemberRepo):"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def __init__(self, image, member_repo, context):"},{"line_number":120,"context_line":"        self.image \u003d image"},{"line_number":121,"context_line":"        self.member_repo \u003d member_repo"},{"line_number":122,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_3a6642bb","line":119,"in_reply_to":"9a1a9d01_19884cc4","updated":"2015-10-01 12:55:19.000000000","message":"Done","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"}],"glance/api/policy.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        self.image_member \u003d image_member"},{"line_number":201,"context_line":"        self.context \u003d context"},{"line_number":202,"context_line":"        self.policy \u003d policy"},{"line_number":203,"context_line":"        super(ImageMemberProxy, self).__init__(image_member)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"class ImageFactoryProxy(glance.domain.proxy.ImageFactory):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_39b5107d","line":203,"updated":"2015-09-30 16:51:20.000000000","message":"nit: why do we need to assign the attributes before calling the parent class? Unless there\u0027s a good reason to do this, I think it\u0027s better to first call the parent\u0027s constructor.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        self.image_member \u003d image_member"},{"line_number":201,"context_line":"        self.context \u003d context"},{"line_number":202,"context_line":"        self.policy \u003d policy"},{"line_number":203,"context_line":"        super(ImageMemberProxy, self).__init__(image_member)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"class ImageFactoryProxy(glance.domain.proxy.ImageFactory):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_fa0a0ad1","line":203,"in_reply_to":"9a1a9d01_39b5107d","updated":"2015-10-01 12:55:19.000000000","message":"It just happened that way:). will reorder it.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"class ImageMemberRepoProxy(glance.domain.proxy.Repo):"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def __init__(self, image, member_repo, context, policy):"},{"line_number":235,"context_line":"        self.image \u003d image"},{"line_number":236,"context_line":"        self.target \u003d ImageTarget(image)"},{"line_number":237,"context_line":"        self.member_repo \u003d member_repo"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_59b80475","line":234,"updated":"2015-09-30 16:51:20.000000000","message":"ditto (although in this case we\u0027re adding the attribute)","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"class ImageMemberRepoProxy(glance.domain.proxy.Repo):"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def __init__(self, image, member_repo, context, policy):"},{"line_number":235,"context_line":"        self.image \u003d image"},{"line_number":236,"context_line":"        self.target \u003d ImageTarget(image)"},{"line_number":237,"context_line":"        self.member_repo \u003d member_repo"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_ba101201","line":234,"in_reply_to":"9a1a9d01_59b80475","updated":"2015-10-01 12:55:19.000000000","message":"Done","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"}],"glance/api/v2/image_members.py":[{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"3911ad47be37db75ae6b4cc3c895dde43889ff62","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.gateway \u003d glance.gateway.Gateway(self.db_api, self.store_api,"},{"line_number":49,"context_line":"                                              self.notifier, self.policy)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _get_member_repo(self, image, req):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            # For public images, a forbidden exception with message"},{"line_number":54,"context_line":"            # \"Public images do not have members\" is thrown."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a1a9d01_a12c4bac","line":51,"updated":"2015-09-25 04:05:38.000000000","message":"Just for consistency sake, it maybe worthwhile to switch the positions of req and image. That\u0027s what we do usually.\n\nThis isn\u0027t a blocker for sure, feel free to do it in a separate patch if you agree.","commit_id":"c74f55d310df3a55ee5ed2d5eb78792b0275c40b"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"f832c50dc42c1153bce37d8330ee41e9721c1338","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.gateway \u003d glance.gateway.Gateway(self.db_api, self.store_api,"},{"line_number":49,"context_line":"                                              self.notifier, self.policy)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _get_member_repo(self, image, req):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            # For public images, a forbidden exception with message"},{"line_number":54,"context_line":"            # \"Public images do not have members\" is thrown."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a1a9d01_56888ee7","line":51,"in_reply_to":"9a1a9d01_a12c4bac","updated":"2015-09-25 08:34:59.000000000","message":"Done","commit_id":"c74f55d310df3a55ee5ed2d5eb78792b0275c40b"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"3911ad47be37db75ae6b4cc3c895dde43889ff62","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            msg \u003d (_(\"Error fetching members of image %(image_id)s: \""},{"line_number":58,"context_line":"                     \"%(inner_msg)s\") % {\"image_id\": image.image_id,"},{"line_number":59,"context_line":"                                         \"inner_msg\": e.msg})"},{"line_number":60,"context_line":"            LOG.warning(msg)"},{"line_number":61,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _lookup_image(self, req, image_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a1a9d01_2117db52","line":60,"updated":"2015-09-25 04:05:38.000000000","message":"It\u0027s probably consistent with what\u0027s done here in image members controller but \u0027warning\u0027 level is probably not required here. debug should suffice in my opinion.","commit_id":"c74f55d310df3a55ee5ed2d5eb78792b0275c40b"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"f832c50dc42c1153bce37d8330ee41e9721c1338","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            msg \u003d (_(\"Error fetching members of image %(image_id)s: \""},{"line_number":58,"context_line":"                     \"%(inner_msg)s\") % {\"image_id\": image.image_id,"},{"line_number":59,"context_line":"                                         \"inner_msg\": e.msg})"},{"line_number":60,"context_line":"            LOG.warning(msg)"},{"line_number":61,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _lookup_image(self, req, image_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a1a9d01_d6e25e9f","line":60,"in_reply_to":"9a1a9d01_2117db52","updated":"2015-09-25 08:34:59.000000000","message":"Makes sense. Done","commit_id":"c74f55d310df3a55ee5ed2d5eb78792b0275c40b"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"9fb7ad46475e000ce2296f9da2c5b8152c21b155","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                   \"%(inner_msg)s\") % {\"image_id\": image.image_id,"},{"line_number":58,"context_line":"                                       \"inner_msg\": e.msg}"},{"line_number":59,"context_line":"            LOG.debug(msg)"},{"line_number":60,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _lookup_image(self, req, image_id):"},{"line_number":63,"context_line":"        image_repo \u003d self.gateway.get_repo(req.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_71727013","line":60,"updated":"2016-01-18 12:11:19.000000000","message":"We would need to do little dance here. Exception messages should be translated but debug log messages should not. We probably need to double that message.","commit_id":"db94d686108fafa038e7d983b6fc4b5a82f7fbb4"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"62c8e3f1dda1c4bfc8e775ffbf924a814a8803bf","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                   \"%(inner_msg)s\") % {\"image_id\": image.image_id,"},{"line_number":58,"context_line":"                                       \"inner_msg\": e.msg}"},{"line_number":59,"context_line":"            LOG.debug(msg)"},{"line_number":60,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _lookup_image(self, req, image_id):"},{"line_number":63,"context_line":"        image_repo \u003d self.gateway.get_repo(req.context)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a68dd71_76c70b96","line":60,"in_reply_to":"da6ed579_71727013","updated":"2016-01-25 23:56:58.000000000","message":"Done","commit_id":"db94d686108fafa038e7d983b6fc4b5a82f7fbb4"}],"glance/db/__init__.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"29ac8e6c41bc3e36c8c84a2be5b1cbfc8aa56586","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    def _format_image_member_from_db(self, db_image_member):"},{"line_number":314,"context_line":"        return glance.domain.ImageMembership("},{"line_number":315,"context_line":"            id\u003ddb_image_member[\u0027id\u0027],"},{"line_number":316,"context_line":"            image_id\u003dself.image.image_id,"},{"line_number":317,"context_line":"            member_id\u003ddb_image_member[\u0027member\u0027],"},{"line_number":318,"context_line":"            status\u003ddb_image_member[\u0027status\u0027],"},{"line_number":319,"context_line":"            created_at\u003ddb_image_member[\u0027created_at\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba15a1d1_d298dd1d","line":316,"updated":"2015-09-22 16:48:56.000000000","message":"Just wondering why you\u0027re preferring the image as the source of the image_id here?  It shouldn\u0027t matter, but given the name of the function ... just thought I\u0027d ask.\n\nI guess what I\u0027m really getting at is that if there\u0027s really a chance that the image_id could be different or None in the database, maybe we should check and raise an exception or log?\n\n(You also do this in format_image_member_notification in notifier.py.  I don\u0027t think it\u0027s wrong, just something I noticed.)","commit_id":"432c21fc693dccb100acf8e7039678f247eae232"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"383ada2514dc868942431e04dcd87ad5416fec43","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    def _format_image_member_from_db(self, db_image_member):"},{"line_number":314,"context_line":"        return glance.domain.ImageMembership("},{"line_number":315,"context_line":"            id\u003ddb_image_member[\u0027id\u0027],"},{"line_number":316,"context_line":"            image_id\u003dself.image.image_id,"},{"line_number":317,"context_line":"            member_id\u003ddb_image_member[\u0027member\u0027],"},{"line_number":318,"context_line":"            status\u003ddb_image_member[\u0027status\u0027],"},{"line_number":319,"context_line":"            created_at\u003ddb_image_member[\u0027created_at\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba15a1d1_31f4b485","line":316,"in_reply_to":"ba15a1d1_0e8ab1bf","updated":"2015-09-22 17:55:49.000000000","message":"Done","commit_id":"432c21fc693dccb100acf8e7039678f247eae232"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9096272af92ca8c43474490c6725e217b3dc3a64","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    def _format_image_member_from_db(self, db_image_member):"},{"line_number":314,"context_line":"        return glance.domain.ImageMembership("},{"line_number":315,"context_line":"            id\u003ddb_image_member[\u0027id\u0027],"},{"line_number":316,"context_line":"            image_id\u003dself.image.image_id,"},{"line_number":317,"context_line":"            member_id\u003ddb_image_member[\u0027member\u0027],"},{"line_number":318,"context_line":"            status\u003ddb_image_member[\u0027status\u0027],"},{"line_number":319,"context_line":"            created_at\u003ddb_image_member[\u0027created_at\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba15a1d1_0e8ab1bf","line":316,"in_reply_to":"ba15a1d1_483bc038","updated":"2015-09-22 17:41:07.000000000","message":"While I agree that the image.image_id won\u0027t be different than image_members.image_id -- if that happens we may a lot of things break! ,\n\nI think that makes sense Lakshmi, purely for the sake of consistency.","commit_id":"432c21fc693dccb100acf8e7039678f247eae232"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"5627cba044be673dfb94609ceb5e70891ed1b7ee","unresolved":false,"context_lines":[{"line_number":313,"context_line":"    def _format_image_member_from_db(self, db_image_member):"},{"line_number":314,"context_line":"        return glance.domain.ImageMembership("},{"line_number":315,"context_line":"            id\u003ddb_image_member[\u0027id\u0027],"},{"line_number":316,"context_line":"            image_id\u003dself.image.image_id,"},{"line_number":317,"context_line":"            member_id\u003ddb_image_member[\u0027member\u0027],"},{"line_number":318,"context_line":"            status\u003ddb_image_member[\u0027status\u0027],"},{"line_number":319,"context_line":"            created_at\u003ddb_image_member[\u0027created_at\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba15a1d1_483bc038","line":316,"in_reply_to":"ba15a1d1_d298dd1d","updated":"2015-09-22 17:17:01.000000000","message":"Now that you ask, i think i went by the fields that belong to the source table/object.  image_id to image and member fields to image_member.  \n\nI dont think there is any chance of image_id being different or none since the functions( list() and get()) are called prior to this function based on the same image_id.\n\nBut i can also change it to use image_id from db_image_member, if it makes it consistent to use single source object for data.","commit_id":"432c21fc693dccb100acf8e7039678f247eae232"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class ImageMemberRepo(object):"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def __init__(self, image, context, db_api):"},{"line_number":309,"context_line":"        self.image \u003d image"},{"line_number":310,"context_line":"        self.context \u003d context"},{"line_number":311,"context_line":"        self.db_api \u003d db_api"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_f98c78db","line":308,"updated":"2015-09-30 16:51:20.000000000","message":"ditto","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class ImageMemberRepo(object):"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def __init__(self, image, context, db_api):"},{"line_number":309,"context_line":"        self.image \u003d image"},{"line_number":310,"context_line":"        self.context \u003d context"},{"line_number":311,"context_line":"        self.db_api \u003d db_api"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_ba27b261","line":308,"in_reply_to":"9a1a9d01_f98c78db","updated":"2015-10-01 12:55:19.000000000","message":"Done","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"}],"glance/location.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9dd8b1e2efc9320d258061e9a8aaabc0fcf050a6","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.db_api \u003d glance.db.get_api()"},{"line_number":52,"context_line":"        self.policy \u003d glance.api.policy.Enforcer()"},{"line_number":53,"context_line":"        self.notifier \u003d glance.notifier.Notifier()"},{"line_number":54,"context_line":"        self.store_api \u003d store"},{"line_number":55,"context_line":"        self.gateway \u003d glance.gateway.Gateway(self.db_api, self.store_api,"},{"line_number":56,"context_line":"                                              self.notifier, self.policy)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_e28bde1c","line":54,"updated":"2015-09-22 13:33:26.000000000","message":"You are setting the store_api again, I think this is the root cause of failures.","commit_id":"621607b6b73a7c563298001de8df6d1ed7384b30"}],"glance/notifier.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"cdb37a97b75dd69426d113a8bb98d32b2f9d181d","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    }"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def format_image_member_notification(image, image_member):"},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":"    Given a glance.domain.ImageMember object, return a dictionary of relevant"},{"line_number":137,"context_line":"    notification information."}],"source_content_type":"text/x-python","patch_set":10,"id":"ba15a1d1_57a59801","line":134,"updated":"2015-09-22 18:31:30.000000000","message":"If you have to do another patch set ... you don\u0027t need the image passed in any longer.","commit_id":"948bb7d4480c592a2fba5c2512cdb1aeb4f8c260"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"1c7369feece0aff013e2e281861a46f18dac3760","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    }"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def format_image_member_notification(image, image_member):"},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":"    Given a glance.domain.ImageMember object, return a dictionary of relevant"},{"line_number":137,"context_line":"    notification information."}],"source_content_type":"text/x-python","patch_set":10,"id":"ba15a1d1_7d4d1d71","line":134,"in_reply_to":"ba15a1d1_57a59801","updated":"2015-09-22 19:11:13.000000000","message":"Thanks for the catch. Done","commit_id":"948bb7d4480c592a2fba5c2512cdb1aeb4f8c260"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"fc5d8d4621cb7e514ef26c04d6586e8a07726e0e","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"    }"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_413afd37","line":145,"updated":"2015-09-25 14:16:54.000000000","message":"Sorry, I missed this earlier.\nIs there a reason we don\u0027t have deleted and deleted_at here?","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"cd339abfadaf5854e6a617b8d45a5e7ed9190703","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"    }"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_c5185887","line":145,"in_reply_to":"9a1a9d01_413afd37","updated":"2015-09-25 14:45:30.000000000","message":"Since those fields make sense only in member remove function, i added them as extra payloads (line 523).\nIf for consistency with how image does the payload I can add them.","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"c1cfff541ace387cbfbb037c4f02507603a7476b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"    }"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_e8d8d155","line":145,"in_reply_to":"9a1a9d01_887cb573","updated":"2015-09-25 14:54:50.000000000","message":"Yeah that makes sense. will add it in next patch","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"46cb208fee854de8131d9b423b612331d16d4b5d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"    }"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_887cb573","line":145,"in_reply_to":"9a1a9d01_c5185887","updated":"2015-09-25 14:49:03.000000000","message":"Yes, but I think we\u0027d want all possible fields to be there whether or not they are populated. This helps in standardizing what to expect from a image member notification. It\u0027ll be helpful for any downstream applications that reply on notifications to have a standard format.","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    notification information."},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":"    return {"},{"line_number":140,"context_line":"        \u0027id\u0027: image_member.id,"},{"line_number":141,"context_line":"        \u0027image_id\u0027: image_member.image_id,"},{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_b99280f4","line":140,"updated":"2015-09-30 16:51:20.000000000","message":"I wonder if we really need to send this ID out. Fro ma notification POV, we don\u0027t really care about the record id but the image and member id.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    notification information."},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":"    return {"},{"line_number":140,"context_line":"        \u0027id\u0027: image_member.id,"},{"line_number":141,"context_line":"        \u0027image_id\u0027: image_member.image_id,"},{"line_number":142,"context_line":"        \u0027member_id\u0027: image_member.member_id,"},{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_dcbce6dd","line":140,"in_reply_to":"9a1a9d01_b99280f4","updated":"2015-10-01 12:55:19.000000000","message":"True. Will remove it.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"        \u0027deleted\u0027: False,"},{"line_number":147,"context_line":"        \u0027deleted_at\u0027: None,"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_d98df4d3","line":146,"updated":"2015-09-30 16:51:20.000000000","message":"mmh, I wonder if we could move to having a delete state for members instead of depending on the boolean. Random thought","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        \u0027status\u0027: image_member.status,"},{"line_number":144,"context_line":"        \u0027created_at\u0027: timeutils.isotime(image_member.created_at),"},{"line_number":145,"context_line":"        \u0027updated_at\u0027: timeutils.isotime(image_member.updated_at),"},{"line_number":146,"context_line":"        \u0027deleted\u0027: False,"},{"line_number":147,"context_line":"        \u0027deleted_at\u0027: None,"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_1c19fe21","line":146,"in_reply_to":"9a1a9d01_d98df4d3","updated":"2015-10-01 12:55:19.000000000","message":"That might be good addition to existing set of states in status field which might also require some thought into state transition back from deleted to other states. May be another patch for that?","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":491,"context_line":""},{"line_number":492,"context_line":"class ImageMemberRepoProxy(NotificationBase, domain_proxy.MemberRepo):"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def __init__(self, image, repo, context, notifier):"},{"line_number":495,"context_line":"        self.image \u003d image"},{"line_number":496,"context_line":"        self.repo \u003d repo"},{"line_number":497,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_79bf0861","line":494,"updated":"2015-09-30 16:51:20.000000000","message":"I guess this is the reason why the arguments were re-ordered in the other classes. It\u0027s not a big deal but it seems unnecessary and it kinda makes more sense having the repo as the first argument here.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":491,"context_line":""},{"line_number":492,"context_line":"class ImageMemberRepoProxy(NotificationBase, domain_proxy.MemberRepo):"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def __init__(self, image, repo, context, notifier):"},{"line_number":495,"context_line":"        self.image \u003d image"},{"line_number":496,"context_line":"        self.repo \u003d repo"},{"line_number":497,"context_line":"        self.context \u003d context"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_153311f7","line":494,"in_reply_to":"9a1a9d01_79bf0861","updated":"2015-10-01 12:55:19.000000000","message":"Done","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"05f124d94551cd162c88a976d4a2ac0c365cf61d","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def remove(self, member):"},{"line_number":523,"context_line":"        super(ImageMemberRepoProxy, self).remove(member)"},{"line_number":524,"context_line":"        self.send_notification(\u0027member.delete\u0027, member, extra_payload\u003d{"},{"line_number":525,"context_line":"            \u0027deleted\u0027: True, \u0027deleted_at\u0027: timeutils.isotime()"},{"line_number":526,"context_line":"        })"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_99c21ce8","line":524,"updated":"2015-09-30 16:51:20.000000000","message":"Shouldn\u0027t the member object passed to this method be updated already? Why is the extra payload necessary? The datetime passed in `deleted_at` won\u0027t be the one stored in the database.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"4f2498d8724be1a14d37f09893657eebbbcbd128","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def remove(self, member):"},{"line_number":523,"context_line":"        super(ImageMemberRepoProxy, self).remove(member)"},{"line_number":524,"context_line":"        self.send_notification(\u0027member.delete\u0027, member, extra_payload\u003d{"},{"line_number":525,"context_line":"            \u0027deleted\u0027: True, \u0027deleted_at\u0027: timeutils.isotime()"},{"line_number":526,"context_line":"        })"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_8ea3349e","line":524,"updated":"2015-10-04 12:21:27.000000000","message":"mmmh. not going to block this patch on this but I\u0027ll have to look into it. I\u0027m not convinced it works as we think it does.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"20ae8faaf728e0d305baf96794afdbedcee3a63f","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def remove(self, member):"},{"line_number":523,"context_line":"        super(ImageMemberRepoProxy, self).remove(member)"},{"line_number":524,"context_line":"        self.send_notification(\u0027member.delete\u0027, member, extra_payload\u003d{"},{"line_number":525,"context_line":"            \u0027deleted\u0027: True, \u0027deleted_at\u0027: timeutils.isotime()"},{"line_number":526,"context_line":"        })"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a1a9d01_5f7f6814","line":524,"in_reply_to":"9a1a9d01_99c21ce8","updated":"2015-10-01 12:55:19.000000000","message":"Logic is similar to how Images, Tasks  etc handle the deleted_at field which all set it to None in format methods and explicitly set them in remove method. I checked the database entry for deleted_at and it\u0027s same as what is set in here.","commit_id":"94efae8ed8c2b74920e92114a118dca8a1c2eace"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"9fb7ad46475e000ce2296f9da2c5b8152c21b155","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def format_image_member_notification(image_member):"},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    Given a glance.domain.ImageMember object, return a dictionary of relevant"},{"line_number":139,"context_line":"    notification information."},{"line_number":140,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_119534e3","line":137,"updated":"2016-01-18 12:11:19.000000000","message":"NIT: Docstring should not start with empty line: http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"db94d686108fafa038e7d983b6fc4b5a82f7fbb4"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"62c8e3f1dda1c4bfc8e775ffbf924a814a8803bf","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def format_image_member_notification(image_member):"},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    Given a glance.domain.ImageMember object, return a dictionary of relevant"},{"line_number":139,"context_line":"    notification information."},{"line_number":140,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"9a68dd71_f68a1b1a","line":137,"in_reply_to":"da6ed579_119534e3","updated":"2016-01-25 23:56:58.000000000","message":"Done","commit_id":"db94d686108fafa038e7d983b6fc4b5a82f7fbb4"}],"glance/tests/unit/test_domain_proxy.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ebf51e45514796ef232ccc0625d9c7d790cabec0","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.assertEqual(\u0027cersei\u0027, self.factory.member_id)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class FakeImage(object):"},{"line_number":262,"context_line":"    def __init__(self, result\u003dNone):"},{"line_number":263,"context_line":"        self.result \u003d result"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7a2fa921_e9917a9a","line":261,"updated":"2015-10-07 14:13:08.000000000","message":"This is unused.\n\nI am still in the process of reviewing this MP completely, saw the +2 and wanted to point this out quickly.","commit_id":"0ea083dca95e2c97f244d563230e4e10aaf5276d"}],"glance/tests/unit/test_notifier.py":[{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"fc5d8d4621cb7e514ef26c04d6586e8a07726e0e","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        self.assertEqual(\u0027INFO\u0027, output_log[\u0027notification_type\u0027])"},{"line_number":440,"context_line":"        self.assertEqual(\u0027member.create\u0027, output_log[\u0027event_type\u0027])"},{"line_number":441,"context_line":"        self.assertEqual(self.image_member.member_id,"},{"line_number":442,"context_line":"                         output_log[\u0027payload\u0027][\u0027member_id\u0027])"},{"line_number":443,"context_line":"        self.assertEqual(self.image_member.image_id,"},{"line_number":444,"context_line":"                         output_log[\u0027payload\u0027][\u0027image_id\u0027])"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_21b4a9f0","line":442,"updated":"2015-09-25 14:16:54.000000000","message":"How about checking for other fields of the payload like status, created_at and updated_at?","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"cd339abfadaf5854e6a617b8d45a5e7ed9190703","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        self.assertEqual(\u0027INFO\u0027, output_log[\u0027notification_type\u0027])"},{"line_number":440,"context_line":"        self.assertEqual(\u0027member.create\u0027, output_log[\u0027event_type\u0027])"},{"line_number":441,"context_line":"        self.assertEqual(self.image_member.member_id,"},{"line_number":442,"context_line":"                         output_log[\u0027payload\u0027][\u0027member_id\u0027])"},{"line_number":443,"context_line":"        self.assertEqual(self.image_member.image_id,"},{"line_number":444,"context_line":"                         output_log[\u0027payload\u0027][\u0027image_id\u0027])"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_e82bf180","line":442,"in_reply_to":"9a1a9d01_21b4a9f0","updated":"2015-09-25 14:45:30.000000000","message":"Yeah why not. was just following the image example. will add them in next patch.","commit_id":"50325ef1b8a5fa11c5c4cd7dd51ad7c96cf5fde4"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"5f21269553dddcf571da7191910a82df82ca2c56","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        self.assertEqual(timeutils.isotime(self.image_member.created_at),"},{"line_number":488,"context_line":"                         output_log[\u0027payload\u0027][\u0027created_at\u0027])"},{"line_number":489,"context_line":"        self.assertEqual(timeutils.isotime(self.image_member.updated_at),"},{"line_number":490,"context_line":"                         output_log[\u0027payload\u0027][\u0027updated_at\u0027])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"class TestTaskNotifications(utils.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a1a9d01_f96c219e","line":490,"updated":"2015-09-25 15:54:50.000000000","message":"You could probably move asserts around delete and deleted_at also into this method. We could use a keyword arg to  suggest whether or not its a delete notification. Based on the kwarg, we can assert appropriately.\n\nSomething like this:\ndef _assert_image_member_with_notifier(self, output_log, deleted\u003dFalse):\n.\n.\n.\n    if deleted:\n        self.assertTrue(output_log[\u0027payload\u0027][\u0027deleted\u0027])\n        self.assertIsNotNone(output_log[\u0027payload\u0027][\u0027deleted_at\u0027])\n    else:\n        self.assertFalse(output_log[\u0027payload\u0027][\u0027deleted\u0027])\n        self.assertIsNone(output_log[\u0027payload\u0027][\u0027deleted_at\u0027])","commit_id":"7921bc7c2e4c5b06c20b20f268b1e976f9186b97"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"f5daa5edf29a78a6d24594fbc3111aada89ee59f","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        self.assertEqual(timeutils.isotime(self.image_member.created_at),"},{"line_number":488,"context_line":"                         output_log[\u0027payload\u0027][\u0027created_at\u0027])"},{"line_number":489,"context_line":"        self.assertEqual(timeutils.isotime(self.image_member.updated_at),"},{"line_number":490,"context_line":"                         output_log[\u0027payload\u0027][\u0027updated_at\u0027])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"class TestTaskNotifications(utils.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a1a9d01_54db947c","line":490,"in_reply_to":"9a1a9d01_f96c219e","updated":"2015-09-25 16:10:08.000000000","message":"Done","commit_id":"7921bc7c2e4c5b06c20b20f268b1e976f9186b97"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"77971b03e9f599dd6f295e517230c48ceba198a5","unresolved":false,"context_lines":[{"line_number":469,"context_line":"                              glance.notifier.ImageMemberProxy)"},{"line_number":470,"context_line":"        self.assertEqual(\u0027image_members_from_list\u0027, image_members[0].repo)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def _assert_image_member_with_notifier(self, output_log, deleted\u003dFalse):"},{"line_number":473,"context_line":"        self.assertEqual(self.image_member.member_id,"},{"line_number":474,"context_line":"                         output_log[\u0027payload\u0027][\u0027member_id\u0027])"},{"line_number":475,"context_line":"        self.assertEqual(self.image_member.image_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_564130a8","line":472,"updated":"2015-10-07 13:21:05.000000000","message":"nit: I\u0027d probably put this function at the start of the tests.","commit_id":"8cc1ecf67ea1f54d6cfe83a29723ba4a729f0128"}],"glance/tests/unit/test_quota.py":[{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"77971b03e9f599dd6f295e517230c48ceba198a5","unresolved":false,"context_lines":[{"line_number":605,"context_line":"        self.image_member_factory.new_image_member(self.image,"},{"line_number":606,"context_line":"                                                   \u0027fake_id\u0027)"},{"line_number":607,"context_line":"        nim \u003d self.base_image_member_factory.new_image_member"},{"line_number":608,"context_line":"        nim .assert_called_once_with(self.image, \u0027fake_id\u0027)"},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"    def test_new_image_member_unlimited_members(self):"},{"line_number":611,"context_line":"        self.config(image_member_quota\u003d-1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_966ee8ff","line":608,"updated":"2015-10-07 13:21:05.000000000","message":"stray space before .assert?","commit_id":"8cc1ecf67ea1f54d6cfe83a29723ba4a729f0128"}]}
