)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"1dfdcde72f21f78bee3fad715ce35eed94cef461","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Avoid multiple calls to Glance happening in api.nova.server_list()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Achieve this by preparing a cache for images to be later used by"},{"line_number":10,"context_line":"api.nova.Server - and prepare them prior to wrapping entities fetched"},{"line_number":11,"context_line":"with novaclient with api.nova.Server. Thus the number of calls to"},{"line_number":12,"context_line":"Glance API being made in api.nova.server_list() when the image entity"},{"line_number":13,"context_line":"within a Server lacks name will be reduced."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a26ad4f_f638873f","line":10,"updated":"2015-10-29 16:34:24.000000000","message":"If I am not mistaken, you are no longer preparing the cache of images before hand, but instead you are inserting them into the cache as soon as they are encountered for the first time.","commit_id":"551393d7218da90ccf588918e025ab9b5b21a631"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"c36b4858a083a78144a2b5aef14c8b4310121480","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Avoid multiple calls to Glance happening in api.nova.server_list()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Achieve this by preparing a cache for images to be later used by"},{"line_number":10,"context_line":"api.nova.Server - and prepare them prior to wrapping entities fetched"},{"line_number":11,"context_line":"with novaclient with api.nova.Server. Thus the number of calls to"},{"line_number":12,"context_line":"Glance API being made in api.nova.server_list() when the image entity"},{"line_number":13,"context_line":"within a Server lacks name will be reduced."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a26ad4f_7aebdfb0","line":10,"in_reply_to":"1a26ad4f_f638873f","updated":"2015-10-30 11:35:45.000000000","message":"Done","commit_id":"551393d7218da90ccf588918e025ab9b5b21a631"},{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"3534f4e00e7e086fbfc721183d820d10ca761a5b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Avoid multiple calls to Glance happening in api.nova.server_list()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Achieve this by caching for images to be later used by"},{"line_number":10,"context_line":"api.nova.Server - and prepare them prior to wrapping entities fetched"},{"line_number":11,"context_line":"with novaclient with api.nova.Server. Thus the number of calls to"},{"line_number":12,"context_line":"Glance API being made in api.nova.server_list() when the image entity"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1a26ad4f_df73f87e","line":9,"updated":"2015-10-30 20:24:15.000000000","message":"I would say something like: \"The solution proposed in this change accomplishes this by caching glance images as they are encountered in the call to \u0027image_get\u0027 in \u0027api.nova.Server\u0027, thus eliminating the need for a n API call the next time an instance of that image type is found.\"","commit_id":"34d3985403041e02be5ecdfb020ebe9e180de4eb"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"ea47f70b4be7c6aec4fa9b150b8716352484881f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Avoid multiple calls to Glance happening in api.nova.server_list()"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Achieve this by caching for images to be later used by"},{"line_number":10,"context_line":"api.nova.Server - and prepare them prior to wrapping entities fetched"},{"line_number":11,"context_line":"with novaclient with api.nova.Server. Thus the number of calls to"},{"line_number":12,"context_line":"Glance API being made in api.nova.server_list() when the image entity"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"fa80f949_2f34bedc","line":9,"in_reply_to":"1a26ad4f_df73f87e","updated":"2015-11-03 14:02:26.000000000","message":"Done","commit_id":"34d3985403041e02be5ecdfb020ebe9e180de4eb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"588a119147ae15cb35d644518aa35a5665a4994d","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"[1] https://developer.openstack.org/api-ref/image/v2/#show-images"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: #1508554"},{"line_number":15,"context_line":"Change-Id: Iac485c1b448011fec97ba5bfaa83851914b294d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"df87a7cf_676e9997","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":20},"updated":"2017-12-15 10:36:08.000000000","message":"This patch seems unrelated to bug 1508554. bug 1508554 is about accessing image_name property of a Server() object triggers Glance API call.\n\nHowever, the proposed change is to specify required image IDs and it only contributes to reduce the response size.\n\nThus, I believe this is a different topic.","commit_id":"289cbfc18db30beb7d5c4dcff7b8d0f20ed08909"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b209e3f18df78b2f984d0360777dc7b39d4f9daa","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"[1] https://developer.openstack.org/api-ref/image/v2/#show-images"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: #1508554"},{"line_number":15,"context_line":"Co-Authored-By: Ivan Kolodyazhny \u003ce0ne@e0ne.info\u003e"},{"line_number":16,"context_line":"Change-Id: Iac485c1b448011fec97ba5bfaa83851914b294d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bf8cb3f7_030eba8c","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":20},"updated":"2017-12-24 13:06:15.000000000","message":"This is not related to this bug directly. The bug reported has been fixed as a fix for the duplicated bug. The bug itself is image_get API is called per server.\n\nAt least this should be \"Related-Bug\" rather than \"Closes-Bug\"\nThis commit tries to reduces the number of images to be fetched.","commit_id":"037376201c957db77af3ff5680504fcf4bf574c4"}],"openstack_dashboard/api/glance.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4cff0d3bf7c5e8dff47700be81a3e2ca0033b096","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"# NOTE(e0ne): 36 is a lengght of UUID, we need tp have \u0027+\u0027 for sapparator."},{"line_number":66,"context_line":"# Decreasing value by 1 to make sure it could be send to a server"},{"line_number":67,"context_line":"MAX_IMGAGES_PER_REQUEST \u003d MAX_URI_LEN / (36 + 1) - 1"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class Image(base.APIResourceWrapper):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_ecf37b9d","line":67,"updated":"2017-12-24 13:16:18.000000000","message":"Did you take into account the length of the base path?\n\nLooking at [1], at least you need to consider the length of \"/v2/images?id\u003din\". In addition, the length depends on how API endpoint is configured. Thus, in the neutron API wrapper implementation, we catch the exception of exceeding the maximum length and calculate the remaining size dynamically.\n\n[1] https://developer.openstack.org/api-ref/image/v2/index.html#show-images","commit_id":"037376201c957db77af3ff5680504fcf4bf574c4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4cff0d3bf7c5e8dff47700be81a3e2ca0033b096","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        filters \u003d {\u0027id\u0027: \u0027in:\u0027 + \u0027,\u0027.join(ids_to_filter)}"},{"line_number":373,"context_line":"        tmp_images.append(image_list_detailed(request, filters\u003dfilters)[0])"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    return tmp_images"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"@profiler.trace"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_4c238706","line":375,"updated":"2017-12-24 13:16:18.000000000","message":"Could you add a test to cover the change?","commit_id":"037376201c957db77af3ff5680504fcf4bf574c4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0ef66cdfa8937049c66151d28c1ef449b0966b9c","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"@profiler.trace"},{"line_number":272,"context_line":"def image_list_detailed_by_ids(request, ids\u003dNone):"},{"line_number":273,"context_line":"    tmp_images \u003d []"},{"line_number":274,"context_line":"    if not ids:"},{"line_number":275,"context_line":"        return tmp_images"},{"line_number":276,"context_line":"    for i in range(0, len(ids), MAX_IMGAGES_PER_REQUEST):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_a7a80dda","line":273,"range":{"start_line":273,"start_character":4,"end_line":273,"end_character":14},"updated":"2018-11-04 19:20:50.000000000","message":"nit: \"images\" would be a better name.","commit_id":"b9a7e0001b443ef0d09053d3c2aa519f8a1f3efc"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"ece21bc2a86bff14402124cc1761ac65233c7f50","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"@profiler.trace"},{"line_number":272,"context_line":"def image_list_detailed_by_ids(request, ids\u003dNone):"},{"line_number":273,"context_line":"    tmp_images \u003d []"},{"line_number":274,"context_line":"    if not ids:"},{"line_number":275,"context_line":"        return tmp_images"},{"line_number":276,"context_line":"    for i in range(0, len(ids), MAX_IMGAGES_PER_REQUEST):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_a19539e4","line":273,"range":{"start_line":273,"start_character":4,"end_line":273,"end_character":14},"in_reply_to":"3f79a3b5_a7a80dda","updated":"2018-11-06 10:32:19.000000000","message":"Fixed everything","commit_id":"b9a7e0001b443ef0d09053d3c2aa519f8a1f3efc"}],"openstack_dashboard/api/nova.py":[{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"b85b88983bd154c315aa9374dbd3e01301ae3b46","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        if \u0027name\u0027 in self.image:"},{"line_number":115,"context_line":"            return self.image[\u0027name\u0027]"},{"line_number":116,"context_line":"        elif self.image[\u0027id\u0027] in self._images:"},{"line_number":117,"context_line":"            return self._images[self.image[\u0027id\u0027]].getattr(\u0027name\u0027, _(\"-\"))"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            try:"},{"line_number":120,"context_line":"                image \u003d glance.image_get(self.request, self.image[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_158d4731","line":117,"updated":"2015-10-27 14:57:29.000000000","message":"\".getattr()\" is not a valid use of the python object method getattr().  This is most likely where the gates are failing.  There  is no \"getattr()\" method for the images object.  The correct use of this method would be: \"getattr(self._images[self.image[\u0027id\u0027]], \u0027name\u0027, _(\"-\"))\"","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"fcd4b911a966f1282ab60c534602bf33ec4fe498","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        if \u0027name\u0027 in self.image:"},{"line_number":115,"context_line":"            return self.image[\u0027name\u0027]"},{"line_number":116,"context_line":"        elif self.image[\u0027id\u0027] in self._images:"},{"line_number":117,"context_line":"            return self._images[self.image[\u0027id\u0027]].getattr(\u0027name\u0027, _(\"-\"))"},{"line_number":118,"context_line":"        else:"},{"line_number":119,"context_line":"            try:"},{"line_number":120,"context_line":"                image \u003d glance.image_get(self.request, self.image[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_f14684be","line":117,"in_reply_to":"1a26ad4f_158d4731","updated":"2015-10-28 09:13:29.000000000","message":"Thank you! You are completly right. Done.","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"},{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"b85b88983bd154c315aa9374dbd3e01301ae3b46","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                image \u003d glance.image_get(self.request, self.image[\u0027id\u0027])"},{"line_number":121,"context_line":"                return image.name"},{"line_number":122,"context_line":"            except glance_exceptions.ClientException:"},{"line_number":123,"context_line":"                return _(\"-\")"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def internal_name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_1004757c","line":123,"updated":"2015-10-27 14:57:29.000000000","message":"Could this entire \u0027else\u0027 block be simplified down to just \"return _(\"-\")\"?  The new method proposed in api/glance.py makes the same call to \"glance.image_get()\", and returns a empty dictionary {} if no image is found.  This call to glance will do nothing but raise the same exception.","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"fcd4b911a966f1282ab60c534602bf33ec4fe498","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                image \u003d glance.image_get(self.request, self.image[\u0027id\u0027])"},{"line_number":121,"context_line":"                return image.name"},{"line_number":122,"context_line":"            except glance_exceptions.ClientException:"},{"line_number":123,"context_line":"                return _(\"-\")"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @property"},{"line_number":126,"context_line":"    def internal_name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_b117aca2","line":123,"in_reply_to":"1a26ad4f_1004757c","updated":"2015-10-28 09:13:29.000000000","message":"Looks like you here you are right too. Thanks, done.","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"},{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"2ee2ea092f492231e79d93236e47382629f48ab5","unresolved":false,"context_lines":[{"line_number":99,"context_line":"              \u0027OS-EXT-SRV-ATTR:host\u0027, \u0027OS-EXT-AZ:availability_zone\u0027,"},{"line_number":100,"context_line":"              \u0027OS-DCF:diskConfig\u0027]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, apiresource, request, glance_cache\u003dNone):"},{"line_number":103,"context_line":"        super(Server, self).__init__(apiresource)"},{"line_number":104,"context_line":"        self.request \u003d request"},{"line_number":105,"context_line":"        self.glance_cache \u003d glance_cache"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_cd5dc37a","line":102,"updated":"2015-10-29 13:35:05.000000000","message":"I suggest renaming the variable \"glance_cache\" to \"glance_image_cache\" or just  \"image_cache\" to be more specific and avoid confusion in the future.","commit_id":"7f74cd12b4d14b55758440c1417578a84a806104"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"ffa26e53b2114bb6cff3c5f95f8d59b79902f05b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"              \u0027OS-EXT-SRV-ATTR:host\u0027, \u0027OS-EXT-AZ:availability_zone\u0027,"},{"line_number":100,"context_line":"              \u0027OS-DCF:diskConfig\u0027]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, apiresource, request, glance_cache\u003dNone):"},{"line_number":103,"context_line":"        super(Server, self).__init__(apiresource)"},{"line_number":104,"context_line":"        self.request \u003d request"},{"line_number":105,"context_line":"        self.glance_cache \u003d glance_cache"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_fc3aab97","line":102,"in_reply_to":"1a26ad4f_cd5dc37a","updated":"2015-10-29 15:07:04.000000000","message":"Yep, I thought about it too. Looks like you\u0027re right, it is a better way.","commit_id":"7f74cd12b4d14b55758440c1417578a84a806104"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"da67614394410789d8c10ebf8d63179ccfc79d7d","unresolved":false,"context_lines":[{"line_number":570,"context_line":"        \u0027id\u0027: \u0027in:\u0027 + \u0027,\u0027.join(ser_images.keys())}"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    try:"},{"line_number":573,"context_line":"        images, _, _ \u003d glance.image_list_detailed(request, filters\u003dimg_filters)"},{"line_number":574,"context_line":"    except (glance_exceptions.ClientException,"},{"line_number":575,"context_line":"            horizon_exceptions.ServiceCatalogException):"},{"line_number":576,"context_line":"        images \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_aa1a7314","line":573,"range":{"start_line":573,"start_character":23,"end_line":573,"end_character":50},"updated":"2017-12-01 15:40:12.000000000","message":"This patch adds a new call of glance.image_list_detailed, but we already have another api.glance.image_list_detailed in openstack_dashboard.dashboards.project.instances.view [1], so as a result glance.image_list_detailed will be called twice. If you go to this route, double call of image_list_detailed should be eliminated.\n\nIn the admin panel, we have a problem in the admin instances table, but there is a proposed fix https://review.openstack.org/#/c/507388/ and this fixes a problem in the admin instances table.\n\nNote that I don\u0027t know there is another case we have a problem.\n\nIn addition, if you add this logic to server_list(), could you add a flag to control whether image_list_detailed needs to be called as an argument. I don\u0027t think we always need to call image_list_detailed in server_list. We should call image_list_detailed only when necessary.\n\n\n[1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/project/instances/views.py#L116","commit_id":"6440fb4562a99113fc03aa85ec1bcf77665d5337"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"654e31d1ecc63412838a3776bc16aae7e60c5fba","unresolved":false,"context_lines":[{"line_number":570,"context_line":"        \u0027id\u0027: \u0027in:\u0027 + \u0027,\u0027.join(ser_images.keys())}"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    try:"},{"line_number":573,"context_line":"        images, _, _ \u003d glance.image_list_detailed(request, filters\u003dimg_filters)"},{"line_number":574,"context_line":"    except (glance_exceptions.ClientException,"},{"line_number":575,"context_line":"            horizon_exceptions.ServiceCatalogException):"},{"line_number":576,"context_line":"        images \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"df87a7cf_cc054a7c","line":573,"range":{"start_line":573,"start_character":23,"end_line":573,"end_character":50},"in_reply_to":"df87a7cf_aa1a7314","updated":"2017-12-15 09:57:05.000000000","message":"I guess I\u0027d move filters logic to views then, and drop new image list call","commit_id":"6440fb4562a99113fc03aa85ec1bcf77665d5337"}],"openstack_dashboard/dashboards/admin/instances/tests.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        servers \u003d self.servers.list()"},{"line_number":38,"context_line":"        # TODO(vmarkov) instances_img_ids should be in test_data"},{"line_number":39,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":40,"context_line":"                       servers if hasattr(instance, \u0027image\u0027)]  # noqa"},{"line_number":41,"context_line":"        self.mock_extension_supported.return_value \u003d True"},{"line_number":42,"context_line":"        self.mock_tenant_list.return_value \u003d [self.tenants.list(), False]"},{"line_number":43,"context_line":"        self.mock_image_list_detailed_by_ids.return_value \u003d self.images.list()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_338cd0d5","line":40,"range":{"start_line":40,"start_character":63,"end_line":40,"end_character":69},"updated":"2018-08-15 02:42:57.000000000","message":"noqa looks unnecessary.","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        servers \u003d self.servers.list()"},{"line_number":73,"context_line":"        flavors \u003d self.flavors.list()"},{"line_number":74,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":75,"context_line":"                       servers if hasattr(instance, \u0027image\u0027)]  # noqa"},{"line_number":76,"context_line":"        full_flavors \u003d OrderedDict([(f.id, f) for f in flavors])"},{"line_number":77,"context_line":"        self.mock_server_list.return_value \u003d [servers, False]"},{"line_number":78,"context_line":"        self.mock_extension_supported.return_value \u003d True"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_d3c0fce3","line":75,"range":{"start_line":75,"start_character":63,"end_line":75,"end_character":69},"updated":"2018-08-15 02:42:57.000000000","message":"Drop \u0027# noqa\u0027.","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def test_index_flavor_get_exception(self):"},{"line_number":117,"context_line":"        servers \u003d self.servers.list()"},{"line_number":118,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":119,"context_line":"                             servers if hasattr(instance, \u0027image\u0027)]  # noqa"},{"line_number":120,"context_line":"        # UUIDs generated using indexes are unlikely to match"},{"line_number":121,"context_line":"        # any of existing flavor ids and are guaranteed to be deterministic."},{"line_number":122,"context_line":"        for i, server in enumerate(servers):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_f3c3b8eb","line":119,"range":{"start_line":119,"start_character":69,"end_line":119,"end_character":75},"updated":"2018-08-15 02:42:57.000000000","message":"ditto","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    def test_index_options_before_migrate(self):"},{"line_number":231,"context_line":"        servers \u003d self.servers.list()"},{"line_number":232,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":233,"context_line":"                       servers if hasattr(instance, \u0027image\u0027)]  # noqa"},{"line_number":234,"context_line":"        self.mock_tenant_list.return_value \u003d [self.tenants.list(), False]"},{"line_number":235,"context_line":"        self.mock_image_list_detailed_by_ids.return_value \u003d self.images.list()"},{"line_number":236,"context_line":"        self.mock_flavor_list.return_value \u003d self.flavors.list()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_93b6048a","line":233,"range":{"start_line":233,"start_character":63,"end_line":233,"end_character":69},"updated":"2018-08-15 02:42:57.000000000","message":"ditto","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        server2 \u003d servers[2]"},{"line_number":268,"context_line":"        server2.status \u003d \"VERIFY_RESIZE\""},{"line_number":269,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":270,"context_line":"                       servers if hasattr(instance, \u0027image\u0027)]  # noqa"},{"line_number":271,"context_line":"        self.mock_tenant_list.return_value \u003d [self.tenants.list(), False]"},{"line_number":272,"context_line":"        self.mock_image_list_detailed_by_ids.return_value \u003d self.images.list()"},{"line_number":273,"context_line":"        self.mock_flavor_list.return_value \u003d self.flavors.list()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_53b4ec7f","line":270,"range":{"start_line":270,"start_character":63,"end_line":270,"end_character":69},"updated":"2018-08-15 02:42:57.000000000","message":"ditto","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0ef66cdfa8937049c66151d28c1ef449b0966b9c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        servers \u003d self.servers.list()"},{"line_number":38,"context_line":"        # TODO(vmarkov) instances_img_ids should be in test_data"},{"line_number":39,"context_line":"        instances_img_ids \u003d [instance.image.get(\u0027id\u0027) for instance in"},{"line_number":40,"context_line":"                             servers if hasattr(instance, \u0027image\u0027)]"},{"line_number":41,"context_line":"        self.mock_extension_supported.return_value \u003d True"},{"line_number":42,"context_line":"        self.mock_tenant_list.return_value \u003d [self.tenants.list(), False]"},{"line_number":43,"context_line":"        self.mock_image_list_detailed_by_ids.return_value \u003d self.images.list()"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_678bd568","line":40,"range":{"start_line":40,"start_character":40,"end_line":40,"end_character":66},"updated":"2018-11-04 19:20:50.000000000","message":"See my comment in views.py.\nI wonder this happens in real cases.","commit_id":"b9a7e0001b443ef0d09053d3c2aa519f8a1f3efc"}],"openstack_dashboard/dashboards/admin/instances/views.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4cff0d3bf7c5e8dff47700be81a3e2ca0033b096","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                image_map.update([(image.id, image) for image in images])"},{"line_number":129,"context_line":"            except Exception:"},{"line_number":130,"context_line":"                msg \u003d _(\"Unable to retrieve image list.\")"},{"line_number":131,"context_line":"                exceptions.handle(self.request, msg)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        def _task_get_flavors():"},{"line_number":134,"context_line":"            # Gather our flavors to correlate against IDs"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_0c1d7fbc","side":"PARENT","line":131,"updated":"2017-12-24 13:16:18.000000000","message":"Why is it changed? It looks unrelatedly as a quick look.","commit_id":"7c087f0cadde861cd42090cf562bae25385f5e5b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4cff0d3bf7c5e8dff47700be81a3e2ca0033b096","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                tmp_images \u003d api.glance.image_list_detailed_by_ids("},{"line_number":132,"context_line":"                    self.request, real_img_ids)"},{"line_number":133,"context_line":"                images.extend(tmp_images)"},{"line_number":134,"context_line":"                image_map.update([(str(image.id), image) for image in images])"},{"line_number":135,"context_line":"            except Exception:"},{"line_number":136,"context_line":"                exceptions.handle(self.request, ignore\u003dTrue)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_ac79f3fc","line":134,"range":{"start_line":134,"start_character":35,"end_line":134,"end_character":38},"updated":"2017-12-24 13:16:18.000000000","message":"why is str() needed?\n\nI see the project panel implementation does so, but it does not convince me.","commit_id":"037376201c957db77af3ff5680504fcf4bf574c4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            exceptions.handle(self.request, msg)"},{"line_number":91,"context_line":"            return {}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _get_images(self, instances\u003d()):"},{"line_number":94,"context_line":"        # Gather our images to correlate our instances to them"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_33de10da","line":93,"range":{"start_line":93,"start_character":26,"end_line":93,"end_character":38},"updated":"2018-08-15 02:42:57.000000000","message":"Avoid using a mutable default value.\n\nhttps://docs.quantifiedcode.com/python-anti-patterns/correctness/mutable_default_value_as_argument.html","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"b24c58a4ee57c408a1f8aaf3189e85fbe52c53b7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            exceptions.handle(self.request, msg)"},{"line_number":91,"context_line":"            return {}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _get_images(self, instances\u003d()):"},{"line_number":94,"context_line":"        # Gather our images to correlate our instances to them"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_f9339612","line":93,"range":{"start_line":93,"start_character":26,"end_line":93,"end_character":38},"in_reply_to":"3f79a3b5_33de10da","updated":"2018-08-15 10:26:33.000000000","message":"Tuple is immutable","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def _get_images(self, instances\u003d()):"},{"line_number":94,"context_line":"        # Gather our images to correlate our instances to them"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was"},{"line_number":97,"context_line":"            #                 booted from."},{"line_number":98,"context_line":"            img_ids \u003d (instance.image.get(\u0027id\u0027) for instance in"},{"line_number":99,"context_line":"                       instances if hasattr(instance, \u0027image\u0027))  # noqa"},{"line_number":100,"context_line":"            real_img_ids \u003d list(filter(None, img_ids))"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_d37b1cf2","line":97,"range":{"start_line":96,"start_character":12,"end_line":97,"end_character":42},"updated":"2018-08-15 02:42:57.000000000","message":"nit: This fits into one line.","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was"},{"line_number":97,"context_line":"            #                 booted from."},{"line_number":98,"context_line":"            img_ids \u003d (instance.image.get(\u0027id\u0027) for instance in"},{"line_number":99,"context_line":"                       instances if hasattr(instance, \u0027image\u0027))  # noqa"},{"line_number":100,"context_line":"            real_img_ids \u003d list(filter(None, img_ids))"},{"line_number":101,"context_line":"            images \u003d api.glance.image_list_detailed_by_ids("},{"line_number":102,"context_line":"                self.request, real_img_ids)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_d3c9dc25","line":99,"range":{"start_line":99,"start_character":65,"end_line":99,"end_character":71},"updated":"2018-08-15 02:42:57.000000000","message":"\u0027noqa\u0027 looks unnecessary.","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            real_img_ids \u003d list(filter(None, img_ids))"},{"line_number":101,"context_line":"            images \u003d api.glance.image_list_detailed_by_ids("},{"line_number":102,"context_line":"                self.request, real_img_ids)"},{"line_number":103,"context_line":"            image_map \u003d dict([(image.id, image) for image in images])"},{"line_number":104,"context_line":"            return image_map"},{"line_number":105,"context_line":"        except Exception:"},{"line_number":106,"context_line":"            exceptions.handle(self.request, ignore\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_33705008","line":103,"range":{"start_line":103,"start_character":29,"end_line":103,"end_character":30},"updated":"2018-08-15 02:42:57.000000000","message":"Array is unnecessary.\n\n dict((image.id, image) for image in images)","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0ef66cdfa8937049c66151d28c1ef449b0966b9c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # Gather our images to correlate our instances to them"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was booted from."},{"line_number":97,"context_line":"            img_ids \u003d (instance.image.get(\u0027id\u0027) for instance in"},{"line_number":98,"context_line":"                       instances if hasattr(instance, \u0027image\u0027))"},{"line_number":99,"context_line":"            real_img_ids \u003d list(filter(None, img_ids))"},{"line_number":100,"context_line":"            images \u003d api.glance.image_list_detailed_by_ids("}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_4781f94b","line":97,"range":{"start_line":97,"start_character":23,"end_line":97,"end_character":47},"updated":"2018-11-04 19:20:50.000000000","message":"You need to care a case where \"instance.image\" is an empty string which mean an instance is booted from a volume.","commit_id":"b9a7e0001b443ef0d09053d3c2aa519f8a1f3efc"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0ef66cdfa8937049c66151d28c1ef449b0966b9c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(aarefiev): request images, instances was booted from."},{"line_number":97,"context_line":"            img_ids \u003d (instance.image.get(\u0027id\u0027) for instance in"},{"line_number":98,"context_line":"                       instances if hasattr(instance, \u0027image\u0027))"},{"line_number":99,"context_line":"            real_img_ids \u003d list(filter(None, img_ids))"},{"line_number":100,"context_line":"            images \u003d api.glance.image_list_detailed_by_ids("},{"line_number":101,"context_line":"                self.request, real_img_ids)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_87add1e8","line":98,"range":{"start_line":98,"start_character":36,"end_line":98,"end_character":62},"updated":"2018-11-04 19:20:50.000000000","message":"Is there a case where an instance does not have \u0027image\u0027 attribute? Even when an instance is booted from a volume, nova returns \"image\" attribute with an empty string. I wonder this \"if\" check is meaningless.","commit_id":"b9a7e0001b443ef0d09053d3c2aa519f8a1f3efc"}],"openstack_dashboard/dashboards/admin/volumes/tabs.py":[{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"2ee2ea092f492231e79d93236e47382629f48ab5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    #         exceptions.handle(self.request,"},{"line_number":48,"context_line":"    #                           _(\"Unable to retrieve volume/instance \""},{"line_number":49,"context_line":"    #                             \"attachment information\"))"},{"line_number":50,"context_line":"    #         return []"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_volumes_data(self):"},{"line_number":53,"context_line":"        volumes \u003d self._get_volumes(search_opts\u003d{\u0027all_tenants\u0027: True})"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_6dd26f02","line":50,"updated":"2015-10-29 13:35:05.000000000","message":"Is there a reason this particular code is here and commented out?","commit_id":"7f74cd12b4d14b55758440c1417578a84a806104"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"ffa26e53b2114bb6cff3c5f95f8d59b79902f05b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    #         exceptions.handle(self.request,"},{"line_number":48,"context_line":"    #                           _(\"Unable to retrieve volume/instance \""},{"line_number":49,"context_line":"    #                             \"attachment information\"))"},{"line_number":50,"context_line":"    #         return []"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_volumes_data(self):"},{"line_number":53,"context_line":"        volumes \u003d self._get_volumes(search_opts\u003d{\u0027all_tenants\u0027: True})"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_9c41370e","line":50,"in_reply_to":"1a26ad4f_6dd26f02","updated":"2015-10-29 15:07:04.000000000","message":"Done","commit_id":"7f74cd12b4d14b55758440c1417578a84a806104"}],"openstack_dashboard/dashboards/project/instances/views.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"588a119147ae15cb35d644518aa35a5665a4994d","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                #                 booted from."},{"line_number":127,"context_line":"                img_ids \u003d (instance.image.get(\u0027id\u0027) for instance in"},{"line_number":128,"context_line":"                           instances if hasattr(instance, \u0027image\u0027))"},{"line_number":129,"context_line":"                filters \u003d {\u0027id\u0027: \u0027in:\u0027 + \u0027,\u0027.join(filter(None, img_ids))}"},{"line_number":130,"context_line":"                # TODO(gabriel): Handle pagination."},{"line_number":131,"context_line":"                tmp_images \u003d api.glance.image_list_detailed(self.request,"},{"line_number":132,"context_line":"                                                            filters\u003dfilters)[0]"}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_c74c4578","line":129,"updated":"2017-12-15 10:36:08.000000000","message":"Does it work correctly when we have hundreds of servers in a single page? If \"items per page\" is set to big enough like 100 for example, filters potentially contains 100 UUIDs. The resulting URL will be at least 3600 bytes. There is the maximum length in the length of URLs and if we exceed the maximum we will get an error from a web server.\n\nAt least, some guard mechanism is required.\n\nHorizon neutron API wrapper has a code to handle this [1]. You can do similar thing. Another way is to check the number of images and fallback to a normal image_list if the number of images is not small.\n\n[1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/api/neutron.py#L769","commit_id":"289cbfc18db30beb7d5c4dcff7b8d0f20ed08909"}],"openstack_dashboard/dashboards/project/volumes/tabs.py":[{"author":{"_account_id":16769,"name":"Lucas Palm","email":"lapalm@us.ibm.com","username":"lucaspalm"},"change_message_id":"b85b88983bd154c315aa9374dbd3e01301ae3b46","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            instances, has_more \u003d api.nova.server_list(self.request,"},{"line_number":45,"context_line":"                                                       search_opts\u003dsearch_opts,"},{"line_number":46,"context_line":"                                                       all_tenants\u003dTrue)"},{"line_number":47,"context_line":"            return instances"},{"line_number":48,"context_line":"        except Exception:"},{"line_number":49,"context_line":"            exceptions.handle(self.request,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_b29ee905","line":46,"updated":"2015-10-27 14:57:29.000000000","message":"Does this addition actually have anything to do with this particular change?","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"},{"author":{"_account_id":13325,"name":"Paul Karikh","email":"pkarikh@gmail.com","username":"paul.karikh"},"change_message_id":"fcd4b911a966f1282ab60c534602bf33ec4fe498","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            instances, has_more \u003d api.nova.server_list(self.request,"},{"line_number":45,"context_line":"                                                       search_opts\u003dsearch_opts,"},{"line_number":46,"context_line":"                                                       all_tenants\u003dTrue)"},{"line_number":47,"context_line":"            return instances"},{"line_number":48,"context_line":"        except Exception:"},{"line_number":49,"context_line":"            exceptions.handle(self.request,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a26ad4f_316b9c20","line":46,"in_reply_to":"1a26ad4f_b29ee905","updated":"2015-10-28 09:13:29.000000000","message":"Actually yes. If we do not set all_tenants\u003dTrue here, this line https://github.com/openstack/horizon/blob/master/openstack_dashboard/api/nova.py#L614\nwill ignore all_tenants\u003dTrue in the search_opts.","commit_id":"15d1ebb8ebbeaf9b0563dc8c15d67e608bcf1c21"}],"openstack_dashboard/test/unit/api/test_glance.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"af0a39ed01b197bfe98c16df952e95a44825eebf","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        images \u003d api.glance.image_list_detailed_by_ids(self.request,"},{"line_number":47,"context_line":"                                                       instances_img_ids)"},{"line_number":48,"context_line":"        self.assertEqual(images, expected_images)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @override_settings(API_RESULT_PAGE_SIZE\u003d2)"},{"line_number":51,"context_line":"    @mock.patch.object(api.glance, \u0027glanceclient\u0027)"},{"line_number":52,"context_line":"    def test_image_list_detailed_no_pagination(self, mock_glanceclient):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_7386c8bb","line":49,"updated":"2018-08-15 02:42:57.000000000","message":"Could you add unit tests to cover a case of too long URL?","commit_id":"22eb91e6fd8a885d854fd44edbb95529d36bacd3"}]}
