)]}'
{"cinder/api/openstack/api_version_request.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"815a6148902fbd99ce1e3799fa3e45f7f4f1cc88","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    * 3.18 - Add backup project attribute."},{"line_number":70,"context_line":"    * 3.19 - Add API reset status actions \u0027reset_status\u0027 to group snapshot."},{"line_number":71,"context_line":"    * 3.20 - Add attachment API"},{"line_number":72,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":73,"context_line":"\"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":1,"id":"da4df55a_c5ca1f1a","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":7},"updated":"2016-12-23 17:59:42.000000000","message":"You have some leftovers in this file.","commit_id":"9858e19ebfbe1d5098f2cca4426868b639890a46"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d0f72ef4b5957dc83c13a28fb2d6d674b24f5ff3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    * 3.18 - Add backup project attribute."},{"line_number":70,"context_line":"    * 3.19 - Add API reset status actions \u0027reset_status\u0027 to group snapshot."},{"line_number":71,"context_line":"    * 3.20 - Add attachment API"},{"line_number":72,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":73,"context_line":"\"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":1,"id":"da4df55a_e821b74e","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":7},"in_reply_to":"da4df55a_05098631","updated":"2016-12-23 18:41:46.000000000","message":"Microversions always cause trouble it seems. :) But at least this one is easy to fix.","commit_id":"9858e19ebfbe1d5098f2cca4426868b639890a46"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"c9c68ccb475881a4e7f608462dfb38569368f7fa","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    * 3.18 - Add backup project attribute."},{"line_number":70,"context_line":"    * 3.19 - Add API reset status actions \u0027reset_status\u0027 to group snapshot."},{"line_number":71,"context_line":"    * 3.20 - Add attachment API"},{"line_number":72,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":73,"context_line":"\"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":1,"id":"da4df55a_05098631","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":7},"in_reply_to":"da4df55a_c5ca1f1a","updated":"2016-12-23 18:27:23.000000000","message":":( . thanks!!  Looks  like a few things after the rebase that I need to clean up","commit_id":"9858e19ebfbe1d5098f2cca4426868b639890a46"}],"cinder/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"31dea901c2bd48138633534c496bb388f91a945d","unresolved":false,"context_lines":[{"line_number":227,"context_line":"----"},{"line_number":228,"context_line":"  Added support to filter snapshot list based on metadata of snapshot."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"3.23"},{"line_number":231,"context_line":"----"},{"line_number":232,"context_line":"  Added new attachment API\u0027s"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a3c09a3_12899ec9","line":230,"updated":"2017-01-17 05:42:34.000000000","message":"Should be 3.24 to be consistent with https://review.openstack.org/#/c/414632/11/cinder/api/openstack/api_version_request.py.  \"3.23\" is missing from other commits.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":227,"context_line":"----"},{"line_number":228,"context_line":"  Added support to filter snapshot list based on metadata of snapshot."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"3.23"},{"line_number":231,"context_line":"----"},{"line_number":232,"context_line":"  Added new attachment API\u0027s"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a3c09a3_c59ca0c2","line":230,"in_reply_to":"7a3c09a3_12899ec9","updated":"2017-01-17 12:46:47.000000000","message":"Yup, +1.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":227,"context_line":"----"},{"line_number":228,"context_line":"  Added support to filter snapshot list based on metadata of snapshot."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"3.23"},{"line_number":231,"context_line":"----"},{"line_number":232,"context_line":"  Added new attachment API\u0027s"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7a3c09a3_f533a760","line":230,"in_reply_to":"7a3c09a3_c59ca0c2","updated":"2017-01-18 20:31:05.000000000","message":"today it\u0027s 3.25, moving target :)","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"}],"cinder/api/v3/attachments.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        reserved and prevent any new attachment_create calls from being made"},{"line_number":104,"context_line":"        until the attachment is updated (completed)."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        The alternative is that the connection can be reserved an initialized"},{"line_number":107,"context_line":"        all at once with a single call if the caller has all of the required"},{"line_number":108,"context_line":"        information (connector data) at the time of the call."},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_d3251b5c","line":106,"range":{"start_line":106,"start_character":63,"end_line":106,"end_character":65},"updated":"2017-01-06 18:19:00.000000000","message":"s/an/and/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        reserved and prevent any new attachment_create calls from being made"},{"line_number":104,"context_line":"        until the attachment is updated (completed)."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        The alternative is that the connection can be reserved an initialized"},{"line_number":107,"context_line":"        all at once with a single call if the caller has all of the required"},{"line_number":108,"context_line":"        information (connector data) at the time of the call."},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_651e5771","line":106,"range":{"start_line":106,"start_character":63,"end_line":106,"end_character":65},"in_reply_to":"ba5201f7_d3251b5c","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        information (connector data) at the time of the call."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        NOTE: In Nova terms server \u003d\u003d instance, the server_id parameter"},{"line_number":111,"context_line":"        referenced below is the id of the Instance, for non-nova consumers this"},{"line_number":112,"context_line":"        can be a server uuid or some other arbitrary unique identifier."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_93d63326","line":111,"range":{"start_line":111,"start_character":32,"end_line":111,"end_character":34},"updated":"2017-01-06 18:19:00.000000000","message":"I think we can refer to uuid here too.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        information (connector data) at the time of the call."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        NOTE: In Nova terms server \u003d\u003d instance, the server_id parameter"},{"line_number":111,"context_line":"        referenced below is the id of the Instance, for non-nova consumers this"},{"line_number":112,"context_line":"        can be a server uuid or some other arbitrary unique identifier."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_85117b5f","line":111,"range":{"start_line":111,"start_character":32,"end_line":111,"end_character":34},"in_reply_to":"ba5201f7_93d63326","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                \"attachment\":"},{"line_number":120,"context_line":"                {"},{"line_number":121,"context_line":"                    \"volume_uuid\": \"volume-uuid\","},{"line_number":122,"context_line":"                    \"server_id\": \"nova-server-uuid\","},{"line_number":123,"context_line":"                    \"connector\": None|\u003cconnector-object\u003e,"},{"line_number":124,"context_line":"                }"},{"line_number":125,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_93bd53da","line":122,"range":{"start_line":122,"start_character":21,"end_line":122,"end_character":30},"updated":"2017-01-06 18:19:00.000000000","message":"s/server_id/instance_uuid/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                \"attachment\":"},{"line_number":120,"context_line":"                {"},{"line_number":121,"context_line":"                    \"volume_uuid\": \"volume-uuid\","},{"line_number":122,"context_line":"                    \"server_id\": \"nova-server-uuid\","},{"line_number":123,"context_line":"                    \"connector\": None|\u003cconnector-object\u003e,"},{"line_number":124,"context_line":"                }"},{"line_number":125,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_e50a4725","line":122,"range":{"start_line":122,"start_character":21,"end_line":122,"end_character":30},"in_reply_to":"ba5201f7_93bd53da","updated":"2017-01-07 15:36:35.000000000","message":"Done just changing these all back to instance_uuid","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"11543a839f5983f70a9fa66098cec0f03ecca29a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                \"attachment\":"},{"line_number":120,"context_line":"                {"},{"line_number":121,"context_line":"                    \"volume_uuid\": \"volume-uuid\","},{"line_number":122,"context_line":"                    \"server_id\": \"nova-server-uuid\","},{"line_number":123,"context_line":"                    \"connector\": None|\u003cconnector-object\u003e,"},{"line_number":124,"context_line":"                }"},{"line_number":125,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_afac8e8c","line":122,"range":{"start_line":122,"start_character":21,"end_line":122,"end_character":30},"in_reply_to":"ba5201f7_e50a4725","updated":"2017-01-07 20:25:33.000000000","message":"+1 :)","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"platform\": \"x86_64\","},{"line_number":137,"context_line":"                    \"host\": \"tempest-1\","},{"line_number":138,"context_line":"                    \"os_type\": \"linux2\","},{"line_number":139,"context_line":"                    \"multipath\": False,"},{"line_number":140,"context_line":"                }"},{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_d3819bfc","line":139,"range":{"start_line":139,"start_character":38,"end_line":139,"end_character":39},"updated":"2017-01-06 18:19:00.000000000","message":"If \u0027mode\u0027 and \u0027mountpoint\u0027 are handled as part of the connector data maybe that would worth adding those here too like below in update.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    \"platform\": \"x86_64\","},{"line_number":137,"context_line":"                    \"host\": \"tempest-1\","},{"line_number":138,"context_line":"                    \"os_type\": \"linux2\","},{"line_number":139,"context_line":"                    \"multipath\": False,"},{"line_number":140,"context_line":"                }"},{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_202fdd88","line":139,"range":{"start_line":139,"start_character":38,"end_line":139,"end_character":39},"in_reply_to":"ba5201f7_d3819bfc","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                }"},{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        NOTE that all that\u0027s required for a reserve is volume_uuid and"},{"line_number":144,"context_line":"        server_id (note Nova Instance \u003d\u003d Server)."},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_73446fb6","line":143,"range":{"start_line":143,"start_character":29,"end_line":143,"end_character":37},"updated":"2017-01-06 18:19:00.000000000","message":"The code currently requires only volume_uuid. The code part seems ok to me if there is no check later that would require the server id so only the text needs adjustments.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                }"},{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        NOTE that all that\u0027s required for a reserve is volume_uuid and"},{"line_number":144,"context_line":"        server_id (note Nova Instance \u003d\u003d Server)."},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_fbfbc644","line":143,"range":{"start_line":143,"start_character":29,"end_line":143,"end_character":37},"in_reply_to":"ba5201f7_73446fb6","updated":"2017-01-07 15:36:35.000000000","message":"The more I think about this I think it should probably be required, and then perhaps in the future allow the ability to update the value using attachment_update.  Providing too many options in the API generally doesn\u0027t end well :)","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"11543a839f5983f70a9fa66098cec0f03ecca29a","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                }"},{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        NOTE that all that\u0027s required for a reserve is volume_uuid and"},{"line_number":144,"context_line":"        server_id (note Nova Instance \u003d\u003d Server)."},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_2fafbe7d","line":143,"range":{"start_line":143,"start_character":29,"end_line":143,"end_character":37},"in_reply_to":"ba5201f7_fbfbc644","updated":"2017-01-07 20:25:33.000000000","message":"Having too many options confuses users and I think it will make it easier on the Nova side too to keep things consistent too. :)","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        NOTE that all that\u0027s required for a reserve is volume_uuid and"},{"line_number":144,"context_line":"        server_id (note Nova Instance \u003d\u003d Server)."},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":147,"context_line":"        server_uuid \u003d body[\u0027attachment\u0027].get(\u0027instance_uuid\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_13a7a3aa","line":144,"range":{"start_line":144,"start_character":8,"end_line":144,"end_character":17},"updated":"2017-01-06 18:19:00.000000000","message":"If it stays here at the end, as it\u0027s used in the body I think for consistency it would be better to use instance_uuid here too.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        NOTE that all that\u0027s required for a reserve is volume_uuid and"},{"line_number":144,"context_line":"        server_id (note Nova Instance \u003d\u003d Server)."},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":147,"context_line":"        server_uuid \u003d body[\u0027attachment\u0027].get(\u0027instance_uuid\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_3b98ee1b","line":144,"range":{"start_line":144,"start_character":8,"end_line":144,"end_character":17},"in_reply_to":"ba5201f7_13a7a3aa","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"076dcae920fdb23a539007a5434ce18f9558ac79","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                                                  volume_ref,"},{"line_number":158,"context_line":"                                                  connector))"},{"line_number":159,"context_line":"        except Exception:"},{"line_number":160,"context_line":"            msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":161,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":162,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":163,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_004bb959","line":160,"updated":"2017-01-06 21:57:36.000000000","message":"This is my first cinder comment, so please take all this with a large grain of salt...\n\nThis exception message will require the user to go to the log to determine what happened. Would it be better to append the exception message string to this message? In particular, I think this msg from api.py would be buried- \"Volume status must be...\"\n\nIf this makes sense, the same would also apply to update().","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def update(self, req, id, body):"},{"line_number":167,"context_line":"        \"\"\"Update an attachment record."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        Currently used to finalize a previously created/reserved"},{"line_number":170,"context_line":"        attachment_create that didn\u0027t have a connector avaialable."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_d3d0bbcb","line":169,"range":{"start_line":169,"start_character":37,"end_line":169,"end_character":64},"updated":"2017-01-06 18:19:00.000000000","message":"... finalize a pervious attachment_create ...","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def update(self, req, id, body):"},{"line_number":167,"context_line":"        \"\"\"Update an attachment record."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        Currently used to finalize a previously created/reserved"},{"line_number":170,"context_line":"        attachment_create that didn\u0027t have a connector avaialable."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Expected format of the input parameter \u0027body\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_d6aed72c","line":169,"range":{"start_line":169,"start_character":37,"end_line":169,"end_character":64},"in_reply_to":"ba5201f7_d3d0bbcb","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"076dcae920fdb23a539007a5434ce18f9558ac79","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        \"\"\"Update an attachment record."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        Currently used to finalize a previously created/reserved"},{"line_number":170,"context_line":"        attachment_create that didn\u0027t have a connector avaialable."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Expected format of the input parameter \u0027body\u0027:"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_40ece129","line":170,"updated":"2017-01-06 21:57:36.000000000","message":"sp- available","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                                  attachment_ref,"},{"line_number":206,"context_line":"                                                  connector))"},{"line_number":207,"context_line":"        except Exception:"},{"line_number":208,"context_line":"            # Set to error status?"},{"line_number":209,"context_line":"            msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":210,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_b3509733","line":208,"range":{"start_line":208,"start_character":14,"end_line":208,"end_character":34},"updated":"2017-01-06 18:19:00.000000000","message":"Can anything happen here that will prevent the volume to get attached in a next try? If yes and it\u0027s also likely to happen error status seems reasonable.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                                  attachment_ref,"},{"line_number":206,"context_line":"                                                  connector))"},{"line_number":207,"context_line":"        except Exception:"},{"line_number":208,"context_line":"            # Set to error status?"},{"line_number":209,"context_line":"            msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":210,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_167cdfb3","line":208,"range":{"start_line":208,"start_character":14,"end_line":208,"end_character":34},"in_reply_to":"ba5201f7_b3509733","updated":"2017-01-07 15:36:35.000000000","message":"yeah, most likely; I think I\u0027ll set the attachment status to an error here but will probably leave it for future work.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @wsgi.Controller.api_version(\u00273.23\u0027)"},{"line_number":213,"context_line":"    def delete(self, req, id):"},{"line_number":214,"context_line":"        \"\"\"Delete an attachment ."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        Disconnects/Deletes the specified attachment, returns a list of any"},{"line_number":217,"context_line":"        known shared attachment-id\u0027s for the effected backend device."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_1362430a","line":214,"range":{"start_line":214,"start_character":31,"end_line":214,"end_character":32},"updated":"2017-01-06 18:19:00.000000000","message":"Remove whitespace.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @wsgi.Controller.api_version(\u00273.23\u0027)"},{"line_number":213,"context_line":"    def delete(self, req, id):"},{"line_number":214,"context_line":"        \"\"\"Delete an attachment ."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        Disconnects/Deletes the specified attachment, returns a list of any"},{"line_number":217,"context_line":"        known shared attachment-id\u0027s for the effected backend device."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_1653ff39","line":214,"range":{"start_line":214,"start_character":31,"end_line":214,"end_character":32},"in_reply_to":"ba5201f7_1362430a","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"055eac62bdff30d52059797cb2b0755a66b9955a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"\"\"\"The volumes attachments api.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":"# from oslo_utils import encodeutils"},{"line_number":17,"context_line":"# from oslo_utils import strutils"},{"line_number":18,"context_line":"import webob"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_535b992e","line":16,"updated":"2017-01-09 20:13:49.000000000","message":"Just a note to cleanup before we\u0027re done.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        NOTE all that\u0027s required for a reserve is volume_uuid"},{"line_number":146,"context_line":"        and a instance_uuid."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":149,"context_line":"        try:"},{"line_number":150,"context_line":"            instance_uuid \u003d body[\u0027attachment\u0027][\u0027instance_uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_cb543f23","line":147,"updated":"2017-01-09 18:31:09.000000000","message":"It would be helpful to doc what is being returned by this method as the return value is being generated in a different method.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                                  connector))"},{"line_number":167,"context_line":"        except Exception:"},{"line_number":168,"context_line":"            msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":171,"context_line":"        return retval"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_461f6b09","line":169,"updated":"2017-01-09 18:31:09.000000000","message":"Not sure you saw my previous comment here.\n\nThis exception message will require the user to go to the log to determine what happened. Would it be better to append the incoming exception message string to this message? In particular, I think this msg from api.py would be buried- \"Volume status must be...\"\n\nIf this makes sense, the same would also apply to update().","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        if not new_instance_uuid and not attachment_ref.instance_uuid:"},{"line_number":205,"context_line":"            # Attachment doesn\u0027t include an instance_uuid and none was"},{"line_number":206,"context_line":"            # provided to the update, please provide an instance_uuid"},{"line_number":207,"context_line":"            raise"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        try:"},{"line_number":210,"context_line":"            connector \u003d body[\u0027attachment\u0027][\u0027connector\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_86e6b342","line":207,"updated":"2017-01-09 18:31:09.000000000","message":"There\u0027s no message or specific exception type on this exception.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                                  attachment_ref,"},{"line_number":219,"context_line":"                                                  connector))"},{"line_number":220,"context_line":"        except Exception:"},{"line_number":221,"context_line":"            msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":222,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    @wsgi.Controller.api_version(\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_5612b259","line":221,"updated":"2017-01-09 18:31:09.000000000","message":"same comment as above about losing the underlying exception message.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\""},{"line_number":147,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            instance_uuid \u003d body[\u0027attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":150,"context_line":"        except KeyError:"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":152,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027 \""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_540a3c8b","line":149,"range":{"start_line":149,"start_character":12,"end_line":149,"end_character":25},"updated":"2017-01-11 16:00:58.000000000","message":"An additional check is needed here to ensure the passed value is not None. This only checks whether \u0027instance_uuid\u0027 is in the body or not.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\""},{"line_number":147,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            instance_uuid \u003d body[\u0027attachment\u0027][\u0027instance_uuid\u0027]"},{"line_number":150,"context_line":"        except KeyError:"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":152,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027 \""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_95881473","line":149,"range":{"start_line":149,"start_character":12,"end_line":149,"end_character":25},"in_reply_to":"ba5201f7_540a3c8b","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                                  volume_ref,"},{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_f473304c","line":167,"range":{"start_line":167,"start_character":72,"end_line":167,"end_character":76},"updated":"2017-01-11 16:00:58.000000000","message":"This throws AttributeError, you need to drop \u0027.msg\u0027.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                                  volume_ref,"},{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_d57e1c69","line":167,"range":{"start_line":167,"start_character":72,"end_line":167,"end_character":76},"in_reply_to":"ba5201f7_7d3800ef","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f955b6d6c275c6f7673d3bcfbc763deed3dca83","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                                  volume_ref,"},{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_7d3800ef","line":167,"range":{"start_line":167,"start_character":72,"end_line":167,"end_character":76},"in_reply_to":"ba5201f7_f473304c","updated":"2017-01-11 17:17:40.000000000","message":"yeah :( . Only works for CinderExceptions, I have a fix for that coming up","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_148ef4cf","line":168,"range":{"start_line":168,"start_character":28,"end_line":168,"end_character":68},"updated":"2017-01-11 16:00:58.000000000","message":"I get this error when I call attachment-create from the CLI:\n\n dictionary update sequence element #0 has length 1; 2 is required\n\nI only get it if I specify an \u0027instance_uuid\u0027, if I leave it empty the request succeeds.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f955b6d6c275c6f7673d3bcfbc763deed3dca83","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_3d191889","line":168,"range":{"start_line":168,"start_character":28,"end_line":168,"end_character":68},"in_reply_to":"ba5201f7_148ef4cf","updated":"2017-01-11 17:17:40.000000000","message":"yeah, me too.. moving this to use the object has honked something up.. digging in to it but may need some help.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                                  connector))"},{"line_number":166,"context_line":"        except Exception as ex:"},{"line_number":167,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":168,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":169,"context_line":"        retval \u003d self._view_builder.summary(attachment_ref)"},{"line_number":170,"context_line":"        return retval"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_b5f0b8fe","line":168,"range":{"start_line":168,"start_character":28,"end_line":168,"end_character":68},"in_reply_to":"ba5201f7_3d191889","updated":"2017-01-11 19:42:31.000000000","message":"Turns out this was a side effect of the check_wrap call, I was passing in the instance_uuid as the 3\u0027rd arg, but the wrapped call expects the 3\u0027rd call to be the volume object.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                                                  attachment_ref,"},{"line_number":212,"context_line":"                                                  connector))"},{"line_number":213,"context_line":"        except Exception as ex:"},{"line_number":214,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":215,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @wsgi.Controller.api_version(\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_949bc465","line":214,"range":{"start_line":214,"start_character":72,"end_line":214,"end_character":76},"updated":"2017-01-11 16:00:58.000000000","message":"Same as above.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                                                  attachment_ref,"},{"line_number":212,"context_line":"                                                  connector))"},{"line_number":213,"context_line":"        except Exception as ex:"},{"line_number":214,"context_line":"            msg \u003d _(\"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":215,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @wsgi.Controller.api_version(\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_15dc2472","line":214,"range":{"start_line":214,"start_character":72,"end_line":214,"end_character":76},"in_reply_to":"ba5201f7_949bc465","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"b771a2bc6c600f9bf63fbced6b45ce058d4d4ee6","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        returns: A summary view of the attachment object"},{"line_number":146,"context_line":"        \"\"\""},{"line_number":147,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":148,"context_line":"        instance_uuid \u003d body[\u0027attachemnt\u0027].get(\u0027instance_uuid\u0027, None)"},{"line_number":149,"context_line":"        if not instance_uuid:"},{"line_number":150,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":151,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027 \""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba5201f7_867f0cdf","line":148,"range":{"start_line":148,"start_character":30,"end_line":148,"end_character":40},"updated":"2017-01-11 20:26:43.000000000","message":"s/attachemnt/attachment/","commit_id":"bef9211377f64a85238cf1c98ad4fb385bd48357"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"3b1dfa76aeb7a5a56807d480cda0cbc832fb73ab","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        returns: A summary view of the attachment object"},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":149,"context_line":"        instance_uuid \u003d body[\u0027attachemnt\u0027].get(\u0027instance_uuid\u0027, None)"},{"line_number":150,"context_line":"        if not instance_uuid:"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":152,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027 \""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a57fde8_191774a4","line":149,"range":{"start_line":149,"start_character":30,"end_line":149,"end_character":40},"updated":"2017-01-12 17:32:19.000000000","message":"s/attachemnt/attachment/","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        returns: A summary view of the attachment object"},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":149,"context_line":"        instance_uuid \u003d body[\u0027attachemnt\u0027].get(\u0027instance_uuid\u0027, None)"},{"line_number":150,"context_line":"        if not instance_uuid:"},{"line_number":151,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":152,"context_line":"                explanation\u003d_(\"Must specify \u0027instance_uuid\u0027 \""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_95c42360","line":149,"range":{"start_line":149,"start_character":30,"end_line":149,"end_character":40},"in_reply_to":"9a57fde8_191774a4","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"31dea901c2bd48138633534c496bb388f91a945d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                                  instance_uuid,"},{"line_number":165,"context_line":"                                                  connector\u003dconnector))"},{"line_number":166,"context_line":"        except exception.CinderException as ex:"},{"line_number":167,"context_line":"            LOG.exception(ex)"},{"line_number":168,"context_line":"            err_msg \u003d _("},{"line_number":169,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":170,"context_line":"        except Exception as ex:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_5202460c","line":167,"range":{"start_line":167,"start_character":12,"end_line":167,"end_character":29},"updated":"2017-01-17 05:42:34.000000000","message":"Please either wrap ex with six.text_type(), or move this log after line 169 and log the err_msg which already has _(): LOG.exception(err_msg).","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                                                  instance_uuid,"},{"line_number":165,"context_line":"                                                  connector\u003dconnector))"},{"line_number":166,"context_line":"        except exception.CinderException as ex:"},{"line_number":167,"context_line":"            LOG.exception(ex)"},{"line_number":168,"context_line":"            err_msg \u003d _("},{"line_number":169,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":170,"context_line":"        except Exception as ex:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b58d9f2c","line":167,"range":{"start_line":167,"start_character":12,"end_line":167,"end_character":29},"in_reply_to":"7a3c09a3_5202460c","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"90af0ae306147ca7f872005d78715d85f2a5c4db","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            err_msg \u003d _("},{"line_number":169,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":170,"context_line":"        except Exception as ex:"},{"line_number":171,"context_line":"            LOG.exception(ex)"},{"line_number":172,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":173,"context_line":"        finally:"},{"line_number":174,"context_line":"            if err_msg:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_2e015c3a","line":171,"range":{"start_line":171,"start_character":16,"end_line":171,"end_character":25},"updated":"2017-01-18 21:06:25.000000000","message":"Actually, this is incorrect. You shouldn\u0027t pass an exception to LOG.exception. That just duplicates the exception output. Should be either LOG.exception(some_message) or LOG.error(\"message %s\", ex)","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"31dea901c2bd48138633534c496bb388f91a945d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":170,"context_line":"        except Exception as ex:"},{"line_number":171,"context_line":"            LOG.exception(ex)"},{"line_number":172,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":173,"context_line":"        finally:"},{"line_number":174,"context_line":"            if err_msg:"},{"line_number":175,"context_line":"                raise webob.exc.HTTPInternalServerError(explanation\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_d55aa029","line":172,"updated":"2017-01-17 05:42:34.000000000","message":"Same comment as above.  Suggest remove line 171 and add LOG.exception(err_msg) after 172.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":170,"context_line":"        except Exception as ex:"},{"line_number":171,"context_line":"            LOG.exception(ex)"},{"line_number":172,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":173,"context_line":"        finally:"},{"line_number":174,"context_line":"            if err_msg:"},{"line_number":175,"context_line":"                raise webob.exc.HTTPInternalServerError(explanation\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_f5972738","line":172,"in_reply_to":"7a3c09a3_d55aa029","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"77eb071ad4cbbf4c8ea2570cbe704f7f124376f9","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                              \"to update attachment.\"))"},{"line_number":215,"context_line":"        err_msg \u003d None"},{"line_number":216,"context_line":"        try:"},{"line_number":217,"context_line":"            attachment_ref \u003d ("},{"line_number":218,"context_line":"                self.volume_api.attachment_update(context,"},{"line_number":219,"context_line":"                                                  attachment_ref,"},{"line_number":220,"context_line":"                                                  connector))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_3ae88f10","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":26},"updated":"2017-01-13 20:19:43.000000000","message":"Nova needs this data and it\u0027s currently not returned.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                              \"to update attachment.\"))"},{"line_number":215,"context_line":"        err_msg \u003d None"},{"line_number":216,"context_line":"        try:"},{"line_number":217,"context_line":"            attachment_ref \u003d ("},{"line_number":218,"context_line":"                self.volume_api.attachment_update(context,"},{"line_number":219,"context_line":"                                                  attachment_ref,"},{"line_number":220,"context_line":"                                                  connector))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_d5e06bcf","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":26},"in_reply_to":"7a3c09a3_3ae88f10","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"31dea901c2bd48138633534c496bb388f91a945d","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        except exception.CinderException as ex:"},{"line_number":223,"context_line":"            LOG.exception(ex)"},{"line_number":224,"context_line":"            err_msg \u003d _("},{"line_number":225,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":226,"context_line":"        except Exception as ex:"},{"line_number":227,"context_line":"            LOG.exception(ex)"},{"line_number":228,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_957bb88b","line":225,"updated":"2017-01-17 05:42:34.000000000","message":"Same as above.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        except exception.CinderException as ex:"},{"line_number":223,"context_line":"            LOG.exception(ex)"},{"line_number":224,"context_line":"            err_msg \u003d _("},{"line_number":225,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":226,"context_line":"        except Exception as ex:"},{"line_number":227,"context_line":"            LOG.exception(ex)"},{"line_number":228,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b502ff70","line":225,"in_reply_to":"7a3c09a3_957bb88b","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"31dea901c2bd48138633534c496bb388f91a945d","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":226,"context_line":"        except Exception as ex:"},{"line_number":227,"context_line":"            LOG.exception(ex)"},{"line_number":228,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":229,"context_line":"        finally:"},{"line_number":230,"context_line":"            if err_msg:"},{"line_number":231,"context_line":"                raise webob.exc.HTTPInternalServerError(explanation\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_d571c0a9","line":228,"updated":"2017-01-17 05:42:34.000000000","message":"Same as above","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":226,"context_line":"        except Exception as ex:"},{"line_number":227,"context_line":"            LOG.exception(ex)"},{"line_number":228,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"},{"line_number":229,"context_line":"        finally:"},{"line_number":230,"context_line":"            if err_msg:"},{"line_number":231,"context_line":"                raise webob.exc.HTTPInternalServerError(explanation\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_d5078b7f","line":228,"in_reply_to":"7a3c09a3_d571c0a9","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a46f016191667f73aff2f95945cef7957366b49f","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                                  connector))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        except exception.CinderException as ex:"},{"line_number":221,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":222,"context_line":"            LOG.exception(err_msg)"},{"line_number":223,"context_line":"        except Exception as ex:"},{"line_number":224,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a3c09a3_7a579e26","line":221,"range":{"start_line":221,"start_character":17,"end_line":221,"end_character":72},"updated":"2017-01-18 22:26:02.000000000","message":"That\u0027s gonna hurt","commit_id":"b706ed347e3b8b9623d0152be05aa51241f0c99f"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"21aa898b05a1e7520471e82ee8d71749f315102a","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                                                  connector))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        except exception.CinderException as ex:"},{"line_number":221,"context_line":"                \"Unable to create attachment for volume (%s).\") % ex.msg"},{"line_number":222,"context_line":"            LOG.exception(err_msg)"},{"line_number":223,"context_line":"        except Exception as ex:"},{"line_number":224,"context_line":"            err_msg \u003d _(\"Unable to create attachment for volume.\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a3c09a3_dc996fd2","line":221,"range":{"start_line":221,"start_character":17,"end_line":221,"end_character":72},"in_reply_to":"7a3c09a3_7a579e26","updated":"2017-01-18 22:29:33.000000000","message":"Oops. ;)","commit_id":"b706ed347e3b8b9623d0152be05aa51241f0c99f"}],"cinder/api/v3/views/attachments.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            \u0027id\u0027: attachment.id,"},{"line_number":46,"context_line":"            \u0027status\u0027: attachment.attach_status,"},{"line_number":47,"context_line":"            \u0027instance\u0027: attachment.instance_uuid,"},{"line_number":48,"context_line":"            \u0027volume_id\u0027: attachment.volume_id, }"},{"line_number":49,"context_line":"        if flat:"},{"line_number":50,"context_line":"            return result"},{"line_number":51,"context_line":"        return {\u0027attachment\u0027: result}"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_8e9e0cb7","line":48,"range":{"start_line":48,"start_character":46,"end_line":48,"end_character":47},"updated":"2017-01-06 18:19:00.000000000","message":"Remove whitespace.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0b96c90b137ae2e145ab9e230c323857533e6a29","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            \u0027id\u0027: attachment.id,"},{"line_number":46,"context_line":"            \u0027status\u0027: attachment.attach_status,"},{"line_number":47,"context_line":"            \u0027instance\u0027: attachment.instance_uuid,"},{"line_number":48,"context_line":"            \u0027volume_id\u0027: attachment.volume_id, }"},{"line_number":49,"context_line":"        if flat:"},{"line_number":50,"context_line":"            return result"},{"line_number":51,"context_line":"        return {\u0027attachment\u0027: result}"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_a652ac11","line":48,"range":{"start_line":48,"start_character":45,"end_line":48,"end_character":47},"updated":"2017-01-13 18:32:51.000000000","message":"In \u0027attachment_create\u0027 you add \u0027connection_info\u0027 to the attachment here: https://review.openstack.org/#/c/414632/11/cinder/volume/api.py in line 1876 but you don\u0027t return it as you use this \u0027summary\u0027 for the response.\n\nWhen having the \u0027connector\u0027 and doing the \u0027update\u0027 I\u0027m not 100% sure about the data structure at the moment, but I\u0027m guessing it\u0027s different than the \u0027reserve\u0027 case.\n\nEither way the \u0027connection_info\u0027 would be good to have in the response.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"919276e4e2fdb095f871f96ac800393b0487ee26","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            \u0027id\u0027: attachment.id,"},{"line_number":46,"context_line":"            \u0027status\u0027: attachment.attach_status,"},{"line_number":47,"context_line":"            \u0027instance\u0027: attachment.instance_uuid,"},{"line_number":48,"context_line":"            \u0027volume_id\u0027: attachment.volume_id, }"},{"line_number":49,"context_line":"        if flat:"},{"line_number":50,"context_line":"            return result"},{"line_number":51,"context_line":"        return {\u0027attachment\u0027: result}"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_41b71986","line":48,"range":{"start_line":48,"start_character":45,"end_line":48,"end_character":47},"in_reply_to":"7a3c09a3_a652ac11","updated":"2017-01-15 10:46:52.000000000","message":"Although you need to make it optional here as otherwise it breaks attachment-list/attachment-show, at least with the current version of the code.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"5ade1c9121350cc55b631a42b8393dd0b6eb3f2d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            attached_at\u003dcls._normalize(attachment.attach_time),"},{"line_number":33,"context_line":"            detached_at\u003dcls._normalize(attachment.detach_time),"},{"line_number":34,"context_line":"            attach_mode\u003dattachment.attach_mode,"},{"line_number":35,"context_line":"            connection_info\u003dattachment.get(\u0027connection_info\u0027, None),)"},{"line_number":36,"context_line":"        if flat:"},{"line_number":37,"context_line":"            return result"},{"line_number":38,"context_line":"        return {\u0027attachment\u0027: result}"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a3905b3_09f3a674","line":35,"range":{"start_line":35,"start_character":12,"end_line":35,"end_character":67},"updated":"2017-01-19 14:15:58.000000000","message":"You need to use getattr() here like:\n\n connection_info\u003dgetattr(attachment, \u0027connection_info\u0027, None)\n\nget() always returns None","commit_id":"e4cd7a38e801a087bfa878e8a2e878b4dc0338b7"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"c57772a6ddb02ae5fb13fddcc58861a7dd416d50","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            attached_at\u003dcls._normalize(attachment.attach_time),"},{"line_number":33,"context_line":"            detached_at\u003dcls._normalize(attachment.detach_time),"},{"line_number":34,"context_line":"            attach_mode\u003dattachment.attach_mode,"},{"line_number":35,"context_line":"            connection_info\u003dattachment.get(\u0027connection_info\u0027, None),)"},{"line_number":36,"context_line":"        if flat:"},{"line_number":37,"context_line":"            return result"},{"line_number":38,"context_line":"        return {\u0027attachment\u0027: result}"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a3905b3_5a82c801","line":35,"range":{"start_line":35,"start_character":12,"end_line":35,"end_character":67},"in_reply_to":"5a3905b3_09f3a674","updated":"2017-01-19 16:08:11.000000000","message":"Perfect, thanks!","commit_id":"e4cd7a38e801a087bfa878e8a2e878b4dc0338b7"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1903,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1904,"context_line":"        all()"},{"line_number":1905,"context_line":""},{"line_number":1906,"context_line":"    result \u003d {}"},{"line_number":1907,"context_line":"    for row in rows:"},{"line_number":1908,"context_line":"        result[row[\u0027key\u0027]] \u003d row[\u0027value\u0027]"},{"line_number":1909,"context_line":""},{"line_number":1910,"context_line":"    return result"},{"line_number":1911,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_2bf615f9","line":1908,"range":{"start_line":1906,"start_character":0,"end_line":1908,"end_character":41},"updated":"2017-01-17 12:46:47.000000000","message":"nit - could be:\n\n result \u003d {row[\u0027key\u0027]: row[\u0027value\u0027] for row in rows}","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1903,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1904,"context_line":"        all()"},{"line_number":1905,"context_line":""},{"line_number":1906,"context_line":"    result \u003d {}"},{"line_number":1907,"context_line":"    for row in rows:"},{"line_number":1908,"context_line":"        result[row[\u0027key\u0027]] \u003d row[\u0027value\u0027]"},{"line_number":1909,"context_line":""},{"line_number":1910,"context_line":"    return result"},{"line_number":1911,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_35da8fea","line":1908,"range":{"start_line":1906,"start_character":0,"end_line":1908,"end_character":41},"in_reply_to":"7a3c09a3_2bf615f9","updated":"2017-01-18 20:31:05.000000000","message":"sure, comprehensions are always nice","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1868,"context_line":"                               sort_dirs)"},{"line_number":1869,"context_line":""},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"@require_admin_context"},{"line_number":1872,"context_line":"@_retry_on_deadlock"},{"line_number":1873,"context_line":"def attachment_destroy(context, attachment_id):"},{"line_number":1874,"context_line":"    \"\"\"Destroy the specified attachment record.\"\"\""},{"line_number":1875,"context_line":"    utcnow \u003d timeutils.utcnow()"},{"line_number":1876,"context_line":"    session \u003d get_session()"},{"line_number":1877,"context_line":"    with session.begin():"},{"line_number":1878,"context_line":"        updated_values \u003d {\u0027attach_status\u0027: \u0027deleted\u0027,"},{"line_number":1879,"context_line":"                          \u0027deleted\u0027: True,"},{"line_number":1880,"context_line":"                          \u0027deleted_at\u0027: utcnow,"},{"line_number":1881,"context_line":"                          \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)}"},{"line_number":1882,"context_line":"        model_query(context, models.VolumeAttachment, session\u003dsession).\\"},{"line_number":1883,"context_line":"            filter_by(id\u003dattachment_id).\\"},{"line_number":1884,"context_line":"            update(updated_values)"},{"line_number":1885,"context_line":"        model_query(context, models.AttachmentSpecs, session\u003dsession).\\"},{"line_number":1886,"context_line":"            filter_by(attachment_id\u003dattachment_id).\\"},{"line_number":1887,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1888,"context_line":"                    \u0027deleted_at\u0027: utcnow,"},{"line_number":1889,"context_line":"                    \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)})"},{"line_number":1890,"context_line":"    del updated_values[\u0027updated_at\u0027]"},{"line_number":1891,"context_line":"    return updated_values"},{"line_number":1892,"context_line":""},{"line_number":1893,"context_line":""},{"line_number":1894,"context_line":"def _attachment_specs_query(context, attachment_id, session\u003dNone):"},{"line_number":1895,"context_line":"    return model_query(context, models.AttachmentSpecs, session\u003dsession,"},{"line_number":1896,"context_line":"                       read_deleted\u003d\"no\").\\"},{"line_number":1897,"context_line":"        filter_by(attachment_id\u003dattachment_id)"},{"line_number":1898,"context_line":""},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"@require_context"},{"line_number":1901,"context_line":"def attachment_specs_get(context, attachment_id):"},{"line_number":1902,"context_line":"    \"\"\"Fetch the attachment_specs for the specified attachment record.\"\"\""},{"line_number":1903,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1904,"context_line":"        all()"},{"line_number":1905,"context_line":""},{"line_number":1906,"context_line":"    result \u003d {}"},{"line_number":1907,"context_line":"    for row in rows:"},{"line_number":1908,"context_line":"        result[row[\u0027key\u0027]] \u003d row[\u0027value\u0027]"},{"line_number":1909,"context_line":""},{"line_number":1910,"context_line":"    return result"},{"line_number":1911,"context_line":""},{"line_number":1912,"context_line":""},{"line_number":1913,"context_line":"@require_context"},{"line_number":1914,"context_line":"def attachment_specs_delete(context, attachment_id, key):"},{"line_number":1915,"context_line":"    \"\"\"Delete attachment_specs for the specified attachment record.\"\"\""},{"line_number":1916,"context_line":"    session \u003d get_session()"},{"line_number":1917,"context_line":"    with session.begin():"},{"line_number":1918,"context_line":"        _attachment_specs_get_item(context,"},{"line_number":1919,"context_line":"                                   attachment_id,"},{"line_number":1920,"context_line":"                                   key,"},{"line_number":1921,"context_line":"                                   session)"},{"line_number":1922,"context_line":"        _attachment_specs_query(context, attachment_id, session).\\"},{"line_number":1923,"context_line":"            filter_by(key\u003dkey).\\"},{"line_number":1924,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1925,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"},{"line_number":1926,"context_line":"                    \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)})"},{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":""},{"line_number":1929,"context_line":"@require_context"},{"line_number":1930,"context_line":"def _attachment_specs_get_item(context,"},{"line_number":1931,"context_line":"                               attachment_id,"},{"line_number":1932,"context_line":"                               key,"},{"line_number":1933,"context_line":"                               session\u003dNone):"},{"line_number":1934,"context_line":"    result \u003d _attachment_specs_query("},{"line_number":1935,"context_line":"        context, attachment_id, session\u003dsession).\\"},{"line_number":1936,"context_line":"        filter_by(key\u003dkey).\\"},{"line_number":1937,"context_line":"        first()"},{"line_number":1938,"context_line":""},{"line_number":1939,"context_line":"    if not result:"},{"line_number":1940,"context_line":"        raise exception.AttachmentSpecsNotFound("},{"line_number":1941,"context_line":"            specs_key\u003dkey,"},{"line_number":1942,"context_line":"            attachment_id\u003dattachment_id)"},{"line_number":1943,"context_line":""},{"line_number":1944,"context_line":"    return result"},{"line_number":1945,"context_line":""},{"line_number":1946,"context_line":""},{"line_number":1947,"context_line":"@handle_db_data_error"},{"line_number":1948,"context_line":"@require_context"},{"line_number":1949,"context_line":"def attachment_specs_update_or_create(context,"},{"line_number":1950,"context_line":"                                      attachment_id,"},{"line_number":1951,"context_line":"                                      specs):"},{"line_number":1952,"context_line":"    \"\"\"Update attachment_specs for the specified attachment record.\"\"\""},{"line_number":1953,"context_line":"    session \u003d get_session()"},{"line_number":1954,"context_line":"    with session.begin():"},{"line_number":1955,"context_line":"        spec_ref \u003d None"},{"line_number":1956,"context_line":"        for key, value in specs.items():"},{"line_number":1957,"context_line":"            try:"},{"line_number":1958,"context_line":"                spec_ref \u003d _attachment_specs_get_item("},{"line_number":1959,"context_line":"                    context, attachment_id, key, session)"},{"line_number":1960,"context_line":"            except exception.AttachmentSpecsNotFound:"},{"line_number":1961,"context_line":"                spec_ref \u003d models.AttachmentSpecs()"},{"line_number":1962,"context_line":"            spec_ref.update({\"key\": key, \"value\": value,"},{"line_number":1963,"context_line":"                             \"attachment_id\": attachment_id,"},{"line_number":1964,"context_line":"                             \"deleted\": False})"},{"line_number":1965,"context_line":"            spec_ref.save(session\u003dsession)"},{"line_number":1966,"context_line":""},{"line_number":1967,"context_line":"        return specs"},{"line_number":1968,"context_line":""},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_abfe85ab","line":1967,"range":{"start_line":1871,"start_character":0,"end_line":1967,"end_character":20},"updated":"2017-01-17 12:46:47.000000000","message":"Three public methods here are missing unit tests in test_db_api.py.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1868,"context_line":"                               sort_dirs)"},{"line_number":1869,"context_line":""},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"@require_admin_context"},{"line_number":1872,"context_line":"@_retry_on_deadlock"},{"line_number":1873,"context_line":"def attachment_destroy(context, attachment_id):"},{"line_number":1874,"context_line":"    \"\"\"Destroy the specified attachment record.\"\"\""},{"line_number":1875,"context_line":"    utcnow \u003d timeutils.utcnow()"},{"line_number":1876,"context_line":"    session \u003d get_session()"},{"line_number":1877,"context_line":"    with session.begin():"},{"line_number":1878,"context_line":"        updated_values \u003d {\u0027attach_status\u0027: \u0027deleted\u0027,"},{"line_number":1879,"context_line":"                          \u0027deleted\u0027: True,"},{"line_number":1880,"context_line":"                          \u0027deleted_at\u0027: utcnow,"},{"line_number":1881,"context_line":"                          \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)}"},{"line_number":1882,"context_line":"        model_query(context, models.VolumeAttachment, session\u003dsession).\\"},{"line_number":1883,"context_line":"            filter_by(id\u003dattachment_id).\\"},{"line_number":1884,"context_line":"            update(updated_values)"},{"line_number":1885,"context_line":"        model_query(context, models.AttachmentSpecs, session\u003dsession).\\"},{"line_number":1886,"context_line":"            filter_by(attachment_id\u003dattachment_id).\\"},{"line_number":1887,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1888,"context_line":"                    \u0027deleted_at\u0027: utcnow,"},{"line_number":1889,"context_line":"                    \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)})"},{"line_number":1890,"context_line":"    del updated_values[\u0027updated_at\u0027]"},{"line_number":1891,"context_line":"    return updated_values"},{"line_number":1892,"context_line":""},{"line_number":1893,"context_line":""},{"line_number":1894,"context_line":"def _attachment_specs_query(context, attachment_id, session\u003dNone):"},{"line_number":1895,"context_line":"    return model_query(context, models.AttachmentSpecs, session\u003dsession,"},{"line_number":1896,"context_line":"                       read_deleted\u003d\"no\").\\"},{"line_number":1897,"context_line":"        filter_by(attachment_id\u003dattachment_id)"},{"line_number":1898,"context_line":""},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"@require_context"},{"line_number":1901,"context_line":"def attachment_specs_get(context, attachment_id):"},{"line_number":1902,"context_line":"    \"\"\"Fetch the attachment_specs for the specified attachment record.\"\"\""},{"line_number":1903,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1904,"context_line":"        all()"},{"line_number":1905,"context_line":""},{"line_number":1906,"context_line":"    result \u003d {}"},{"line_number":1907,"context_line":"    for row in rows:"},{"line_number":1908,"context_line":"        result[row[\u0027key\u0027]] \u003d row[\u0027value\u0027]"},{"line_number":1909,"context_line":""},{"line_number":1910,"context_line":"    return result"},{"line_number":1911,"context_line":""},{"line_number":1912,"context_line":""},{"line_number":1913,"context_line":"@require_context"},{"line_number":1914,"context_line":"def attachment_specs_delete(context, attachment_id, key):"},{"line_number":1915,"context_line":"    \"\"\"Delete attachment_specs for the specified attachment record.\"\"\""},{"line_number":1916,"context_line":"    session \u003d get_session()"},{"line_number":1917,"context_line":"    with session.begin():"},{"line_number":1918,"context_line":"        _attachment_specs_get_item(context,"},{"line_number":1919,"context_line":"                                   attachment_id,"},{"line_number":1920,"context_line":"                                   key,"},{"line_number":1921,"context_line":"                                   session)"},{"line_number":1922,"context_line":"        _attachment_specs_query(context, attachment_id, session).\\"},{"line_number":1923,"context_line":"            filter_by(key\u003dkey).\\"},{"line_number":1924,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1925,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"},{"line_number":1926,"context_line":"                    \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)})"},{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":""},{"line_number":1929,"context_line":"@require_context"},{"line_number":1930,"context_line":"def _attachment_specs_get_item(context,"},{"line_number":1931,"context_line":"                               attachment_id,"},{"line_number":1932,"context_line":"                               key,"},{"line_number":1933,"context_line":"                               session\u003dNone):"},{"line_number":1934,"context_line":"    result \u003d _attachment_specs_query("},{"line_number":1935,"context_line":"        context, attachment_id, session\u003dsession).\\"},{"line_number":1936,"context_line":"        filter_by(key\u003dkey).\\"},{"line_number":1937,"context_line":"        first()"},{"line_number":1938,"context_line":""},{"line_number":1939,"context_line":"    if not result:"},{"line_number":1940,"context_line":"        raise exception.AttachmentSpecsNotFound("},{"line_number":1941,"context_line":"            specs_key\u003dkey,"},{"line_number":1942,"context_line":"            attachment_id\u003dattachment_id)"},{"line_number":1943,"context_line":""},{"line_number":1944,"context_line":"    return result"},{"line_number":1945,"context_line":""},{"line_number":1946,"context_line":""},{"line_number":1947,"context_line":"@handle_db_data_error"},{"line_number":1948,"context_line":"@require_context"},{"line_number":1949,"context_line":"def attachment_specs_update_or_create(context,"},{"line_number":1950,"context_line":"                                      attachment_id,"},{"line_number":1951,"context_line":"                                      specs):"},{"line_number":1952,"context_line":"    \"\"\"Update attachment_specs for the specified attachment record.\"\"\""},{"line_number":1953,"context_line":"    session \u003d get_session()"},{"line_number":1954,"context_line":"    with session.begin():"},{"line_number":1955,"context_line":"        spec_ref \u003d None"},{"line_number":1956,"context_line":"        for key, value in specs.items():"},{"line_number":1957,"context_line":"            try:"},{"line_number":1958,"context_line":"                spec_ref \u003d _attachment_specs_get_item("},{"line_number":1959,"context_line":"                    context, attachment_id, key, session)"},{"line_number":1960,"context_line":"            except exception.AttachmentSpecsNotFound:"},{"line_number":1961,"context_line":"                spec_ref \u003d models.AttachmentSpecs()"},{"line_number":1962,"context_line":"            spec_ref.update({\"key\": key, \"value\": value,"},{"line_number":1963,"context_line":"                             \"attachment_id\": attachment_id,"},{"line_number":1964,"context_line":"                             \"deleted\": False})"},{"line_number":1965,"context_line":"            spec_ref.save(session\u003dsession)"},{"line_number":1966,"context_line":""},{"line_number":1967,"context_line":"        return specs"},{"line_number":1968,"context_line":""},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_55fe3b39","line":1967,"range":{"start_line":1871,"start_character":0,"end_line":1967,"end_character":20},"in_reply_to":"7a3c09a3_abfe85ab","updated":"2017-01-18 20:31:05.000000000","message":"Yeah, I\u0027ll get them in the update n+1","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"e794828d61b7a5eabc2eccb64320be699a554ebb","unresolved":false,"context_lines":[{"line_number":1902,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1903,"context_line":"        all()"},{"line_number":1904,"context_line":""},{"line_number":1905,"context_line":"    result \u003d {}"},{"line_number":1906,"context_line":"    result \u003d {row[\u0027key\u0027]: row[\u0027value\u0027] for row in rows}"},{"line_number":1907,"context_line":""},{"line_number":1908,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a3905b3_5a465624","line":1905,"range":{"start_line":1905,"start_character":0,"end_line":1905,"end_character":15},"updated":"2017-01-19 12:48:27.000000000","message":"You don\u0027t need this assignment now.","commit_id":"e4cd7a38e801a087bfa878e8a2e878b4dc0338b7"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"c57772a6ddb02ae5fb13fddcc58861a7dd416d50","unresolved":false,"context_lines":[{"line_number":1902,"context_line":"    rows \u003d _attachment_specs_query(context, attachment_id).\\"},{"line_number":1903,"context_line":"        all()"},{"line_number":1904,"context_line":""},{"line_number":1905,"context_line":"    result \u003d {}"},{"line_number":1906,"context_line":"    result \u003d {row[\u0027key\u0027]: row[\u0027value\u0027] for row in rows}"},{"line_number":1907,"context_line":""},{"line_number":1908,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a3905b3_5aaba889","line":1905,"range":{"start_line":1905,"start_character":0,"end_line":1905,"end_character":15},"in_reply_to":"5a3905b3_5a465624","updated":"2017-01-19 16:08:11.000000000","message":"Done","commit_id":"e4cd7a38e801a087bfa878e8a2e878b4dc0338b7"}],"cinder/tests/unit/attachments/test_attachments_api.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @mock.patch(\u0027cinder.volume.api.check_policy\u0027)"},{"line_number":101,"context_line":"    @mock.patch(\u0027cinder.volume.rpcapi.VolumeAPI.attachment_delete\u0027)"},{"line_number":102,"context_line":"    @mock.patch(\u0027cinder.volume.rpcapi.VolumeAPI.attachment_update\u0027)"},{"line_number":103,"context_line":"    def test_attachment_delete(self,"},{"line_number":104,"context_line":"                               mock_rpc_attachment_update,"},{"line_number":105,"context_line":"                               mock_rpc_attachment_delete,"},{"line_number":106,"context_line":"                               mock_policy):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_69e2c230","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":30},"updated":"2017-01-06 18:19:00.000000000","message":"I would add \u0027update\u0027 to the name of the test too as you kind of test here both calls.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @mock.patch(\u0027cinder.volume.api.check_policy\u0027)"},{"line_number":101,"context_line":"    @mock.patch(\u0027cinder.volume.rpcapi.VolumeAPI.attachment_delete\u0027)"},{"line_number":102,"context_line":"    @mock.patch(\u0027cinder.volume.rpcapi.VolumeAPI.attachment_update\u0027)"},{"line_number":103,"context_line":"    def test_attachment_delete(self,"},{"line_number":104,"context_line":"                               mock_rpc_attachment_update,"},{"line_number":105,"context_line":"                               mock_rpc_attachment_delete,"},{"line_number":106,"context_line":"                               mock_policy):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_162a1f90","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":30},"in_reply_to":"ba5201f7_69e2c230","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.assertEqual(\u0027reserved\u0027, aref.attach_status)"},{"line_number":53,"context_line":"        self.assertIsNone(aref.attach_mode)"},{"line_number":54,"context_line":"        self.assertEqual(vref.id, aref.volume_id)"},{"line_number":55,"context_line":"        self.assertEqual({\u0027driver_volume_type\u0027: None, \u0027data\u0027: {}},"},{"line_number":56,"context_line":"                         aref.connection_info)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027cinder.volume.api.check_policy\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a3905b3_0e11d552","line":55,"range":{"start_line":55,"start_character":25,"end_line":55,"end_character":65},"updated":"2017-01-19 20:00:05.000000000","message":"Jenkins complains about this, it should now be: {}.","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"}],"cinder/tests/unit/attachments/test_attachments_manager.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.manager.stats \u003d {\u0027allocated_capacity_gb\u0027: 100,"},{"line_number":42,"context_line":"                              \u0027pools\u0027: {}}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_attachment_create(self):"},{"line_number":45,"context_line":"        \"\"\"Test attachment_create.\"\"\""},{"line_number":46,"context_line":"        volume_params \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":47,"context_line":"        connector \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_89636641","line":44,"range":{"start_line":44,"start_character":24,"end_line":44,"end_character":30},"updated":"2017-01-06 18:19:00.000000000","message":"s/create/update/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.manager.stats \u003d {\u0027allocated_capacity_gb\u0027: 100,"},{"line_number":42,"context_line":"                              \u0027pools\u0027: {}}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_attachment_create(self):"},{"line_number":45,"context_line":"        \"\"\"Test attachment_create.\"\"\""},{"line_number":46,"context_line":"        volume_params \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":47,"context_line":"        connector \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_16013f06","line":44,"range":{"start_line":44,"start_character":24,"end_line":44,"end_character":30},"in_reply_to":"ba5201f7_89636641","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                              \u0027pools\u0027: {}}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_attachment_create(self):"},{"line_number":45,"context_line":"        \"\"\"Test attachment_create.\"\"\""},{"line_number":46,"context_line":"        volume_params \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":47,"context_line":"        connector \u003d {"},{"line_number":48,"context_line":"            \"initiator\": \"iqn.1993-08.org.debian:01:cad181614cec\","}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_c959ee8f","line":45,"range":{"start_line":45,"start_character":27,"end_line":45,"end_character":33},"updated":"2017-01-06 18:19:00.000000000","message":"s/create/update/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                              \u0027pools\u0027: {}}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_attachment_create(self):"},{"line_number":45,"context_line":"        \"\"\"Test attachment_create.\"\"\""},{"line_number":46,"context_line":"        volume_params \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":47,"context_line":"        connector \u003d {"},{"line_number":48,"context_line":"            \"initiator\": \"iqn.1993-08.org.debian:01:cad181614cec\","}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_f4011406","line":45,"range":{"start_line":45,"start_character":27,"end_line":45,"end_character":33},"in_reply_to":"ba5201f7_c959ee8f","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                \u0027encrypted\u0027: False,"},{"line_number":67,"context_line":"                \u0027qos_specs\u0027: None,"},{"line_number":68,"context_line":"                \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":69,"context_line":"                \u0027attachment_id\u0027: attachment_ref.id}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            self.assertEqual(expected,"},{"line_number":72,"context_line":"                             self.manager.attachment_update("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a3905b3_aea52105","line":69,"range":{"start_line":69,"start_character":50,"end_line":69,"end_character":51},"updated":"2017-01-19 20:00:05.000000000","message":"Due to the latest modifications there\u0027s now \u0027driver_volume_type\u0027: \u0027iscsi\u0027 in this dict as well.","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"}],"cinder/tests/unit/fake_constants.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"055eac62bdff30d52059797cb2b0755a66b9955a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"GROUP_SNAPSHOT_ID \u003d \u00271e2ab152-44f0-11e6-819f-000c29d19d84\u0027"},{"line_number":82,"context_line":"GROUP_SNAPSHOT2_ID \u003d \u002733e2ff04-44f0-11e6-819f-000c29d19d84\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# I don\u0027t care what it\u0027s used for, I just want a damn UUID"},{"line_number":85,"context_line":"UUID1 \u003d \u002784d0c5f7-2349-401c-8672-f76214d13cab\u0027"},{"line_number":86,"context_line":"UUID2 \u003d \u002725406d50-e645-4e62-a9ef-1f53f9cba13f\u0027"},{"line_number":87,"context_line":"UUID3 \u003d \u002729c80662-3a9f-4844-a585-55cd3cd180b5\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_5313990d","line":84,"updated":"2017-01-09 20:13:49.000000000","message":"+1 ;)","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"188620d78e5bbe5cac1490be93cc6412adcd5e23","unresolved":false,"context_lines":[{"line_number":81,"context_line":"GROUP_SNAPSHOT_ID \u003d \u00271e2ab152-44f0-11e6-819f-000c29d19d84\u0027"},{"line_number":82,"context_line":"GROUP_SNAPSHOT2_ID \u003d \u002733e2ff04-44f0-11e6-819f-000c29d19d84\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# I don\u0027t care what it\u0027s used for, I just want a damn UUID"},{"line_number":85,"context_line":"UUID1 \u003d \u002784d0c5f7-2349-401c-8672-f76214d13cab\u0027"},{"line_number":86,"context_line":"UUID2 \u003d \u002725406d50-e645-4e62-a9ef-1f53f9cba13f\u0027"},{"line_number":87,"context_line":"UUID3 \u003d \u002729c80662-3a9f-4844-a585-55cd3cd180b5\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba2be162_d1db814d","line":84,"updated":"2017-03-03 01:58:35.000000000","message":"Bro!\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/uuidsentinel.py\n\nfrom nova.tests import uuidsentinel as uuids\n\n...\n\n\nattachment_id \u003d uuids.attachment_id\n\nIt\u0027s a m\u0027fing uuid bro!","commit_id":"22e6998868ff7edd125ac64f5196b39a88b2c6fe"}],"cinder/volume/api.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f1dae68919483f1325f87557ec590c81022661a0","unresolved":false,"context_lines":[{"line_number":1897,"context_line":"                                                 volume)"},{"line_number":1898,"context_line":""},{"line_number":1899,"context_line":"    @wrap_check_policy"},{"line_number":1900,"context_line":"    def attachment_remove(self, ctxt, attachment):"},{"line_number":1901,"context_line":"        volume \u003d objects.Volume.get_by_id(ctxt, attachment.volume_id)"},{"line_number":1902,"context_line":"        if attachment.attach_status \u003d\u003d \u0027reserved\u0027:"},{"line_number":1903,"context_line":"            attachment.destroy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_b9008767","line":1900,"range":{"start_line":1900,"start_character":8,"end_line":1900,"end_character":25},"updated":"2016-12-28 19:16:38.000000000","message":"Both \u0027attachment_remove\u0027 and \u0027attachment_delete\u0027 are used in the patch and it breaks here. Renaming this to \u0027attachment_delete\u0027 fixes the problem, although as it is referred as \u0027attachment-delete\u0027 in the client and the API too I would keep that and use it everywhere in the code.","commit_id":"1f7987bf33d0b6b8460ffaf18ae177e6326490c5"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":1819,"context_line":"            else:"},{"line_number":1820,"context_line":"                return bool(val)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":"    def _attachment_reserve(self, ctxt, vref, server_id\u003dNone):"},{"line_number":1823,"context_line":"        # NOTE(jdg): Reserved is a special case, we\u0027re avoiding allowing"},{"line_number":1824,"context_line":"        # creation of other new reserves/attachments while in this state"},{"line_number":1825,"context_line":"        # so we avoid contention issues with shared connections"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_2c16bea7","line":1822,"updated":"2017-01-09 18:31:09.000000000","message":"is there a reason there is no wrap_check_policy decorator on this method?","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"055eac62bdff30d52059797cb2b0755a66b9955a","unresolved":false,"context_lines":[{"line_number":1819,"context_line":"            else:"},{"line_number":1820,"context_line":"                return bool(val)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":"    def _attachment_reserve(self, ctxt, vref, server_id\u003dNone):"},{"line_number":1823,"context_line":"        # NOTE(jdg): Reserved is a special case, we\u0027re avoiding allowing"},{"line_number":1824,"context_line":"        # creation of other new reserves/attachments while in this state"},{"line_number":1825,"context_line":"        # so we avoid contention issues with shared connections"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_53e1d9fd","line":1822,"in_reply_to":"ba5201f7_2c16bea7","updated":"2017-01-09 20:13:49.000000000","message":"This is a private method used by the public call below that does have that decorator.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"aa3e90ba864704840f39c89d43166bb4aaf432c1","unresolved":false,"context_lines":[{"line_number":1819,"context_line":"            else:"},{"line_number":1820,"context_line":"                return bool(val)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":"    def _attachment_reserve(self, ctxt, vref, server_id\u003dNone):"},{"line_number":1823,"context_line":"        # NOTE(jdg): Reserved is a special case, we\u0027re avoiding allowing"},{"line_number":1824,"context_line":"        # creation of other new reserves/attachments while in this state"},{"line_number":1825,"context_line":"        # so we avoid contention issues with shared connections"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_4cf21b71","line":1822,"in_reply_to":"ba5201f7_53e1d9fd","updated":"2017-01-09 21:15:10.000000000","message":"got it. I missed the leading underscore.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from cinder import objects"},{"line_number":43,"context_line":"from cinder.objects import base as objects_base"},{"line_number":44,"context_line":"from cinder.objects import fields"},{"line_number":45,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":46,"context_line":"import cinder.policy"},{"line_number":47,"context_line":"from cinder import quota"},{"line_number":48,"context_line":"from cinder import quota_utils"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_6b881dc6","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":55},"updated":"2017-01-17 12:46:47.000000000","message":"We shouldn\u0027t really import objects. You can use objects.VolumeAttachmentList to access it.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from cinder import objects"},{"line_number":43,"context_line":"from cinder.objects import base as objects_base"},{"line_number":44,"context_line":"from cinder.objects import fields"},{"line_number":45,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":46,"context_line":"import cinder.policy"},{"line_number":47,"context_line":"from cinder import quota"},{"line_number":48,"context_line":"from cinder import quota_utils"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_35afef2c","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":55},"in_reply_to":"7a3c09a3_43d068c9","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7b8f95c026040af98eaec1b9952d8efce123c8b0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from cinder import objects"},{"line_number":43,"context_line":"from cinder.objects import base as objects_base"},{"line_number":44,"context_line":"from cinder.objects import fields"},{"line_number":45,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":46,"context_line":"import cinder.policy"},{"line_number":47,"context_line":"from cinder import quota"},{"line_number":48,"context_line":"from cinder import quota_utils"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_ad758b64","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":55},"in_reply_to":"7a3c09a3_6b881dc6","updated":"2017-01-18 05:05:51.000000000","message":"Yeah :( . The name is just ridiculous, especially given an 80 char line limit, typing:\n  objects.VolumeAttachmentList.get_all_by_volume_id(xxxx) \n\npretty henous IMHO, I\u0027ll just use objecdts and maybe set a variable if that seems ok?","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2f18ddacc649b1e9363f2f8cd6ab82e387ea9500","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from cinder import objects"},{"line_number":43,"context_line":"from cinder.objects import base as objects_base"},{"line_number":44,"context_line":"from cinder.objects import fields"},{"line_number":45,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":46,"context_line":"import cinder.policy"},{"line_number":47,"context_line":"from cinder import quota"},{"line_number":48,"context_line":"from cinder import quota_utils"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_43d068c9","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":55},"in_reply_to":"7a3c09a3_ad758b64","updated":"2017-01-18 11:29:49.000000000","message":"Sure, either variable or constant, it works for me.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"        # determine if we\u0027re attaching to the Cinder host for some work or if"},{"line_number":1839,"context_line":"        # we\u0027re being used by the outside world."},{"line_number":1840,"context_line":"        expected \u003d {\u0027multiattach\u0027: vref.multiattach,"},{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b62fcc86","line":1841,"range":{"start_line":1841,"start_character":31,"end_line":1841,"end_character":54},"updated":"2017-01-17 12:46:47.000000000","message":"Shouldn\u0027t this include \u0027downloading\u0027 as well? Why we\u0027re prohibiting \u0027downloading\u0027 only when multiattach is enabled?","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"        # determine if we\u0027re attaching to the Cinder host for some work or if"},{"line_number":1839,"context_line":"        # we\u0027re being used by the outside world."},{"line_number":1840,"context_line":"        expected \u003d {\u0027multiattach\u0027: vref.multiattach,"},{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_355d2f49","line":1841,"range":{"start_line":1841,"start_character":31,"end_line":1841,"end_character":54},"in_reply_to":"7a3c09a3_a3ae6c2b","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7b8f95c026040af98eaec1b9952d8efce123c8b0","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"        # determine if we\u0027re attaching to the Cinder host for some work or if"},{"line_number":1839,"context_line":"        # we\u0027re being used by the outside world."},{"line_number":1840,"context_line":"        expected \u003d {\u0027multiattach\u0027: vref.multiattach,"},{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_cdf737d1","line":1841,"range":{"start_line":1841,"start_character":31,"end_line":1841,"end_character":54},"in_reply_to":"7a3c09a3_b62fcc86","updated":"2017-01-18 05:05:51.000000000","message":"Yeah, when we\u0027re ready to turn on multi-attach we will.  I conveniently ignored that for now since we don\u0027t actually support multi-attach but I\u0027ll add it there anyway.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2f18ddacc649b1e9363f2f8cd6ab82e387ea9500","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"        # determine if we\u0027re attaching to the Cinder host for some work or if"},{"line_number":1839,"context_line":"        # we\u0027re being used by the outside world."},{"line_number":1840,"context_line":"        expected \u003d {\u0027multiattach\u0027: vref.multiattach,"},{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_a3ae6c2b","line":1841,"range":{"start_line":1841,"start_character":31,"end_line":1841,"end_character":54},"in_reply_to":"7a3c09a3_cdf737d1","updated":"2017-01-18 11:29:49.000000000","message":"Yeah, we would most likely miss this once multiattach is ready.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"},{"line_number":1845,"context_line":"            expected_status \u003d utils.build_or_str(expected[\u0027status\u0027])"},{"line_number":1846,"context_line":"            msg \u003d _(\u0027Volume status must be %(expected)s to reserve, but the \u0027"},{"line_number":1847,"context_line":"                    \u0027status is %(current)s.\u0027) % {\u0027expected\u0027: expected_status,"},{"line_number":1848,"context_line":"                                                 \u0027current\u0027: vref.status}"},{"line_number":1849,"context_line":"            LOG.error(msg)"},{"line_number":1850,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1851,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b667ccb5","line":1848,"range":{"start_line":1844,"start_character":0,"end_line":1848,"end_character":72},"updated":"2017-01-17 12:46:47.000000000","message":"Actually the status can be correct again as you may get 2 status changes between checking and fetching the volume again. You should build more generic messages like here [1].\n\n[1] https://github.com/openstack/cinder/blob/13742faea1466a280d5cb902b919c6604dbe1bbd/cinder/volume/api.py#L1201-L1206","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"},{"line_number":1845,"context_line":"            expected_status \u003d utils.build_or_str(expected[\u0027status\u0027])"},{"line_number":1846,"context_line":"            msg \u003d _(\u0027Volume status must be %(expected)s to reserve, but the \u0027"},{"line_number":1847,"context_line":"                    \u0027status is %(current)s.\u0027) % {\u0027expected\u0027: expected_status,"},{"line_number":1848,"context_line":"                                                 \u0027current\u0027: vref.status}"},{"line_number":1849,"context_line":"            LOG.error(msg)"},{"line_number":1850,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1851,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_3839a6d9","line":1848,"range":{"start_line":1844,"start_character":0,"end_line":1848,"end_character":72},"in_reply_to":"7a3c09a3_2dd6fb27","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7b8f95c026040af98eaec1b9952d8efce123c8b0","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"                    \u0027status\u0027: ((\u0027available\u0027, \u0027in-use\u0027) if vref.multiattach"},{"line_number":1842,"context_line":"                               else (\u0027available\u0027, \u0027downloading\u0027))}"},{"line_number":1843,"context_line":"        result \u003d vref.conditional_update({\u0027status\u0027: \u0027reserved\u0027}, expected)"},{"line_number":1844,"context_line":"        if not result:"},{"line_number":1845,"context_line":"            expected_status \u003d utils.build_or_str(expected[\u0027status\u0027])"},{"line_number":1846,"context_line":"            msg \u003d _(\u0027Volume status must be %(expected)s to reserve, but the \u0027"},{"line_number":1847,"context_line":"                    \u0027status is %(current)s.\u0027) % {\u0027expected\u0027: expected_status,"},{"line_number":1848,"context_line":"                                                 \u0027current\u0027: vref.status}"},{"line_number":1849,"context_line":"            LOG.error(msg)"},{"line_number":1850,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1851,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_2dd6fb27","line":1848,"range":{"start_line":1844,"start_character":0,"end_line":1848,"end_character":72},"in_reply_to":"7a3c09a3_b667ccb5","updated":"2017-01-18 05:05:51.000000000","message":"ah, nice!","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"                  \u0027volume_host\u0027: vref.host,"},{"line_number":1854,"context_line":"                  \u0027attach_status\u0027: \u0027reserved\u0027,"},{"line_number":1855,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid}"},{"line_number":1856,"context_line":"        return self.db.volume_attach(ctxt.elevated(),"},{"line_number":1857,"context_line":"                                     values)"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"    @wrap_check_policy"},{"line_number":1860,"context_line":"    def attachment_create(self,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_1624205e","line":1857,"range":{"start_line":1856,"start_character":0,"end_line":1857,"end_character":44},"updated":"2017-01-17 12:46:47.000000000","message":"No need to wrap this line.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"                  \u0027volume_host\u0027: vref.host,"},{"line_number":1854,"context_line":"                  \u0027attach_status\u0027: \u0027reserved\u0027,"},{"line_number":1855,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid}"},{"line_number":1856,"context_line":"        return self.db.volume_attach(ctxt.elevated(),"},{"line_number":1857,"context_line":"                                     values)"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"    @wrap_check_policy"},{"line_number":1860,"context_line":"    def attachment_create(self,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_185b0a30","line":1857,"range":{"start_line":1856,"start_character":0,"end_line":1857,"end_character":44},"in_reply_to":"7a3c09a3_1624205e","updated":"2017-01-18 20:31:05.000000000","message":"BUT I want to wrap that line!  :)","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"57899c81b023a6c1b4f925b4569ee62a5f659ce8","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                                                     connector,"},{"line_number":1874,"context_line":"                                                     attachment_ref))"},{"line_number":1875,"context_line":"        else:"},{"line_number":1876,"context_line":"            attachment_ref[\u0027connection_info\u0027] \u003d {\u0027driver_volume_type\u0027: None,"},{"line_number":1877,"context_line":"                                                 \u0027data\u0027: {}}"},{"line_number":1878,"context_line":"        return attachment_ref"},{"line_number":1879,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_89886324","line":1876,"range":{"start_line":1876,"start_character":12,"end_line":1876,"end_character":26},"updated":"2017-01-13 19:02:48.000000000","message":"\u0027self.db.volume_attach\u0027 above in \u0027_attachment_reserve\u0027 returns an object, this here is not going to work.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                                                     connector,"},{"line_number":1874,"context_line":"                                                     attachment_ref))"},{"line_number":1875,"context_line":"        else:"},{"line_number":1876,"context_line":"            attachment_ref[\u0027connection_info\u0027] \u003d {\u0027driver_volume_type\u0027: None,"},{"line_number":1877,"context_line":"                                                 \u0027data\u0027: {}}"},{"line_number":1878,"context_line":"        return attachment_ref"},{"line_number":1879,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_d89ee2b7","line":1876,"range":{"start_line":1876,"start_character":12,"end_line":1876,"end_character":26},"in_reply_to":"7a3c09a3_6db3a30a","updated":"2017-01-18 20:31:05.000000000","message":"I\u0027ll revisit this","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                                                     connector,"},{"line_number":1874,"context_line":"                                                     attachment_ref))"},{"line_number":1875,"context_line":"        else:"},{"line_number":1876,"context_line":"            attachment_ref[\u0027connection_info\u0027] \u003d {\u0027driver_volume_type\u0027: None,"},{"line_number":1877,"context_line":"                                                 \u0027data\u0027: {}}"},{"line_number":1878,"context_line":"        return attachment_ref"},{"line_number":1879,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_cb9671ef","line":1876,"range":{"start_line":1876,"start_character":12,"end_line":1876,"end_character":26},"in_reply_to":"7a3c09a3_89886324","updated":"2017-01-17 12:46:47.000000000","message":"Actually we still have dict compatibility in our objects, so this should be fine. But anyway it can be changed.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7b8f95c026040af98eaec1b9952d8efce123c8b0","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                                                     connector,"},{"line_number":1874,"context_line":"                                                     attachment_ref))"},{"line_number":1875,"context_line":"        else:"},{"line_number":1876,"context_line":"            attachment_ref[\u0027connection_info\u0027] \u003d {\u0027driver_volume_type\u0027: None,"},{"line_number":1877,"context_line":"                                                 \u0027data\u0027: {}}"},{"line_number":1878,"context_line":"        return attachment_ref"},{"line_number":1879,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_6db3a30a","line":1876,"range":{"start_line":1876,"start_character":12,"end_line":1876,"end_character":26},"in_reply_to":"7a3c09a3_b167d6b5","updated":"2017-01-18 05:05:51.000000000","message":"something I broke along the way is in api/v3/attachments I used to be converting the response with ._as_dict() and popping the volume object.  I would like to put that back in place if there are no objections.  That way Nova or any other caller doesn\u0027t have to deal with objects.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"61a811260ad91538c678c39f053f9092ab75a40c","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                                                     connector,"},{"line_number":1874,"context_line":"                                                     attachment_ref))"},{"line_number":1875,"context_line":"        else:"},{"line_number":1876,"context_line":"            attachment_ref[\u0027connection_info\u0027] \u003d {\u0027driver_volume_type\u0027: None,"},{"line_number":1877,"context_line":"                                                 \u0027data\u0027: {}}"},{"line_number":1878,"context_line":"        return attachment_ref"},{"line_number":1879,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b167d6b5","line":1876,"range":{"start_line":1876,"start_character":12,"end_line":1876,"end_character":26},"in_reply_to":"7a3c09a3_cb9671ef","updated":"2017-01-17 13:01:07.000000000","message":"Thanks for the clarification. I had some issues when I tested this flow as I tried to also make it work with Nova, I will double check my fixes to see where things really broke.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1900,"context_line":"    @wrap_check_policy"},{"line_number":1901,"context_line":"    def attachment_get(self, ctxt, attachment):"},{"line_number":1902,"context_line":"        volume \u003d objects.Volume.get_by_id(context, attachment.volume_id)"},{"line_number":1903,"context_line":"        return self.volume_rpcapi.attachment_get(ctxt,"},{"line_number":1904,"context_line":"                                                 attachment,"},{"line_number":1905,"context_line":"                                                 volume)"},{"line_number":1906,"context_line":""},{"line_number":1907,"context_line":"    @wrap_check_policy"},{"line_number":1908,"context_line":"    def attachment_delete(self, ctxt, attachment):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_36b3dcea","line":1905,"range":{"start_line":1903,"start_character":0,"end_line":1905,"end_character":56},"updated":"2017-01-17 12:46:47.000000000","message":"attachment_get isn\u0027t present in volume_rpcapi.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1900,"context_line":"    @wrap_check_policy"},{"line_number":1901,"context_line":"    def attachment_get(self, ctxt, attachment):"},{"line_number":1902,"context_line":"        volume \u003d objects.Volume.get_by_id(context, attachment.volume_id)"},{"line_number":1903,"context_line":"        return self.volume_rpcapi.attachment_get(ctxt,"},{"line_number":1904,"context_line":"                                                 attachment,"},{"line_number":1905,"context_line":"                                                 volume)"},{"line_number":1906,"context_line":""},{"line_number":1907,"context_line":"    @wrap_check_policy"},{"line_number":1908,"context_line":"    def attachment_delete(self, ctxt, attachment):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_f8c8feaa","line":1905,"range":{"start_line":1903,"start_character":0,"end_line":1905,"end_character":56},"in_reply_to":"7a3c09a3_36b3dcea","updated":"2017-01-18 20:31:05.000000000","message":"Balls!  Yeah, this is dead code, the API just does the object fetch and returns it; no need that I can see to. traverse any deeper than that.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":1915,"context_line":"                                                 volume)"},{"line_number":1916,"context_line":"        remaining_attachments \u003d oval.get_all_by_volume_id(ctxt, volume.id)"},{"line_number":1917,"context_line":"        if len(remaining_attachments) \u003c 1:"},{"line_number":1918,"context_line":"            volume.update({\u0027status\u0027: \u0027available\u0027})"},{"line_number":1919,"context_line":"            volume.update({\u0027attach_status\u0027: \u0027deleted\u0027})"},{"line_number":1920,"context_line":"            volume.save()"},{"line_number":1921,"context_line":"        return remaining_attachments"},{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_56fa2876","line":1920,"range":{"start_line":1918,"start_character":0,"end_line":1920,"end_character":25},"updated":"2017-01-17 12:46:47.000000000","message":"Why not simply:\n\n volume.status \u003d \u0027available\u0027\n volume.attach_status \u003d \u0027deleted\u0027\n volume.save()\n\nAnd BTW - shouldn\u0027t it be \u0027detached\u0027 instead of \u0027deleted\u0027?","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1915,"context_line":"                                                 volume)"},{"line_number":1916,"context_line":"        remaining_attachments \u003d oval.get_all_by_volume_id(ctxt, volume.id)"},{"line_number":1917,"context_line":"        if len(remaining_attachments) \u003c 1:"},{"line_number":1918,"context_line":"            volume.update({\u0027status\u0027: \u0027available\u0027})"},{"line_number":1919,"context_line":"            volume.update({\u0027attach_status\u0027: \u0027deleted\u0027})"},{"line_number":1920,"context_line":"            volume.save()"},{"line_number":1921,"context_line":"        return remaining_attachments"},{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_586e7297","line":1920,"range":{"start_line":1918,"start_character":0,"end_line":1920,"end_character":25},"in_reply_to":"7a3c09a3_231efc6f","updated":"2017-01-18 20:31:05.000000000","message":"+1 That\u0027s my plan, but saving it til we do multi-attach","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":1915,"context_line":"                                                 volume)"},{"line_number":1916,"context_line":"        remaining_attachments \u003d oval.get_all_by_volume_id(ctxt, volume.id)"},{"line_number":1917,"context_line":"        if len(remaining_attachments) \u003c 1:"},{"line_number":1918,"context_line":"            volume.update({\u0027status\u0027: \u0027available\u0027})"},{"line_number":1919,"context_line":"            volume.update({\u0027attach_status\u0027: \u0027deleted\u0027})"},{"line_number":1920,"context_line":"            volume.save()"},{"line_number":1921,"context_line":"        return remaining_attachments"},{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_3871a678","line":1920,"range":{"start_line":1918,"start_character":0,"end_line":1920,"end_character":25},"in_reply_to":"7a3c09a3_56fa2876","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7b8f95c026040af98eaec1b9952d8efce123c8b0","unresolved":false,"context_lines":[{"line_number":1915,"context_line":"                                                 volume)"},{"line_number":1916,"context_line":"        remaining_attachments \u003d oval.get_all_by_volume_id(ctxt, volume.id)"},{"line_number":1917,"context_line":"        if len(remaining_attachments) \u003c 1:"},{"line_number":1918,"context_line":"            volume.update({\u0027status\u0027: \u0027available\u0027})"},{"line_number":1919,"context_line":"            volume.update({\u0027attach_status\u0027: \u0027deleted\u0027})"},{"line_number":1920,"context_line":"            volume.save()"},{"line_number":1921,"context_line":"        return remaining_attachments"},{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_cd93b759","line":1920,"range":{"start_line":1918,"start_character":0,"end_line":1920,"end_character":25},"in_reply_to":"7a3c09a3_56fa2876","updated":"2017-01-18 05:05:51.000000000","message":"hehe... cuz I\u0027m not so good with this whole transition to objects :)\n\nThe new flow this is actually deleting the attachment record, but yeah, for the volumes attach_status deleted is probably not what we want.  I want to look at this again anyway because now we have two sources of attach_status we check which is rather annoying (the volume and the attachment record; FWIW that problem exists in current code as well)","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2f18ddacc649b1e9363f2f8cd6ab82e387ea9500","unresolved":false,"context_lines":[{"line_number":1915,"context_line":"                                                 volume)"},{"line_number":1916,"context_line":"        remaining_attachments \u003d oval.get_all_by_volume_id(ctxt, volume.id)"},{"line_number":1917,"context_line":"        if len(remaining_attachments) \u003c 1:"},{"line_number":1918,"context_line":"            volume.update({\u0027status\u0027: \u0027available\u0027})"},{"line_number":1919,"context_line":"            volume.update({\u0027attach_status\u0027: \u0027deleted\u0027})"},{"line_number":1920,"context_line":"            volume.save()"},{"line_number":1921,"context_line":"        return remaining_attachments"},{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_231efc6f","line":1920,"range":{"start_line":1918,"start_character":0,"end_line":1920,"end_character":25},"in_reply_to":"7a3c09a3_cd93b759","updated":"2017-01-18 11:29:49.000000000","message":"Probably we should base our volume.attach_status on number of records in volume.attachments that have \"attached\" status. This is not trivial, so I guess that\u0027s change for later. No need to try to fix everything in this patch.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"}],"cinder/volume/manager.py":[{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"076dcae920fdb23a539007a5434ce18f9558ac79","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"            attachment.id)"},{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        try:"},{"line_number":4505,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4506,"context_line":"                                                                  connector,"},{"line_number":4507,"context_line":"                                                                  force\u003dforce)"},{"line_number":4508,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_d6117753","line":4505,"updated":"2017-01-06 21:57:36.000000000","message":"Does terminate_connection() return a boolean? (From what I could tell, it doesn\u0027t seem to.) If not, then  _connection_terminate() will return either False or something else that\u0027s not boolean. Maybe the return variable should be something new, like has_shared_connection?","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"            attachment.id)"},{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        try:"},{"line_number":4505,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4506,"context_line":"                                                                  connector,"},{"line_number":4507,"context_line":"                                                                  force\u003dforce)"},{"line_number":4508,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_b4330cf5","line":4505,"in_reply_to":"ba5201f7_d6117753","updated":"2017-01-07 15:36:35.000000000","message":"Hey Steve,\nSo yeah, this is actually a *new* thing that doesn\u0027t exist in the drivers as of yet.  Currently the drivers return None so I was manipulating this to work as is since we don\u0027t keep track of this concept currently anyway.  The thought being make it work with the stub here so that drivers can add the ability to report True in the future if they track/support such things.\n\nThe drivers last I checked should be returning None but I may have missed some here.  So the idea was use the if None below to convert it to a boolean False.\n\nTo be super safe, I could add a check that if it\u0027s something other than a Bool just set to False.. maybe that would be a safe compromise?","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"        try:"},{"line_number":1470,"context_line":"            model_update \u003d self.driver.create_export(context.elevated(),"},{"line_number":1471,"context_line":"                                                     volume, connector)"},{"line_number":1472,"context_line":"        except exception.CinderException:"},{"line_number":1473,"context_line":"            err_msg \u003d (_(\"Create export for volume failed.\"))"},{"line_number":1474,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":1475,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_ff99b6d1","line":1472,"updated":"2017-01-09 18:31:09.000000000","message":"just fyi - I know this is not your code, but was in the original code...\n\nI couldn\u0027t find any functional create_export method in cinder. The only one that shows up is in dothill_iscsi and it\u0027s just a nop.\n\nbut just in case something is ever implemented for it, it would be better to catch using \u0027Exception as err\u0027, and then include that error in the exception being thrown here.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":4389,"context_line":"        try:"},{"line_number":4390,"context_line":"            model_update \u003d self.driver.create_export(ctxt.elevated(),"},{"line_number":4391,"context_line":"                                                     volume, connector)"},{"line_number":4392,"context_line":"        except exception.CinderException:"},{"line_number":4393,"context_line":"            err_msg \u003d (_(\"Create export for volume failed.\"))"},{"line_number":4394,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":4395,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_9f926a9e","line":4392,"updated":"2017-01-09 18:31:09.000000000","message":"same comment as above about using \u0027Exception as err\u0027 to pass up the error.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"110569b6104802c385ce6e39f545523f1626e232","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"            attachment.id)"},{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        try:"},{"line_number":4505,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4506,"context_line":"                                                                  connector,"},{"line_number":4507,"context_line":"                                                                  force\u003dforce)"},{"line_number":4508,"context_line":"            if not isinstance(shared_connections, bool):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_01c9cdac","line":4505,"updated":"2017-01-09 18:31:09.000000000","message":"I didn\u0027t do an exhaustive check, but I did find that ibm/flashsystem_iscsi returns this from terminate_connection():\n\nreturn {\u0027driver_volume_type\u0027: \u0027iscsi\u0027}\n\nSo your suggestion about checking for a boolean (or None) would be good to protect against drivers returning something unexpected.","commit_id":"bd137544593a956e316d4d011b68dc9a0e1a7a65"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":1470,"context_line":"            model_update \u003d self.driver.create_export(context.elevated(),"},{"line_number":1471,"context_line":"                                                     volume, connector)"},{"line_number":1472,"context_line":"        except exception.CinderException as ex:"},{"line_number":1473,"context_line":"            msg \u003d _(\"Create export of volume failed (%s)\") % ex.msg"},{"line_number":1474,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":1475,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":1476,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_2f13a5b9","line":1473,"range":{"start_line":1473,"start_character":61,"end_line":1473,"end_character":67},"updated":"2017-01-11 16:00:58.000000000","message":"I think this should be six.text_type(ex) like above.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":1470,"context_line":"            model_update \u003d self.driver.create_export(context.elevated(),"},{"line_number":1471,"context_line":"                                                     volume, connector)"},{"line_number":1472,"context_line":"        except exception.CinderException as ex:"},{"line_number":1473,"context_line":"            msg \u003d _(\"Create export of volume failed (%s)\") % ex.msg"},{"line_number":1474,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":1475,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":1476,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_75d4901f","line":1473,"range":{"start_line":1473,"start_character":61,"end_line":1473,"end_character":67},"in_reply_to":"ba5201f7_2f13a5b9","updated":"2017-01-11 19:42:31.000000000","message":"I\u0027m not sure, but I believe that since I\u0027m just plucking out the msg here that I don\u0027t need the six.text_type like above (it\u0027s translating the entire exception).\n\nI don\u0027t know which is better, so maybe folks could enlighten me","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"40c6148f875f8ac98dbee3996e7c1794d9de6050","unresolved":false,"context_lines":[{"line_number":1470,"context_line":"            model_update \u003d self.driver.create_export(context.elevated(),"},{"line_number":1471,"context_line":"                                                     volume, connector)"},{"line_number":1472,"context_line":"        except exception.CinderException as ex:"},{"line_number":1473,"context_line":"            msg \u003d _(\"Create export of volume failed (%s)\") % ex.msg"},{"line_number":1474,"context_line":"            LOG.exception(msg, resource\u003dvolume)"},{"line_number":1475,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":1476,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_3bc67968","line":1473,"range":{"start_line":1473,"start_character":61,"end_line":1473,"end_character":67},"in_reply_to":"ba5201f7_75d4901f","updated":"2017-01-11 19:52:32.000000000","message":"From what I\u0027ve seen, the main concern is whether that exception message could contain something that would cause problems. Like if it had the message \"Failed to create volume [some weird unicode volume name]\" or something.\n\nWhen we pass things in to the logger, internal at some point in the logging process it makes sure the string is safe. When you do the string formatting up front, like you need to do here, it\u0027s possible to get errors under certain conditions.\n\nThe \"certain conditions\" part is the one where I don\u0027t have a firm grasp on. I think we most likely over use six.text_type(), but at the same time, it doesn\u0027t really hurt and could protect us. At least it could be consistent.\n\nSo I guess the big question is whether at this point, could we ever get an exception message back that could have some user input string that would cause issues. Maybe not. If it\u0027s not clear, I\u0027m fine either way.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":4390,"context_line":"            model_update \u003d self.driver.create_export(ctxt.elevated(),"},{"line_number":4391,"context_line":"                                                     volume, connector)"},{"line_number":4392,"context_line":"        except exception.CinderException as ex:"},{"line_number":4393,"context_line":"            err_msg \u003d (_(\"Create export for volume failed (%s).\") % ex.msg)"},{"line_number":4394,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":4395,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":4396,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_4f7f09e0","line":4393,"range":{"start_line":4393,"start_character":68,"end_line":4393,"end_character":74},"updated":"2017-01-11 16:00:58.000000000","message":"Same as above.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"8ce9f3064a0165d0f1657ec8489d264940efe226","unresolved":false,"context_lines":[{"line_number":4486,"context_line":"                                         connector.get(\u0027hostname\u0027, \u0027\u0027),"},{"line_number":4487,"context_line":"                                         connector.get(\u0027mountpoint\u0027, \u0027na\u0027),"},{"line_number":4488,"context_line":"                                         mode)"},{"line_number":4489,"context_line":"        self._notify_about_volume_usage(context, volume, \"attach.end\")"},{"line_number":4490,"context_line":"        LOG.info(_LI(\"Attach volume completed successfully.\"),"},{"line_number":4491,"context_line":"                 resource\u003dvref)"},{"line_number":4492,"context_line":"        return connection_info"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_fd46b0be","line":4489,"range":{"start_line":4489,"start_character":13,"end_line":4489,"end_character":70},"updated":"2017-01-11 17:11:57.000000000","message":"This call needs the volume object like above for \"attach.start\", otherwise fails with: TypeError: tuple indices must be integers, not str","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"92ce9c679bf2ce5c47c04e2fb5dc02b54fa2d064","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"            attachment.id)"},{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        try:"},{"line_number":4505,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4506,"context_line":"                                                                  connector,"},{"line_number":4507,"context_line":"                                                                  force\u003dforce)"},{"line_number":4508,"context_line":"            if not isinstance(shared_connections, bool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_bbb18903","line":4505,"updated":"2017-01-11 19:54:56.000000000","message":"I was looking around at how terminate_connection is used and found many places where a non-null return is provided:\n\ndrivers/\n- coprhd/fc.py - return data\n- dell_emc/unity/driver.py - return conn_info\n- dell_emc/vnx/driver.py - return conn_info\n- dell_emc/xtremio.py - return {\u0027driver_volume_type\u0027: \u0027fibre_channel\u0027, \u0027data\u0027: data}\n- dell/dell_storage_center_fc.py - return info\n- dothill/dothill_fc.py - return info\n- emc/emc_vmac_fc.py - return data\n- falconstor/fc.py - return fc_info\n- fujitsu/eternus_dx_common.py - return map_exist\n- etc...\n\nIt seems to be an inconsistent mix of things.\n\nSo it may not be feasible to have the drivers return a boolean that indicates attach status, especially if these current return values are actually used.\n\nMaybe there should be a new driver method to provide this boolean? \n\nAlso, is there a doc that list what changes need to be made to the drivers that want to support multi-attach?","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"c46f1e05c35126795024f5f47f5d70b9b555125a","unresolved":false,"context_lines":[{"line_number":4502,"context_line":"            attachment.id)"},{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        try:"},{"line_number":4505,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4506,"context_line":"                                                                  connector,"},{"line_number":4507,"context_line":"                                                                  force\u003dforce)"},{"line_number":4508,"context_line":"            if not isinstance(shared_connections, bool):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_390bde2b","line":4505,"in_reply_to":"ba5201f7_bbb18903","updated":"2017-01-11 22:03:40.000000000","message":"Hey Steve,\n\nYes, it is inconsistent which is part of why I\u0027m hoping to clean some of this up over time.  Initialize connection and attach have similar problems.\n\nAs far as the check for bool here, the idea is *not* that I expect the drivers currently to return bool, but moving forward I would expect drivers to be updated as necessary to report that they do or do not share a connection.  This is also part of a requirement for multi-attach.\n\nAs far as your question, the reason I added the check with isinstance, is exactly because currently it\u0027s broken and inconsistent.  This way as drivers update (if they update and care about this) it will work, for those that don\u0027t care of don\u0027t update we\u0027ll assume the connection is not shared.  The important thing to note here is that we currently ignore this anyway.  The existing terminate_connection call doesn\u0027t check this response or use it, regardless of what the drivers may have chosen to do.\n\nThis also raises one of my big criticisms, we have a reference driver, but rather than follow the reference driver and the fact that it doesn\u0027t return anything on terminate_connection, instead some chose to go their own way and make their own interpretation that doesn\u0027t actually *do* anything.","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":71,"context_line":"from cinder.objects import cgsnapshot"},{"line_number":72,"context_line":"from cinder.objects import consistencygroup"},{"line_number":73,"context_line":"from cinder.objects import fields"},{"line_number":74,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":75,"context_line":"from cinder import quota"},{"line_number":76,"context_line":"from cinder import utils"},{"line_number":77,"context_line":"from cinder import volume as cinder_volume"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b6726c0f","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":55},"updated":"2017-01-17 12:46:47.000000000","message":"Would be better not to import individual objects and simply use objects.VolumeAttachmentList. You can create some abbreviation later in the code.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"from cinder.objects import cgsnapshot"},{"line_number":72,"context_line":"from cinder.objects import consistencygroup"},{"line_number":73,"context_line":"from cinder.objects import fields"},{"line_number":74,"context_line":"from cinder.objects import VolumeAttachmentList as oval"},{"line_number":75,"context_line":"from cinder import quota"},{"line_number":76,"context_line":"from cinder import utils"},{"line_number":77,"context_line":"from cinder import volume as cinder_volume"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_387b662b","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":55},"in_reply_to":"7a3c09a3_b6726c0f","updated":"2017-01-18 20:31:05.000000000","message":"Done","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"b7d0713846eca3043796fd5eb91ef000e94a6681","unresolved":false,"context_lines":[{"line_number":4534,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":4535,"context_line":"        LOG.info(_LI(\"Terminate volume connection completed successfully.\"),"},{"line_number":4536,"context_line":"                 resource\u003dvolume)"},{"line_number":4537,"context_line":"        # NOTE(jdg): Return True/False if there are other outstanding"},{"line_number":4538,"context_line":"        # attachments that share this connection.  If True should signify"},{"line_number":4539,"context_line":"        # caller to preserve the actual host connection (work should be"},{"line_number":4540,"context_line":"        # done in the brick connector as it has the knowledge of what\u0027s"},{"line_number":4541,"context_line":"        # going on here."},{"line_number":4542,"context_line":"        return shared_connections"},{"line_number":4543,"context_line":""},{"line_number":4544,"context_line":"    def attachment_delete(self, context, attachment_ref, vref):"},{"line_number":4545,"context_line":"        \"\"\"Delete/Detach the specified attachment."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a57fde8_34c7da13","line":4542,"range":{"start_line":4537,"start_character":7,"end_line":4542,"end_character":33},"updated":"2017-01-12 20:14:00.000000000","message":"Couple of things with this behavior. Can you update the driver.py base class (or one of the like 50) to explain the new ideal behavior for terminate_connection and/or the like driver devref doc?\n\nI think too that we might have a conflict with the FC drivers where they are currently required to return the initiator maps so that the FCZM decorators on terminate connection can cleanup the zoning config. Totally something we can fix, but maybe worth thinking about path of least resistance. If we add a new driver method that just defaults to return false (as an example) does that mean less work than re-working the FCZM code in all the FC drivers, and cleaning up any other misbehaving drivers that return something from terminate_connection? If we do leave this we maybe just need to stop using the decorators and just call helper methods directly on the fczm (not so bad), but would be a bunch of code churn and probably introduce regressions to at least someone.\n\nLast thing and I\u0027ll be quiet... whats the ordering we expect to see from a higher level? Would someone like Nova want to call delete on the attachment, and then use os-brick to cleanup the initiator? Right now thats switched where we do os-brick and then terminate_connection, which is a little bit more graceful (we won\u0027t rip out iscsi targets before logging out of sessions, as an example). I think it works just fine, but I do have some concern that folks might complain about warnings/errors in the syslog from that. Not looking to change anything, just wanted to make sure I\u0027m on the same page so I can think about how to try and handle that situation.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":4534,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":4535,"context_line":"        LOG.info(_LI(\"Terminate volume connection completed successfully.\"),"},{"line_number":4536,"context_line":"                 resource\u003dvolume)"},{"line_number":4537,"context_line":"        # NOTE(jdg): Return True/False if there are other outstanding"},{"line_number":4538,"context_line":"        # attachments that share this connection.  If True should signify"},{"line_number":4539,"context_line":"        # caller to preserve the actual host connection (work should be"},{"line_number":4540,"context_line":"        # done in the brick connector as it has the knowledge of what\u0027s"},{"line_number":4541,"context_line":"        # going on here."},{"line_number":4542,"context_line":"        return shared_connections"},{"line_number":4543,"context_line":""},{"line_number":4544,"context_line":"    def attachment_delete(self, context, attachment_ref, vref):"},{"line_number":4545,"context_line":"        \"\"\"Delete/Detach the specified attachment."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_18022a70","line":4542,"range":{"start_line":4537,"start_character":7,"end_line":4542,"end_character":33},"in_reply_to":"7a3c09a3_31b3e6ea","updated":"2017-01-18 20:31:05.000000000","message":"I\u0027m still not too worried about this; the bottom line is even if you are returning something here, we ignore it in the current code and always have, so it\u0027s just something for interaction between FCZM and FC drivers.  I\u0027ll look at our note from discussion and get something \"better\" implemented as well as documenting it.\n\nTurns out the whole \"shared connection info back to Nova\" thing has in fact been a bit of a red-herring I think.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"61a811260ad91538c678c39f053f9092ab75a40c","unresolved":false,"context_lines":[{"line_number":4534,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":4535,"context_line":"        LOG.info(_LI(\"Terminate volume connection completed successfully.\"),"},{"line_number":4536,"context_line":"                 resource\u003dvolume)"},{"line_number":4537,"context_line":"        # NOTE(jdg): Return True/False if there are other outstanding"},{"line_number":4538,"context_line":"        # attachments that share this connection.  If True should signify"},{"line_number":4539,"context_line":"        # caller to preserve the actual host connection (work should be"},{"line_number":4540,"context_line":"        # done in the brick connector as it has the knowledge of what\u0027s"},{"line_number":4541,"context_line":"        # going on here."},{"line_number":4542,"context_line":"        return shared_connections"},{"line_number":4543,"context_line":""},{"line_number":4544,"context_line":"    def attachment_delete(self, context, attachment_ref, vref):"},{"line_number":4545,"context_line":"        \"\"\"Delete/Detach the specified attachment."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_31b3e6ea","line":4542,"range":{"start_line":4537,"start_character":7,"end_line":4542,"end_character":33},"in_reply_to":"9a57fde8_34c7da13","updated":"2017-01-17 13:01:07.000000000","message":"Further discussions on the above:\nhttp://eavesdrop.openstack.org/meetings/cinder_nova_api_changes/2017/cinder_nova_api_changes.2017-01-16-17.00.log.html\nhttp://eavesdrop.openstack.org/irclogs/%23openstack-cinder/%23openstack-cinder.2017-01-17.log.html","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":4517,"context_line":"        self._notify_about_volume_usage(context, vref, \"attach.end\")"},{"line_number":4518,"context_line":"        LOG.info(_LI(\"Attach volume completed successfully.\"),"},{"line_number":4519,"context_line":"                 resource\u003dvref)"},{"line_number":4520,"context_line":"        attachment_ref \u003d objects.VolumeAttachment.get_by_id(context,"},{"line_number":4521,"context_line":"                                                            attachment_id)"},{"line_number":4522,"context_line":"        return connection_info"},{"line_number":4523,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5a3905b3_930a52d1","line":4520,"range":{"start_line":4520,"start_character":8,"end_line":4520,"end_character":22},"updated":"2017-01-19 20:00:05.000000000","message":"It looks like it\u0027s not needed here anymore.","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"854e49cce62a3e18f662b9af2023bf9b8ac34795","unresolved":false,"context_lines":[{"line_number":4517,"context_line":"        self._notify_about_volume_usage(context, vref, \"attach.end\")"},{"line_number":4518,"context_line":"        LOG.info(_LI(\"Attach volume completed successfully.\"),"},{"line_number":4519,"context_line":"                 resource\u003dvref)"},{"line_number":4520,"context_line":"        attachment_ref \u003d objects.VolumeAttachment.get_by_id(context,"},{"line_number":4521,"context_line":"                                                            attachment_id)"},{"line_number":4522,"context_line":"        return connection_info"},{"line_number":4523,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_b4b65488","line":4520,"range":{"start_line":4520,"start_character":8,"end_line":4520,"end_character":22},"updated":"2017-01-19 22:23:06.000000000","message":"This can be removed.","commit_id":"41864d9b3be193c7207cb085f22e0d08f9fec7f7"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"854e49cce62a3e18f662b9af2023bf9b8ac34795","unresolved":false,"context_lines":[{"line_number":4574,"context_line":"        else:"},{"line_number":4575,"context_line":"            has_shared_connection \u003d ("},{"line_number":4576,"context_line":"                self._do_attachment_delete(context, vref, attachment_ref))"},{"line_number":4577,"context_line":"        return has_shared_connection"},{"line_number":4578,"context_line":""},{"line_number":4579,"context_line":"    def _do_attachment_delete(self, context, vref, attachment):"},{"line_number":4580,"context_line":"        utils.require_driver_initialized(self.driver)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_c1cf9bae","line":4577,"range":{"start_line":4577,"start_character":15,"end_line":4577,"end_character":36},"updated":"2017-01-19 22:23:06.000000000","message":"It\u0027s currently getting dropped in volume/api.py.","commit_id":"41864d9b3be193c7207cb085f22e0d08f9fec7f7"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":393,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attachment_details(self, ctxt, attachment, vref):"},{"line_number":396,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":397,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":398,"context_line":"        return cctxt.call(ctxt,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_f124cd0d","line":395,"range":{"start_line":395,"start_character":8,"end_line":395,"end_character":26},"updated":"2017-01-06 18:19:00.000000000","message":"It does not seem to be used. What is this supposed to be for?","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"11543a839f5983f70a9fa66098cec0f03ecca29a","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":393,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attachment_details(self, ctxt, attachment, vref):"},{"line_number":396,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":397,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":398,"context_line":"        return cctxt.call(ctxt,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_afdace14","line":395,"range":{"start_line":395,"start_character":8,"end_line":395,"end_character":26},"in_reply_to":"ba5201f7_94db687b","updated":"2017-01-07 20:25:33.000000000","message":":)","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":393,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attachment_details(self, ctxt, attachment, vref):"},{"line_number":396,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":397,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":398,"context_line":"        return cctxt.call(ctxt,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_94db687b","line":395,"range":{"start_line":395,"start_character":8,"end_line":395,"end_character":26},"in_reply_to":"ba5201f7_f124cd0d","updated":"2017-01-07 15:36:35.000000000","message":"Well... I don\u0027t know :)\n\nIt was intended to be a way to query the driver for \"detailed\" info if needed, but we don\u0027t need it first pass I don\u0027t think (if at all) so I\u0027ll remove it.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":404,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":405,"context_line":"        return cctxt.call(ctxt,"},{"line_number":406,"context_line":"                          \u0027attachment_create\u0027,"},{"line_number":407,"context_line":"                          vref\u003dvref,"},{"line_number":408,"context_line":"                          connector\u003dconnector,"},{"line_number":409,"context_line":"                          attachment_ref\u003dattachment_ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_31bf35ab","line":406,"range":{"start_line":406,"start_character":38,"end_line":406,"end_character":44},"updated":"2017-01-06 18:19:00.000000000","message":"s/create/update/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":404,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":405,"context_line":"        return cctxt.call(ctxt,"},{"line_number":406,"context_line":"                          \u0027attachment_create\u0027,"},{"line_number":407,"context_line":"                          vref\u003dvref,"},{"line_number":408,"context_line":"                          connector\u003dconnector,"},{"line_number":409,"context_line":"                          attachment_ref\u003dattachment_ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_b4bdcc03","line":406,"range":{"start_line":406,"start_character":38,"end_line":406,"end_character":44},"in_reply_to":"ba5201f7_31bf35ab","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"996f5a2d4fa942a5ebaf7907280c2d05adf92476","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":393,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attachment_update(self, ctxt, vref, connector, attachment_ref):"},{"line_number":396,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":397,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":398,"context_line":"        return cctxt.call(ctxt,"},{"line_number":399,"context_line":"                          \u0027attachment_update\u0027,"},{"line_number":400,"context_line":"                          vref\u003dvref,"},{"line_number":401,"context_line":"                          connector\u003dconnector,"},{"line_number":402,"context_line":"                          attachment_ref\u003dattachment_ref)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def attachment_delete(self, ctxt, attachment, vref):"},{"line_number":405,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":406,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":407,"context_line":"        return cctxt.call(ctxt,"},{"line_number":408,"context_line":"                          \u0027attachment_delete\u0027,"},{"line_number":409,"context_line":"                          attachment_ref\u003dattachment,"},{"line_number":410,"context_line":"                          vref\u003dvref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_cbef5185","line":410,"range":{"start_line":395,"start_character":0,"end_line":410,"end_character":36},"updated":"2017-01-17 12:46:47.000000000","message":"You should make sure these won\u0027t be sent in case we\u0027re pinned before 3.7 (actually it will be 3.8 - merge conflict). See how it\u0027s done here [1]. Basically these calls should fail on API level if self.client.can_send_version(\u00273.7\u0027) will return False.\n\n[1] https://github.com/openstack/cinder/blob/efa8e210c92eacba2f0d064646c2a467ec1e88dc/cinder/scheduler/rpcapi.py#L204-L216","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7aaec80160374c0d5e92f7cdad90d31a1f6303b8","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":393,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attachment_update(self, ctxt, vref, connector, attachment_ref):"},{"line_number":396,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":397,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":398,"context_line":"        return cctxt.call(ctxt,"},{"line_number":399,"context_line":"                          \u0027attachment_update\u0027,"},{"line_number":400,"context_line":"                          vref\u003dvref,"},{"line_number":401,"context_line":"                          connector\u003dconnector,"},{"line_number":402,"context_line":"                          attachment_ref\u003dattachment_ref)"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    def attachment_delete(self, ctxt, attachment, vref):"},{"line_number":405,"context_line":"        version \u003d self._compat_ver(\u00273.7\u0027)"},{"line_number":406,"context_line":"        cctxt \u003d self._get_cctxt(vref.host, version\u003dversion)"},{"line_number":407,"context_line":"        return cctxt.call(ctxt,"},{"line_number":408,"context_line":"                          \u0027attachment_delete\u0027,"},{"line_number":409,"context_line":"                          attachment_ref\u003dattachment,"},{"line_number":410,"context_line":"                          vref\u003dvref)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a3c09a3_b8167656","line":410,"range":{"start_line":395,"start_character":0,"end_line":410,"end_character":36},"in_reply_to":"7a3c09a3_cbef5185","updated":"2017-01-18 20:31:05.000000000","message":"We should probably make a decorator or something for this at some point rather than duplicate it everywhere.","commit_id":"6a46ba7584a26e09a1a63be65900a7eb26b75821"}],"doc/source/devref/attach_detach_conventions_v2.rst":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_11e5d1a6","line":36,"range":{"start_line":36,"start_character":28,"end_line":36,"end_character":30},"updated":"2017-01-06 18:19:00.000000000","message":"Remove this \u0027it\u0027?","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_114eb1c0","line":36,"range":{"start_line":36,"start_character":66,"end_line":36,"end_character":68},"updated":"2017-01-06 18:19:00.000000000","message":"V3?","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_f46034a7","line":36,"range":{"start_line":36,"start_character":66,"end_line":36,"end_character":68},"in_reply_to":"ba5201f7_114eb1c0","updated":"2017-01-07 15:36:35.000000000","message":"I suppose the API version vs the version of attach impl is confusing, I\u0027ll fix the wording up.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_1464d8b6","line":36,"range":{"start_line":36,"start_character":28,"end_line":36,"end_character":30},"in_reply_to":"ba5201f7_11e5d1a6","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"11543a839f5983f70a9fa66098cec0f03ecca29a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_ef069684","line":36,"range":{"start_line":36,"start_character":66,"end_line":36,"end_character":68},"in_reply_to":"ba5201f7_f46034a7","updated":"2017-01-07 20:25:33.000000000","message":"Ah right, I missed that, thanks for the heads up. :)","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"```"},{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_b1ea4572","line":48,"range":{"start_line":48,"start_character":11,"end_line":48,"end_character":18},"updated":"2017-01-06 18:19:00.000000000","message":"s/reserve/create/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"```"},{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_74752462","line":48,"range":{"start_line":48,"start_character":11,"end_line":48,"end_character":18},"in_reply_to":"ba5201f7_b1ea4572","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"},{"line_number":52,"context_line":"specified Volume with an optional Instance UUID field set.  This is"},{"line_number":53,"context_line":"particularly useful for cases like Nova Boot from Volume where Nova hasn\u0027t sent"},{"line_number":54,"context_line":"the job to the actual Compute host yet, but needs to make initial preparations"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_f1004d36","line":51,"range":{"start_line":51,"start_character":15,"end_line":51,"end_character":22},"updated":"2017-01-06 18:19:00.000000000","message":"s/reserve/create/","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"},{"line_number":52,"context_line":"specified Volume with an optional Instance UUID field set.  This is"},{"line_number":53,"context_line":"particularly useful for cases like Nova Boot from Volume where Nova hasn\u0027t sent"},{"line_number":54,"context_line":"the job to the actual Compute host yet, but needs to make initial preparations"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_9470c873","line":51,"range":{"start_line":51,"start_character":15,"end_line":51,"end_character":22},"in_reply_to":"ba5201f7_f1004d36","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":64,"context_line":"monitor that status changes themeselves."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"The attachment_create call can be used in one of two ways:"},{"line_number":67,"context_line":"1. Complete the Attach process on an Attachment object from an"},{"line_number":68,"context_line":"   attachment_reserve call.  In this case the attachment_create call requires"},{"line_number":69,"context_line":"   a valid AttachmentID to update.  The VolumeID is stored in the Attachment"},{"line_number":70,"context_line":"   record from the earlier reserve and is used to direct the call to the proper"},{"line_number":71,"context_line":"   backend and make the needed connection object."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"2. Create and Complete the Attachment process in one call.  The Reserve process"},{"line_number":74,"context_line":"   is only needed in certain cases, in many cases Nova actually has enough"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_b16fa5fa","line":71,"range":{"start_line":67,"start_character":0,"end_line":71,"end_character":49},"updated":"2017-01-06 18:19:00.000000000","message":"This is attachment_update now.","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":64,"context_line":"monitor that status changes themeselves."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"The attachment_create call can be used in one of two ways:"},{"line_number":67,"context_line":"1. Complete the Attach process on an Attachment object from an"},{"line_number":68,"context_line":"   attachment_reserve call.  In this case the attachment_create call requires"},{"line_number":69,"context_line":"   a valid AttachmentID to update.  The VolumeID is stored in the Attachment"},{"line_number":70,"context_line":"   record from the earlier reserve and is used to direct the call to the proper"},{"line_number":71,"context_line":"   backend and make the needed connection object."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"2. Create and Complete the Attachment process in one call.  The Reserve process"},{"line_number":74,"context_line":"   is only needed in certain cases, in many cases Nova actually has enough"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_54df4039","line":71,"range":{"start_line":67,"start_character":0,"end_line":71,"end_character":49},"in_reply_to":"ba5201f7_b16fa5fa","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2516b01c56c52dc65e15d63eee4fffb08e842ec","unresolved":false,"context_lines":[{"line_number":85,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"```"},{"line_number":88,"context_line":"cinder --os-volume-api-version 3 attachment-reserve --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":89,"context_line":"```"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_317c95b4","line":88,"range":{"start_line":88,"start_character":44,"end_line":88,"end_character":51},"updated":"2017-01-06 18:19:00.000000000","message":"create","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b69fe0da52e94cc3950259219f56076fc3314add","unresolved":false,"context_lines":[{"line_number":85,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"```"},{"line_number":88,"context_line":"cinder --os-volume-api-version 3 attachment-reserve --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":89,"context_line":"```"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_74ea84dc","line":88,"range":{"start_line":88,"start_character":44,"end_line":88,"end_character":51},"in_reply_to":"ba5201f7_317c95b4","updated":"2017-01-07 15:36:35.000000000","message":"Done","commit_id":"6df66a0120e4957b98f57b885bac5504ba74747f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"implementation (V3 API) flow we\u0027ll use the Attachment Table (object) as"},{"line_number":38,"context_line":"the primary handle for managing attachemnt(s) for a volume."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"In addition, we also introduce the AttachmentSpecs Table which will store the"},{"line_number":41,"context_line":"connector information for an Attachment so we no longer have the problem of"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_2fbd6568","line":38,"range":{"start_line":38,"start_character":32,"end_line":38,"end_character":42},"updated":"2017-01-11 16:00:58.000000000","message":"s/attachemnt/attachment/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"implementation (V3 API) flow we\u0027ll use the Attachment Table (object) as"},{"line_number":38,"context_line":"the primary handle for managing attachemnt(s) for a volume."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"In addition, we also introduce the AttachmentSpecs Table which will store the"},{"line_number":41,"context_line":"connector information for an Attachment so we no longer have the problem of"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_75a2d0af","line":38,"range":{"start_line":38,"start_character":32,"end_line":38,"end_character":42},"in_reply_to":"ba5201f7_2fbd6568","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":68,"context_line":"2. Create and Complete the Attachment process in one call.  The Reserve process"},{"line_number":69,"context_line":"   is only needed in certain cases, in many cases Nova actually has enough"},{"line_number":70,"context_line":"   information to do everything in a single call.  Also, non-nova consumers"},{"line_number":71,"context_line":"   typically don\u0027t require the granularity of a seperate reserve at all."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_8f3d71df","line":71,"range":{"start_line":71,"start_character":48,"end_line":71,"end_character":56},"updated":"2017-01-11 16:00:58.000000000","message":"s/seperate/separate/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"2. Create and Complete the Attachment process in one call.  The Reserve process"},{"line_number":69,"context_line":"   is only needed in certain cases, in many cases Nova actually has enough"},{"line_number":70,"context_line":"   information to do everything in a single call.  Also, non-nova consumers"},{"line_number":71,"context_line":"   typically don\u0027t require the granularity of a seperate reserve at all."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_958e542c","line":71,"range":{"start_line":71,"start_character":48,"end_line":71,"end_character":56},"in_reply_to":"ba5201f7_8f3d71df","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   typically don\u0027t require the granularity of a seperate reserve at all."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"},{"line_number":75,"context_line":"   initialize the connection in the single rquest."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_2f19e588","line":74,"range":{"start_line":74,"start_character":50,"end_line":74,"end_character":56},"updated":"2017-01-11 16:00:58.000000000","message":"s/peform/perform/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   typically don\u0027t require the granularity of a seperate reserve at all."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"},{"line_number":75,"context_line":"   initialize the connection in the single rquest."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_b57fd815","line":74,"range":{"start_line":74,"start_character":50,"end_line":74,"end_character":56},"in_reply_to":"ba5201f7_2f19e588","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"},{"line_number":75,"context_line":"   initialize the connection in the single rquest."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_4f1e2971","line":75,"range":{"start_line":75,"start_character":43,"end_line":75,"end_character":49},"updated":"2017-01-11 16:00:58.000000000","message":"s/rquest/request/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   To perform the complete operation, include the connector data in the"},{"line_number":74,"context_line":"   attachment_create call and the Cinder API will peform the reserve and"},{"line_number":75,"context_line":"   initialize the connection in the single rquest."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_d5845c0c","line":75,"range":{"start_line":75,"start_character":43,"end_line":75,"end_character":49},"in_reply_to":"ba5201f7_4f1e2971","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_3a2761b7","line":104,"range":{"start_line":104,"start_character":31,"end_line":104,"end_character":32},"updated":"2017-01-11 16:00:58.000000000","message":"s/3/3.23/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_157b4429","line":104,"range":{"start_line":104,"start_character":31,"end_line":104,"end_character":32},"in_reply_to":"ba5201f7_3a2761b7","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"s-volume-api-version 3 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_fa48795e","line":133,"range":{"start_line":133,"start_character":0,"end_line":133,"end_character":1},"updated":"2017-01-11 16:00:58.000000000","message":"cinder --o","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f52b4a56e006646af5dc79265cb658bea180bdae","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"s-volume-api-version 3 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_1a2ffd88","line":133,"range":{"start_line":133,"start_character":21,"end_line":133,"end_character":22},"updated":"2017-01-11 16:00:58.000000000","message":"s/3/3.23/","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"s-volume-api-version 3 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_f5f96081","line":133,"range":{"start_line":133,"start_character":21,"end_line":133,"end_character":22},"in_reply_to":"ba5201f7_1a2ffd88","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b18b5bd5cbc9afa3d4397615f48e2c95ef9176c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"s-volume-api-version 3 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba5201f7_752c9002","line":133,"range":{"start_line":133,"start_character":0,"end_line":133,"end_character":1},"in_reply_to":"ba5201f7_fa48795e","updated":"2017-01-11 19:42:31.000000000","message":"Done","commit_id":"a9f4357c234a992d62818d5b6497f12310396d7b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":81,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"cinder --os-volume-api-version 3.23 attachment-create --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":85,"context_line":"```"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":17,"id":"5a3905b3_f3955640","line":84,"range":{"start_line":84,"start_character":33,"end_line":84,"end_character":35},"updated":"2017-01-19 20:00:05.000000000","message":"s/23/26/","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3.23 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":17,"id":"5a3905b3_1393c25c","line":104,"range":{"start_line":104,"start_character":33,"end_line":104,"end_character":35},"updated":"2017-01-19 20:00:05.000000000","message":"Same as above.","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fd058bc0b1d1b855eb9c948f7d0da16b31d51175","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"cinder --os-volume-api-version 3.23 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"5a3905b3_539d4a64","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":35},"updated":"2017-01-19 20:00:05.000000000","message":"Same as above.","commit_id":"7310a2a9f64c83bc288b07c7fb4842a417cba744"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"854e49cce62a3e18f662b9af2023bf9b8ac34795","unresolved":false,"context_lines":[{"line_number":81,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"cinder --os-volume-api-version 3.23 attachment-create --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":85,"context_line":"```"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a3905b3_f4029c3d","line":84,"range":{"start_line":84,"start_character":33,"end_line":84,"end_character":35},"updated":"2017-01-19 22:23:06.000000000","message":"s/23/26/","commit_id":"41864d9b3be193c7207cb085f22e0d08f9fec7f7"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"854e49cce62a3e18f662b9af2023bf9b8ac34795","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3.23 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a3905b3_34e6e4b4","line":104,"range":{"start_line":104,"start_character":33,"end_line":104,"end_character":35},"updated":"2017-01-19 22:23:06.000000000","message":"s/23/26/","commit_id":"41864d9b3be193c7207cb085f22e0d08f9fec7f7"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"854e49cce62a3e18f662b9af2023bf9b8ac34795","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"cinder --os-volume-api-version 3.23 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a3905b3_b4e8147e","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":35},"updated":"2017-01-19 22:23:06.000000000","message":"s/23/26/","commit_id":"41864d9b3be193c7207cb085f22e0d08f9fec7f7"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c657ea001a43ffb262b9a0b3e8499e32b96c166f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"cinder --os-volume-api-version 3.26 attachment-create --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":85,"context_line":"```"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_1592939e","line":84,"range":{"start_line":84,"start_character":33,"end_line":84,"end_character":35},"updated":"2017-01-20 16:11:35.000000000","message":"Not sure about the best strategy on commenting here, maybe I should only say it\u0027s out of sync and at the time of adding this comment it should be 27. :)","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"d4aaec686de246435ec0f347361de0a93ceca782","unresolved":false,"context_lines":[{"line_number":81,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"cinder --os-volume-api-version 3.26 attachment-create --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"},{"line_number":85,"context_line":"```"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"param volume_id: The ID of the volume to create attachment for."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_35730f4f","line":84,"range":{"start_line":84,"start_character":33,"end_line":84,"end_character":35},"in_reply_to":"5a3905b3_1592939e","updated":"2017-01-20 16:17:30.000000000","message":"Done","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c657ea001a43ffb262b9a0b3e8499e32b96c166f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3.26 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_55ea5b10","line":104,"range":{"start_line":104,"start_character":33,"end_line":104,"end_character":35},"updated":"2017-01-20 16:11:35.000000000","message":"Same as above.","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"d4aaec686de246435ec0f347361de0a93ceca782","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     \u0027multipath\u0027: False}"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"```"},{"line_number":104,"context_line":"cinder --os-volume-api-version 3.26 attachment-create --initiator iqn.1993-08.org.debian:01:29353d53fa41 --ip 1.1.1.1 --host blah --instance \u003cinstance-id\u003e \u003cvolume-id\u003e"},{"line_number":105,"context_line":"```"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Returns a dictionary including the connector and attachment_id:"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_d57d6b1d","line":104,"range":{"start_line":104,"start_character":33,"end_line":104,"end_character":35},"in_reply_to":"5a3905b3_55ea5b10","updated":"2017-01-20 16:17:30.000000000","message":"Done","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c657ea001a43ffb262b9a0b3e8499e32b96c166f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"cinder --os-volume-api-version 3.26 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_b5f7fff3","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":35},"updated":"2017-01-20 16:11:35.000000000","message":"Same as above.","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"d4aaec686de246435ec0f347361de0a93ceca782","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"```"},{"line_number":133,"context_line":"cinder --os-volume-api-version 3.26 attachment-delete 6ab061ad-5c45-48f3-ad9c-bbd3b6275bf2"},{"line_number":134,"context_line":"```"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_f578a72d","line":133,"range":{"start_line":133,"start_character":33,"end_line":133,"end_character":35},"in_reply_to":"5a3905b3_b5f7fff3","updated":"2017-01-20 16:17:30.000000000","message":"Done","commit_id":"43469df74122e7a31d5f56a2137a47e330d5636f"}]}
