)]}'
{"openstack_dashboard/dashboards/project/instances/forms.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c83cc3cddcb1d12ac4d95fef35144839517547b5","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        for volume in volume_list:"},{"line_number":205,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":206,"context_line":"            # Or those with multiattach enabled"},{"line_number":207,"context_line":"            if not volume.attachments or getattr(volume, \u0027multiattach\u0027, False):"},{"line_number":208,"context_line":"                volumes.append("},{"line_number":209,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":210,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_a0eac7d4","line":207,"range":{"start_line":207,"start_character":38,"end_line":207,"end_character":79},"updated":"2019-05-29 17:59:11.000000000","message":"You should have a test for this logic.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5bd3fedc7b31a6349fc86cd365d24c1a1d68e51d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        for volume in volume_list:"},{"line_number":205,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":206,"context_line":"            # Or those with multiattach enabled"},{"line_number":207,"context_line":"            if not volume.attachments or getattr(volume, \u0027multiattach\u0027, False):"},{"line_number":208,"context_line":"                volumes.append("},{"line_number":209,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":210,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_032c5d45","line":207,"range":{"start_line":207,"start_character":38,"end_line":207,"end_character":79},"in_reply_to":"bfb3d3c7_a0eac7d4","updated":"2019-06-07 10:25:40.000000000","message":"added in updated PS.\nthanks","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c83cc3cddcb1d12ac4d95fef35144839517547b5","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_c0e9fbe5","line":242,"updated":"2019-05-29 17:59:11.000000000","message":"Note that MultiattachNotSupportedByVirtDriver and MultiattachSupportNotYetAvailable are also possible but those are 409s:\n\nhttps://github.com/openstack/nova/blob/d4f58f5eb6e68d0348868efc45212b70feb0bde1/nova/api/openstack/compute/volumes.py#L343-L344","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8c29572c1c2b1322a60f10de5c67057eb301d1f9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_95bbde0c","line":242,"in_reply_to":"9fb8cfa7_37c089e1","updated":"2019-06-19 05:55:47.000000000","message":"We are in the early or middle of the development cycle and have enough time till the release. My suggestion is to improve novaclient (you can do it) and to update novaclient dependencies in horizon.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"031c46b1cb0ce1161635297d14aa9805583de1eb","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_75ef4ae9","line":242,"in_reply_to":"9fb8cfa7_95bbde0c","updated":"2019-06-19 06:13:34.000000000","message":"I think the exceptions are thrown from nova API side [1] and not from novaclient, and IMO all the API\u0027s return HTTP response rather than module specific exceptions so the nova code seems valid to me. Since horizon also sends and receives HTTP request and response to nova API, can we still get a custom defined exception in return? \n\n[1] https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/volumes.py#L354","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6f2277704322d5ab1ee44439280d463c1f92b073","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_553b269b","line":242,"in_reply_to":"9fb8cfa7_95bbde0c","updated":"2019-06-19 05:57:22.000000000","message":"horizon is a user of various python bindings in the same development community. If we find something to be improved, it is highly recommended to improve the python bindings like novaclient rather than adding workaround in the horizon side.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4c53a595831b1c10451825e7f99b01352152ca79","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_32c0c07b","line":242,"in_reply_to":"9fb8cfa7_a3223151","updated":"2019-06-07 15:51:31.000000000","message":"No response from my comment? What is done regarding my comment?","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e7c15e72463e1ee6b442046d1b54d4c8745360d9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_fb97a939","line":242,"in_reply_to":"9fb8cfa7_b8113756","updated":"2019-06-19 08:29:15.000000000","message":"Thanks for clarification. I thought nova API returns information on exception type in API responses, but it is not true.\n\nAs of now, it seems we need to use a message from novaclient.\n\nI think it is enough to change the original L.242 to:\n\n    msg \u003d _(\u0027Unable to attach volume: %s\u0027) % ex\n\nThought?","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"1f7ac2aa780de16a0efa3318dd0ceb278f257afa","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_8fb42737","line":242,"in_reply_to":"9fb8cfa7_b8113756","updated":"2019-06-19 12:26:28.000000000","message":"Thanks for the input.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fc654c0e2f249ed078a97346168c8eb7703403e5","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_b8113756","line":242,"in_reply_to":"9fb8cfa7_c97c88b7","updated":"2019-06-19 07:21:58.000000000","message":"Yeah, novaclient does not map the specific exception in each case. Actually, nova has lot of internal exception which is mapped to generic HTTP exception by API. for example boot server[1] so not sure how many novaclient can map them.\n\nThere are more exception raised by novalcient in this case like: NotFound, Forbidden. If you are not modifying the error message then why not just showing the error message as it is for all cases except 500 and last else part can be under condition- ex.htpp_status \u003d\u003d 500\n\n[1] https://opendev.org/openstack/nova/src/branch/master/nova/api/openstack/compute/servers.py#L695-L763\n\n[2] https://opendev.org/openstack/nova/src/commit/a5cf4ae9388d39dc58991612f40146da8ac9efbe/nova/api/openstack/compute/volumes.py","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7dacc8e1a491ef80a1d3264b8c52cda9743aea94","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_37c089e1","line":242,"in_reply_to":"9fb8cfa7_c97c88b7","updated":"2019-06-11 08:29:20.000000000","message":"agreed, but IMO this changes should take place from nova side. could you suggest something we can do from horizon side to improve it?","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"1f7ac2aa780de16a0efa3318dd0ceb278f257afa","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_ef7cc373","line":242,"in_reply_to":"9fb8cfa7_fb97a939","updated":"2019-06-19 12:26:28.000000000","message":"agreed, done.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b5b64de6e97e448cdfa7ecf076b471d71ca5a9ac","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_a493525c","line":242,"in_reply_to":"9fb8cfa7_fb97a939","updated":"2019-06-19 11:20:10.000000000","message":"yeah, that works fine and can include the detailed error msg.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5bd3fedc7b31a6349fc86cd365d24c1a1d68e51d","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_a3223151","line":242,"in_reply_to":"bfb3d3c7_c0e9fbe5","updated":"2019-06-07 10:25:40.000000000","message":"Done.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6185459e6bf52846f5d3cc355259d06187056df4","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            if isinstance(ex, api.nova.VolumeMultiattachNotSupported):"},{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_c97c88b7","line":242,"in_reply_to":"bfb3d3c7_c0e9fbe5","updated":"2019-06-02 07:38:31.000000000","message":"Ideally, horizon should avoid catching a general exception like BadRequest and parsing/using its message.\nIf novaclient does not return a detail information, it is better to improve novaclient first. We are in the early stage of the Train development cycle, so it is better to go to the more ideal way.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4c53a595831b1c10451825e7f99b01352152ca79","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"},{"line_number":246,"context_line":"                # exception.InvalidInput,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_729878bf","line":243,"range":{"start_line":243,"start_character":59,"end_line":243,"end_character":65},"updated":"2019-06-07 15:51:31.000000000","message":"cinder??","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7dacc8e1a491ef80a1d3264b8c52cda9743aea94","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                # Use the specific error from the specific message."},{"line_number":241,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":242,"context_line":"            elif isinstance(ex, nova_exception.BadRequest):"},{"line_number":243,"context_line":"                # Nova throws BadRequest for the following cinder Exceptions"},{"line_number":244,"context_line":"                # exception.InvalidVolume,"},{"line_number":245,"context_line":"                # exception.InvalidDevicePath,"},{"line_number":246,"context_line":"                # exception.InvalidInput,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_b3180c1e","line":243,"range":{"start_line":243,"start_character":59,"end_line":243,"end_character":65},"in_reply_to":"9fb8cfa7_729878bf","updated":"2019-06-11 08:29:20.000000000","message":"my bad. removed in updated PS.\nthanks","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dc3803e7969cfcca2335e46b1e6b5f5b5d21c5bc","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        for volume in volume_list:"},{"line_number":204,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":205,"context_line":"            # Or those with multiattach enabled"},{"line_number":206,"context_line":"            if not volume.attachments or getattr(volume, \u0027multiattach\u0027, False):"},{"line_number":207,"context_line":"                volumes.append("},{"line_number":208,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":209,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_a155dafb","line":206,"range":{"start_line":206,"start_character":41,"end_line":206,"end_character":78},"updated":"2019-07-18 05:14:05.000000000","message":"I think nova microversion 2.60 or later needs to be checked too.\nOtherwise, multiattach volumes already attached is listed even when nova does not support multiattach.","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4435750c4a28ef91529460920a93a97eab5c752b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        for volume in volume_list:"},{"line_number":204,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":205,"context_line":"            # Or those with multiattach enabled"},{"line_number":206,"context_line":"            if not volume.attachments or getattr(volume, \u0027multiattach\u0027, False):"},{"line_number":207,"context_line":"                volumes.append("},{"line_number":208,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":209,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_82fbf9be","line":206,"range":{"start_line":206,"start_character":41,"end_line":206,"end_character":78},"in_reply_to":"7faddb67_a155dafb","updated":"2019-07-18 12:25:09.000000000","message":"agreed, will add a condition to check the same in next PS.\nthanks","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"258c43c644425cefbbb8a41eff2c6ba213d9173d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":205,"context_line":"            # Or those with multiattach enabled"},{"line_number":206,"context_line":"            if api._nova.get_microversion \u003e\u003d 2.60:"},{"line_number":207,"context_line":"                if not volume.attachments or getattr("},{"line_number":208,"context_line":"                        volume, \u0027multiattach\u0027, False):"},{"line_number":209,"context_line":"                    volumes.append("},{"line_number":210,"context_line":"                        (volume.id, \u0027%(name)s (%(id)s)\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_288c63d5","line":207,"range":{"start_line":207,"start_character":19,"end_line":207,"end_character":40},"updated":"2019-07-18 15:53:00.000000000","message":"This should not be affected by nova microversion.....\nThe proposed logic looks careless :(","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7215291a40f402b1972e466e4cd34f958bb743d3","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            # Only show volumes that aren\u0027t attached to an instance already"},{"line_number":205,"context_line":"            # Or those with multiattach enabled"},{"line_number":206,"context_line":"            if api._nova.get_microversion \u003e\u003d 2.60:"},{"line_number":207,"context_line":"                if not volume.attachments or getattr("},{"line_number":208,"context_line":"                        volume, \u0027multiattach\u0027, False):"},{"line_number":209,"context_line":"                    volumes.append("},{"line_number":210,"context_line":"                        (volume.id, \u0027%(name)s (%(id)s)\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_5dcdd882","line":207,"range":{"start_line":207,"start_character":19,"end_line":207,"end_character":40},"in_reply_to":"7faddb67_288c63d5","updated":"2019-07-19 05:04:25.000000000","message":"ok will improve it next PS.","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dcbae40026221ab7e2f40e824e7c2093fa9c88e2","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                getattr("},{"line_number":208,"context_line":"                    volume,"},{"line_number":209,"context_line":"                    \u0027multiattach\u0027,"},{"line_number":210,"context_line":"                    False)) and api._nova.get_microversion("},{"line_number":211,"context_line":"                request,"},{"line_number":212,"context_line":"                    \u0027multiattach\u0027):"},{"line_number":213,"context_line":"                volumes.append("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_36eae8d7","line":210,"range":{"start_line":210,"start_character":36,"end_line":210,"end_character":41},"updated":"2019-07-30 09:02:16.000000000","message":"A private module should not be included.","commit_id":"6b731d05fe4de626638adf5f1241655f444313af"},{"author":{"_account_id":27822,"name":"pengyuesheng","email":"pengyuesheng@gohighsec.com","username":"pengyuesheng"},"change_message_id":"2671294e58bc5d67df36fb8b455d2091844c9c6a","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                getattr("},{"line_number":208,"context_line":"                    volume,"},{"line_number":209,"context_line":"                    \u0027multiattach\u0027,"},{"line_number":210,"context_line":"                    False)) and api._nova.get_microversion("},{"line_number":211,"context_line":"                request,"},{"line_number":212,"context_line":"                    \u0027multiattach\u0027):"},{"line_number":213,"context_line":"                volumes.append("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_d614b4a2","line":210,"range":{"start_line":210,"start_character":32,"end_line":210,"end_character":58},"updated":"2019-07-30 09:20:30.000000000","message":"I think you should use api.nova.get_microversion","commit_id":"6b731d05fe4de626638adf5f1241655f444313af"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"e77ac258cd8ffc10363017eaf65d5a4608d2a9fc","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                getattr("},{"line_number":208,"context_line":"                    volume,"},{"line_number":209,"context_line":"                    \u0027multiattach\u0027,"},{"line_number":210,"context_line":"                    False)) and api._nova.get_microversion("},{"line_number":211,"context_line":"                request,"},{"line_number":212,"context_line":"                    \u0027multiattach\u0027):"},{"line_number":213,"context_line":"                volumes.append("}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_36a50848","line":210,"range":{"start_line":210,"start_character":32,"end_line":210,"end_character":58},"in_reply_to":"7faddb67_d614b4a2","updated":"2019-07-30 10:35:05.000000000","message":"Done.\nthanks","commit_id":"6b731d05fe4de626638adf5f1241655f444313af"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dcbae40026221ab7e2f40e824e7c2093fa9c88e2","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                    \u0027multiattach\u0027,"},{"line_number":210,"context_line":"                    False)) and api._nova.get_microversion("},{"line_number":211,"context_line":"                request,"},{"line_number":212,"context_line":"                    \u0027multiattach\u0027):"},{"line_number":213,"context_line":"                volumes.append("},{"line_number":214,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":215,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_76e4e00d","line":212,"updated":"2019-07-30 09:02:16.000000000","message":"Could you consider a better way to wrap lines? The current one looks too adhoc.\n\n  if (not volume.attachments or\n          (getattr(volume, \u0027multiattach\u0027, False) and\n           api._nova.get_microversion(request, \u0027multiattach\u0027):","commit_id":"6b731d05fe4de626638adf5f1241655f444313af"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"e77ac258cd8ffc10363017eaf65d5a4608d2a9fc","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                    \u0027multiattach\u0027,"},{"line_number":210,"context_line":"                    False)) and api._nova.get_microversion("},{"line_number":211,"context_line":"                request,"},{"line_number":212,"context_line":"                    \u0027multiattach\u0027):"},{"line_number":213,"context_line":"                volumes.append("},{"line_number":214,"context_line":"                    (volume.id, \u0027%(name)s (%(id)s)\u0027"},{"line_number":215,"context_line":"                     % {\"name\": volume.name, \"id\": volume.id}))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_5689a4c7","line":212,"in_reply_to":"7faddb67_76e4e00d","updated":"2019-07-30 10:35:05.000000000","message":"Done.\nThanks","commit_id":"6b731d05fe4de626638adf5f1241655f444313af"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"fdf36776188825f24bdbf8d222edd1df13a544b5","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":243,"context_line":"            else:"},{"line_number":244,"context_line":"                # Use a generic error message."},{"line_number":245,"context_line":"                msg \u003d _(\u0027Unable to attach volume: %s\u0027) % ex"},{"line_number":246,"context_line":"            exceptions.handle(request, msg, redirect\u003dredirect)"},{"line_number":247,"context_line":"        return True"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b925550b","line":245,"range":{"start_line":245,"start_character":57,"end_line":245,"end_character":59},"updated":"2019-07-31 10:34:23.000000000","message":"Do we have volume ID in the exception message?","commit_id":"86e1960f99d3163eaead4968cf67fdbf43d8ba76"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"a634ccceb4adda53b9b01a53af39fe645f5fd027","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                msg \u003d six.text_type(ex)"},{"line_number":243,"context_line":"            else:"},{"line_number":244,"context_line":"                # Use a generic error message."},{"line_number":245,"context_line":"                msg \u003d _(\u0027Unable to attach volume: %s\u0027) % ex"},{"line_number":246,"context_line":"            exceptions.handle(request, msg, redirect\u003dredirect)"},{"line_number":247,"context_line":"        return True"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_79a59d46","line":245,"range":{"start_line":245,"start_character":57,"end_line":245,"end_character":59},"in_reply_to":"7faddb67_b925550b","updated":"2019-07-31 10:51:56.000000000","message":"yeah.","commit_id":"86e1960f99d3163eaead4968cf67fdbf43d8ba76"}],"openstack_dashboard/dashboards/project/instances/tests.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4c53a595831b1c10451825e7f99b01352152ca79","unresolved":false,"context_lines":[{"line_number":5651,"context_line":"    @mock.patch.object(api.cinder, \u0027volume_list\u0027)"},{"line_number":5652,"context_line":"    @mock.patch.object(api.cinder, \u0027volume_get\u0027)"},{"line_number":5653,"context_line":"    @mock.patch.object(api.nova, \u0027get_microversion\u0027, return_value\u003d\u00272.60\u0027)"},{"line_number":5654,"context_line":"    @mock.patch.object(api._nova, \u0027novaclient\u0027)"},{"line_number":5655,"context_line":"    def test_multiattach_volume_attach_to_multple_server("},{"line_number":5656,"context_line":"            self, mock_client, mock_get_microversion, mock_volume_get,"},{"line_number":5657,"context_line":"            mock_volume_list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_f260e8a7","line":5654,"updated":"2019-06-07 15:51:31.000000000","message":"We have four mock.patch here. helpers.create_mocks() is the way horizon uses in most cases. Could you update it to use create_mocks?","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7dacc8e1a491ef80a1d3264b8c52cda9743aea94","unresolved":false,"context_lines":[{"line_number":5651,"context_line":"    @mock.patch.object(api.cinder, \u0027volume_list\u0027)"},{"line_number":5652,"context_line":"    @mock.patch.object(api.cinder, \u0027volume_get\u0027)"},{"line_number":5653,"context_line":"    @mock.patch.object(api.nova, \u0027get_microversion\u0027, return_value\u003d\u00272.60\u0027)"},{"line_number":5654,"context_line":"    @mock.patch.object(api._nova, \u0027novaclient\u0027)"},{"line_number":5655,"context_line":"    def test_multiattach_volume_attach_to_multple_server("},{"line_number":5656,"context_line":"            self, mock_client, mock_get_microversion, mock_volume_get,"},{"line_number":5657,"context_line":"            mock_volume_list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_d7680dba","line":5654,"in_reply_to":"9fb8cfa7_f260e8a7","updated":"2019-06-11 08:29:20.000000000","message":"Done.\nthanks","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":27822,"name":"pengyuesheng","email":"pengyuesheng@gohighsec.com","username":"pengyuesheng"},"change_message_id":"8ceca92b12690ed20403bad562ef5d40c70b2760","unresolved":false,"context_lines":[{"line_number":5649,"context_line":"        mock_client.assert_not_called()"},{"line_number":5650,"context_line":""},{"line_number":5651,"context_line":"    @helpers.create_mocks({"},{"line_number":5652,"context_line":"        api.cinder: (\u0027volume_list\u0027,"},{"line_number":5653,"context_line":"                     \u0027volume_get\u0027,),"},{"line_number":5654,"context_line":"        api.nova: (\u0027get_microversion\u0027,),"},{"line_number":5655,"context_line":"        api._nova: (\u0027novaclient\u0027,),"},{"line_number":5656,"context_line":"    })"},{"line_number":5657,"context_line":"    def test_multiattach_volume_attach_to_multple_server(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_65b3c099","line":5654,"range":{"start_line":5652,"start_character":8,"end_line":5654,"end_character":40},"updated":"2019-07-12 06:14:19.000000000","message":"Should test these interfaces are used several times","commit_id":"a903c0a63df3a30d8f7b5a978aa3fb53471a71b8"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"e4d77a35cf9916a616cac04dcf0eeb645b6e903a","unresolved":false,"context_lines":[{"line_number":5649,"context_line":"        mock_client.assert_not_called()"},{"line_number":5650,"context_line":""},{"line_number":5651,"context_line":"    @helpers.create_mocks({"},{"line_number":5652,"context_line":"        api.cinder: (\u0027volume_list\u0027,"},{"line_number":5653,"context_line":"                     \u0027volume_get\u0027,),"},{"line_number":5654,"context_line":"        api.nova: (\u0027get_microversion\u0027,),"},{"line_number":5655,"context_line":"        api._nova: (\u0027novaclient\u0027,),"},{"line_number":5656,"context_line":"    })"},{"line_number":5657,"context_line":"    def test_multiattach_volume_attach_to_multple_server(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_f0645024","line":5654,"range":{"start_line":5652,"start_character":8,"end_line":5654,"end_character":40},"in_reply_to":"7faddb67_65b3c099","updated":"2019-07-12 07:34:54.000000000","message":"Could you please elaborate more?","commit_id":"a903c0a63df3a30d8f7b5a978aa3fb53471a71b8"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"34fb80d074cec9adbca927593852e4e38fb5b6b9","unresolved":false,"context_lines":[{"line_number":5649,"context_line":"        mock_client.assert_not_called()"},{"line_number":5650,"context_line":""},{"line_number":5651,"context_line":"    @helpers.create_mocks({"},{"line_number":5652,"context_line":"        api.cinder: (\u0027volume_list\u0027,"},{"line_number":5653,"context_line":"                     \u0027volume_get\u0027,),"},{"line_number":5654,"context_line":"        api.nova: (\u0027get_microversion\u0027,),"},{"line_number":5655,"context_line":"        api._nova: (\u0027novaclient\u0027,),"},{"line_number":5656,"context_line":"    })"},{"line_number":5657,"context_line":"    def test_multiattach_volume_attach_to_multple_server(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_baed3df1","line":5654,"range":{"start_line":5652,"start_character":8,"end_line":5654,"end_character":40},"in_reply_to":"7faddb67_702620d1","updated":"2019-07-15 09:02:10.000000000","message":"Done.\nthanks","commit_id":"a903c0a63df3a30d8f7b5a978aa3fb53471a71b8"},{"author":{"_account_id":27822,"name":"pengyuesheng","email":"pengyuesheng@gohighsec.com","username":"pengyuesheng"},"change_message_id":"d0e19e5bb67e9b84d2f688a5c6193cd25287d5cb","unresolved":false,"context_lines":[{"line_number":5649,"context_line":"        mock_client.assert_not_called()"},{"line_number":5650,"context_line":""},{"line_number":5651,"context_line":"    @helpers.create_mocks({"},{"line_number":5652,"context_line":"        api.cinder: (\u0027volume_list\u0027,"},{"line_number":5653,"context_line":"                     \u0027volume_get\u0027,),"},{"line_number":5654,"context_line":"        api.nova: (\u0027get_microversion\u0027,),"},{"line_number":5655,"context_line":"        api._nova: (\u0027novaclient\u0027,),"},{"line_number":5656,"context_line":"    })"},{"line_number":5657,"context_line":"    def test_multiattach_volume_attach_to_multple_server(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_702620d1","line":5654,"range":{"start_line":5652,"start_character":8,"end_line":5654,"end_character":40},"in_reply_to":"7faddb67_f0645024","updated":"2019-07-12 07:42:30.000000000","message":"for example:we should add self.mock_volume_list.assert_called_with(),\nI think we should test if these interfaces are being used and use them a few times.","commit_id":"a903c0a63df3a30d8f7b5a978aa3fb53471a71b8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"25c8f66731423ec0020e001b250c23e6bb5dab16","unresolved":false,"context_lines":[{"line_number":5664,"context_line":"        volume.multiattach \u003d True"},{"line_number":5665,"context_line":"        self.mock_volume_list.return_value \u003d volumes"},{"line_number":5666,"context_line":"        self.mock_volume_get.return_value \u003d volume"},{"line_number":5667,"context_line":"        self.mock_get_microversion.return_value \u003d \u00272.60\u0027"},{"line_number":5668,"context_line":""},{"line_number":5669,"context_line":"        form_data \u003d {\"volume\": volume.id,"},{"line_number":5670,"context_line":"                     \"instance_id\": server1.id,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_062084ab","line":5667,"updated":"2019-07-18 05:08:03.000000000","message":"According to get_microversion_for_features() called from get_microversion(), it returns APIVersion object instead of a string.","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4435750c4a28ef91529460920a93a97eab5c752b","unresolved":false,"context_lines":[{"line_number":5664,"context_line":"        volume.multiattach \u003d True"},{"line_number":5665,"context_line":"        self.mock_volume_list.return_value \u003d volumes"},{"line_number":5666,"context_line":"        self.mock_volume_get.return_value \u003d volume"},{"line_number":5667,"context_line":"        self.mock_get_microversion.return_value \u003d \u00272.60\u0027"},{"line_number":5668,"context_line":""},{"line_number":5669,"context_line":"        form_data \u003d {\"volume\": volume.id,"},{"line_number":5670,"context_line":"                     \"instance_id\": server1.id,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_624efd38","line":5667,"in_reply_to":"7faddb67_062084ab","updated":"2019-07-18 12:25:09.000000000","message":"ok, will update it in next PS.\nthanks","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"25c8f66731423ec0020e001b250c23e6bb5dab16","unresolved":false,"context_lines":[{"line_number":5675,"context_line":""},{"line_number":5676,"context_line":"        s1 \u003d self.client.post(url, form_data)"},{"line_number":5677,"context_line":"        self.assertNoFormErrors(s1)"},{"line_number":5678,"context_line":""},{"line_number":5679,"context_line":"        form_data \u003d {\"volume\": volume.id,"},{"line_number":5680,"context_line":"                     \"instance_id\": server2.id,"},{"line_number":5681,"context_line":"                     \"device\": None}"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_a1071a18","line":5678,"updated":"2019-07-18 05:08:03.000000000","message":"Could you check the multi-attach volume is contained in a response of attach_volume GET too?","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4435750c4a28ef91529460920a93a97eab5c752b","unresolved":false,"context_lines":[{"line_number":5675,"context_line":""},{"line_number":5676,"context_line":"        s1 \u003d self.client.post(url, form_data)"},{"line_number":5677,"context_line":"        self.assertNoFormErrors(s1)"},{"line_number":5678,"context_line":""},{"line_number":5679,"context_line":"        form_data \u003d {\"volume\": volume.id,"},{"line_number":5680,"context_line":"                     \"instance_id\": server2.id,"},{"line_number":5681,"context_line":"                     \"device\": None}"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_426c219b","line":5678,"in_reply_to":"7faddb67_a1071a18","updated":"2019-07-18 12:25:09.000000000","message":"ok, will update in next PS.","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"25c8f66731423ec0020e001b250c23e6bb5dab16","unresolved":false,"context_lines":[{"line_number":5686,"context_line":"        s2 \u003d self.client.post(url, form_data)"},{"line_number":5687,"context_line":"        self.assertNoFormErrors(s2)"},{"line_number":5688,"context_line":"        self.mock_novaclient.assert_called_with(mock.ANY, \u00272.60\u0027)"},{"line_number":5689,"context_line":"        self.assertEqual(self.mock_volume_list.call_count, 2)"},{"line_number":5690,"context_line":"        self.assertEqual(self.mock_volume_get.call_count, 2)"},{"line_number":5691,"context_line":"        self.assertEqual(self.mock_get_microversion.call_count, 2)"},{"line_number":5692,"context_line":""},{"line_number":5693,"context_line":"    @helpers.create_mocks({api.nova: (\u0027instance_volumes_list\u0027,)})"},{"line_number":5694,"context_line":"    def test_volume_detach_get(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_6115a23f","line":5691,"range":{"start_line":5689,"start_character":8,"end_line":5691,"end_character":66},"updated":"2019-07-18 05:08:03.000000000","message":"Checking call_count only is not sufficient.\nCould you check arguments of all calls?","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4435750c4a28ef91529460920a93a97eab5c752b","unresolved":false,"context_lines":[{"line_number":5686,"context_line":"        s2 \u003d self.client.post(url, form_data)"},{"line_number":5687,"context_line":"        self.assertNoFormErrors(s2)"},{"line_number":5688,"context_line":"        self.mock_novaclient.assert_called_with(mock.ANY, \u00272.60\u0027)"},{"line_number":5689,"context_line":"        self.assertEqual(self.mock_volume_list.call_count, 2)"},{"line_number":5690,"context_line":"        self.assertEqual(self.mock_volume_get.call_count, 2)"},{"line_number":5691,"context_line":"        self.assertEqual(self.mock_get_microversion.call_count, 2)"},{"line_number":5692,"context_line":""},{"line_number":5693,"context_line":"    @helpers.create_mocks({api.nova: (\u0027instance_volumes_list\u0027,)})"},{"line_number":5694,"context_line":"    def test_volume_detach_get(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_6267ddb8","line":5691,"range":{"start_line":5689,"start_character":8,"end_line":5691,"end_character":66},"in_reply_to":"7faddb67_6115a23f","updated":"2019-07-18 12:25:09.000000000","message":"ok, will update in next PS.","commit_id":"83d527ca45acf2b018f9fcd060047e5b1407f269"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"258c43c644425cefbbb8a41eff2c6ba213d9173d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"import mock"},{"line_number":33,"context_line":"import six"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"from novaclient import api_versions"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"from horizon import exceptions"},{"line_number":38,"context_line":"from horizon import forms"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_a8b93379","line":35,"updated":"2019-07-18 15:53:00.000000000","message":"Why do you place this in a separate import group?","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7215291a40f402b1972e466e4cd34f958bb743d3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"import mock"},{"line_number":33,"context_line":"import six"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"from novaclient import api_versions"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"from horizon import exceptions"},{"line_number":38,"context_line":"from horizon import forms"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_fd0044ad","line":35,"in_reply_to":"7faddb67_a8b93379","updated":"2019-07-19 05:04:25.000000000","message":"ok will move it to existing import group","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"258c43c644425cefbbb8a41eff2c6ba213d9173d","unresolved":false,"context_lines":[{"line_number":5688,"context_line":""},{"line_number":5689,"context_line":"        s2 \u003d self.client.post(url, form_data)"},{"line_number":5690,"context_line":"        self.assertNoFormErrors(s2)"},{"line_number":5691,"context_line":"        self.mock_volume_list.assert_has_calls(["},{"line_number":5692,"context_line":"            mock.call(helpers.IsHttpRequest())])"},{"line_number":5693,"context_line":"        self.assertEqual(self.mock_volume_list.call_count, 2)"},{"line_number":5694,"context_line":"        self.mock_volume_get.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_28a54347","line":5691,"range":{"start_line":5691,"start_character":30,"end_line":5691,"end_character":46},"updated":"2019-07-18 15:53:00.000000000","message":"assert_has_calls checks at least one such call exists. You need to check all calls.","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7215291a40f402b1972e466e4cd34f958bb743d3","unresolved":false,"context_lines":[{"line_number":5688,"context_line":""},{"line_number":5689,"context_line":"        s2 \u003d self.client.post(url, form_data)"},{"line_number":5690,"context_line":"        self.assertNoFormErrors(s2)"},{"line_number":5691,"context_line":"        self.mock_volume_list.assert_has_calls(["},{"line_number":5692,"context_line":"            mock.call(helpers.IsHttpRequest())])"},{"line_number":5693,"context_line":"        self.assertEqual(self.mock_volume_list.call_count, 2)"},{"line_number":5694,"context_line":"        self.mock_volume_get.assert_has_calls(["}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_dda6a8c1","line":5691,"range":{"start_line":5691,"start_character":30,"end_line":5691,"end_character":46},"in_reply_to":"7faddb67_28a54347","updated":"2019-07-19 05:04:25.000000000","message":"ok, will update in next PS.","commit_id":"b5ebf2b6343c0a710b1a0808f4811e9b83f102e7"}],"releasenotes/notes/multi-attached-volume-support-3d32cde6f296cdd9.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c83cc3cddcb1d12ac4d95fef35144839517547b5","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"bfb3d3c7_c0d25b28","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":46},"updated":"2019-05-29 17:59:11.000000000","message":"Well, technically Horizon already supported multiattach volumes, correct?\n\nhttps://review.opendev.org/#/c/547856/\n\nThis change allows a user to attach the volume to more than one instance, which is really what multiattach volumes are good for.\n\nMaybe it would be better to re-word this as something like, \"Horizon now supports attaching a multiattach-capable volume to more than one server.\"","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"214f15e7617dae86d313c91ff284f1ff79653f3c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_a906f41f","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":46},"in_reply_to":"9fb8cfa7_097380e9","updated":"2019-06-02 11:47:37.000000000","message":"As mentioned above, I think the current description is correct.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6185459e6bf52846f5d3cc355259d06187056df4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_097380e9","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":46},"in_reply_to":"bfb3d3c7_c0d25b28","updated":"2019-06-02 07:38:31.000000000","message":"Precisely speaking, horizon does not support multi-attach volume even after mriedem\u0027s patch [0]  because AttachVolume form only shows volumes without attachments [1] (as I mentioned in the patch). This means that multi-attach volume actually does not happen in horizon. We merged [0] only because it will be required when we change the logic of listing available volumes.\n\n[0] https://review.opendev.org/#/c/547856/\n[1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/project/instances/forms.py#L205","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c83cc3cddcb1d12ac4d95fef35144839517547b5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":3,"id":"bfb3d3c7_e0cd1f85","line":7,"range":{"start_line":7,"start_character":13,"end_line":7,"end_character":14},"updated":"2019-05-29 17:59:11.000000000","message":"need a space here","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c83cc3cddcb1d12ac4d95fef35144839517547b5","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    API restrictions:"},{"line_number":12,"context_line":"      Multiattach capable volumes can only be attached"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"bfb3d3c7_809d4367","line":9,"range":{"start_line":8,"start_character":9,"end_line":9,"end_character":12},"updated":"2019-05-29 17:59:11.000000000","message":"Is this how it\u0027s presented when creating the volume type in Horizon? Because the volume type extra spec in cinder is a bit different:\n\nhttps://docs.openstack.org/cinder/latest/admin/blockstorage-volume-multiattach.html#multiattach-volume-type","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6185459e6bf52846f5d3cc355259d06187056df4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances.It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    API restrictions:"},{"line_number":12,"context_line":"      Multiattach capable volumes can only be attached"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_a97fd4a9","line":9,"range":{"start_line":8,"start_character":9,"end_line":9,"end_character":12},"in_reply_to":"bfb3d3c7_809d4367","updated":"2019-06-02 07:38:31.000000000","message":"In my understanding, operators (admin) need to create an appropriate volume type with multiattach support as the cinder document explains. There is no more requirement from the horizon side.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"214f15e7617dae86d313c91ff284f1ff79653f3c","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    API restrictions:"},{"line_number":12,"context_line":"      Multiattach capable volumes can only be attached"},{"line_number":13,"context_line":"      with microversion 2.60 or later."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_44595ffc","line":13,"range":{"start_line":11,"start_character":4,"end_line":13,"end_character":38},"updated":"2019-06-02 11:47:37.000000000","message":"Which API version do you mention?\n\nI also would like to mention that horizon detects it and enable the multi-attach feature automatically (in this relnote). If not in your implementation, this should be supported.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5bd3fedc7b31a6349fc86cd365d24c1a1d68e51d","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    API restrictions:"},{"line_number":12,"context_line":"      Multiattach capable volumes can only be attached"},{"line_number":13,"context_line":"      with microversion 2.60 or later."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_fe0c3c3c","line":13,"range":{"start_line":11,"start_character":4,"end_line":13,"end_character":38},"in_reply_to":"9fb8cfa7_44595ffc","updated":"2019-06-07 10:25:40.000000000","message":"API version is 2.1. Do we really need to mention it here?","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7ba77599481d940e35ceb800b642ac24a7205358","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    API restrictions:"},{"line_number":12,"context_line":"      Multiattach capable volumes can only be attached"},{"line_number":13,"context_line":"      with microversion 2.60 or later."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9fb8cfa7_b22270a3","line":13,"range":{"start_line":11,"start_character":4,"end_line":13,"end_character":38},"in_reply_to":"9fb8cfa7_fe0c3c3c","updated":"2019-06-07 15:43:17.000000000","message":"Vishal, do you mention nova API version or Cinder API version?\nIf nova API, Nova 2.1 API does not support multiattach feature.\nIf cinder, version 2 API is deprecated. I don\u0027t get your point.","commit_id":"c5a208400f8c4da27b030c640f9004e46852dc83"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4c53a595831b1c10451825e7f99b01352152ca79","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances. It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True. Horizon automatically detects and enable"},{"line_number":10,"context_line":"    multi-attach-volume feature."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    API restrictions:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_326440e4","line":9,"range":{"start_line":7,"start_character":15,"end_line":9,"end_character":13},"updated":"2019-06-07 15:51:31.000000000","message":"This description is confusing because multiattach flag in volume creation is an old way to create a multiattach volume. The current recommended way is to use a volume type with multiattach enabled. Could you rephrase the description to match the current recommended way?","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7dacc8e1a491ef80a1d3264b8c52cda9743aea94","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances. It can be used if volume is created"},{"line_number":8,"context_line":"    with volume_type **multiattach** flag set"},{"line_number":9,"context_line":"    to True. Horizon automatically detects and enable"},{"line_number":10,"context_line":"    multi-attach-volume feature."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    API restrictions:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_4fbd7800","line":9,"range":{"start_line":7,"start_character":15,"end_line":9,"end_character":13},"in_reply_to":"9fb8cfa7_326440e4","updated":"2019-06-11 08:29:20.000000000","message":"Done.\nthanks","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4c53a595831b1c10451825e7f99b01352152ca79","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    API restrictions:"},{"line_number":13,"context_line":"      Multiattach capable volumes can only be attached"},{"line_number":14,"context_line":"      with microversion 2.60 or later."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_1251fc0e","line":14,"range":{"start_line":14,"start_character":11,"end_line":14,"end_character":37},"updated":"2019-06-07 15:51:31.000000000","message":"Could you explain which API clearly? Cinder? Nova? API version without a service name is ambiguous.","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"7dacc8e1a491ef80a1d3264b8c52cda9743aea94","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    API restrictions:"},{"line_number":13,"context_line":"      Multiattach capable volumes can only be attached"},{"line_number":14,"context_line":"      with microversion 2.60 or later."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_93e388d9","line":14,"range":{"start_line":14,"start_character":11,"end_line":14,"end_character":37},"in_reply_to":"9fb8cfa7_1251fc0e","updated":"2019-06-11 08:29:20.000000000","message":"nova api microversion.\nAdded in updated PS.\nthanks.","commit_id":"e9fa119e9fbbbba0bc8e391e8246c2934c18c379"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14ba3d950fa2662f251a9dfd38a64c6858fe1264","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances. The ability to attach a volume to"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_85f503f0","line":4,"updated":"2019-08-08 13:21:14.000000000","message":"This link doesn\u0027t seem to work. The blueprint name is multi-attach-volume.","commit_id":"86e1960f99d3163eaead4968cf67fdbf43d8ba76"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"6708f7beb9a2c714529a5bf4a4e563c2c69ebffb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [:blueprint:`multi-Attached-volume-support`]"},{"line_number":5,"context_line":"    Horizon now support Multi-Attached volume."},{"line_number":6,"context_line":"    User is now able to attach a volume to multiple"},{"line_number":7,"context_line":"    instances. The ability to attach a volume to"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_5e3039e9","line":4,"in_reply_to":"7faddb67_85f503f0","updated":"2019-08-08 17:08:10.000000000","message":"yeah, will going to fix this link in a follow-up patch.\nthanks","commit_id":"86e1960f99d3163eaead4968cf67fdbf43d8ba76"}]}
