)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     esberglu \u003cesberglu@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-12-08 02:05:48 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: PowerVM Driver: vSCSI"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"df87a7cf_dbf922c8","line":7,"range":{"start_line":7,"start_character":5,"end_line":7,"end_character":26},"updated":"2017-12-08 16:35:30.000000000","message":"When this gets fleshed out, the title (and body) needs to make it clear that this is the vSCSI *volume* driver.  As opposed to ephemeral.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"9d23903995406da3680b79186d169e044aedec56","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change add vSCSI cinder volume support for the PowerVM virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially-Implements: blueprint powervm-nova-it-compute-driver"},{"line_number":13,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"3fa0c359_1974ee98","line":12,"range":{"start_line":12,"start_character":32,"end_line":12,"end_character":62},"updated":"2018-02-16 14:04:58.000000000","message":"need to update this for Rocky: powervm-virt-rocky","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"c2c974362f0e53e4565f8257b5531e59e1473dd3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change add vSCSI cinder volume support for the PowerVM virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially-Implements: blueprint powervm-nova-it-compute-driver"},{"line_number":13,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"3fa0c359_9d384ad3","line":12,"range":{"start_line":12,"start_character":32,"end_line":12,"end_character":62},"in_reply_to":"3fa0c359_1974ee98","updated":"2018-02-23 18:24:41.000000000","message":"Done","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"PowerVM Driver: vSCSI volume driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change add vSCSI cinder volume support for the PowerVM virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Blueprint: powervm-vscsi"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"9f6a8fd7_9cd2d7ff","line":9,"updated":"2018-04-20 15:24:55.000000000","message":"and FibreChannel? Or is that implied / lumped together here?\n\nBased on the feature support matrix changes, this commit message could be more detailed, i.e. with this change, you support attach/detach of volumes and also apparently extending the size of attached volumes. Do you also support boot from volume now with this change?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"72b7aabc6f0ee8a25db215d889d44601560c0c63","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"PowerVM Driver: vSCSI volume driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change add vSCSI cinder volume support for the PowerVM virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Blueprint: powervm-vscsi"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":45,"id":"9f6a8fd7_67105058","line":9,"in_reply_to":"9f6a8fd7_9cd2d7ff","updated":"2018-04-24 15:45:59.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2a843e2f5609bdd34a68a68c00df827563e9c00c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change adds vSCSI Fibre Channel volume support via cinder for the"},{"line_number":10,"context_line":"PowerVM virt driver. Attach, detach, and extend are the supported"},{"line_number":11,"context_line":"volume operations by the PowerVM vSCSI FC adapter."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Blueprint: powervm-vscsi"},{"line_number":14,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"9f6a8fd7_600fba87","line":12,"updated":"2018-04-25 18:27:15.000000000","message":"\u003e 10:44 thorst: we don\u0027t have a SSP cinder driver.  We have a storwize one, but we don\u0027t have a good cleanup mechanism for failed CI jobs and our v7k would eventually die (and also they can\u0027t handle 100 servers SSH\u0027ing to it at the same time)\n\nThat information about the lack of CI should be in the commit message.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0606cf15c61f2dc5fa654b3134402915dff66142","unresolved":false,"context_lines":[{"line_number":10,"context_line":"PowerVM virt driver. Attach, detach, and extend are the supported"},{"line_number":11,"context_line":"volume operations by the PowerVM vSCSI FC adapter. PowerVM CI volume"},{"line_number":12,"context_line":"tests are run on-demand only which can be done by leaving a comment"},{"line_number":13,"context_line":"with \"powervm:volume-check\"."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Blueprint: powervm-vscsi"},{"line_number":16,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":48,"id":"5f7c97a3_d38319ca","line":13,"updated":"2018-05-31 18:57:20.000000000","message":"I\u0027ll totally forget about this if it\u0027s not in the wiki for the 3rd party CI, so let\u0027s also add it there:\n\nhttps://wiki.openstack.org/wiki/ThirdPartySystems/IBM_PowerVM_CI","commit_id":"e997ca68b38347b7ded34d1b6d77b9cbd4608438"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"90ac3e5e68d782f51a8e92793629decf5e2a63dc","unresolved":false,"context_lines":[{"line_number":10,"context_line":"PowerVM virt driver. Attach, detach, and extend are the supported"},{"line_number":11,"context_line":"volume operations by the PowerVM vSCSI FC adapter. PowerVM CI volume"},{"line_number":12,"context_line":"tests are run on-demand only which can be done by leaving a comment"},{"line_number":13,"context_line":"with \"powervm:volume-check\"."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Blueprint: powervm-vscsi"},{"line_number":16,"context_line":"Change-Id: I632993abe70f9f98a032a35891b690db15ded6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":48,"id":"5f7c97a3_73b32599","line":13,"in_reply_to":"5f7c97a3_d38319ca","updated":"2018-05-31 19:06:26.000000000","message":"Done","commit_id":"e997ca68b38347b7ded34d1b6d77b9cbd4608438"}],"doc/source/user/feature-matrix-gp.ini":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":200,"context_line":"driver-notes-vmware\u003dThis is not tested in a CI system, but it is implemented."},{"line_number":201,"context_line":"hyperv\u003dcomplete:n"},{"line_number":202,"context_line":"ironic\u003dmissing"},{"line_number":203,"context_line":"powervm\u003dmissing"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"[operation.server-neutron]"},{"line_number":206,"context_line":"title\u003dCustom neutron configurations on boot"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_3c0dcba0","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":15},"updated":"2018-04-20 15:24:55.000000000","message":"Do you also support boot from volume now?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":200,"context_line":"driver-notes-vmware\u003dThis is not tested in a CI system, but it is implemented."},{"line_number":201,"context_line":"hyperv\u003dcomplete:n"},{"line_number":202,"context_line":"ironic\u003dmissing"},{"line_number":203,"context_line":"powervm\u003dmissing"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"[operation.server-neutron]"},{"line_number":206,"context_line":"title\u003dCustom neutron configurations on boot"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_1bf8ed46","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":15},"in_reply_to":"9f6a8fd7_3c0dcba0","updated":"2018-04-23 21:30:24.000000000","message":"Boot from volume is not yet supported. There is some work needed both here and in the out-of-tree driver to do so.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"484b225eb8e8e07f0a17d297427390724a88551e","unresolved":false,"context_lines":[{"line_number":177,"context_line":"hyperv\u003dcomplete"},{"line_number":178,"context_line":"ironic\u003dmissing"},{"line_number":179,"context_line":"powervm\u003dcomplete"},{"line_number":180,"context_line":"driver-notes-powervm\u003dThis is not tested in a CI system, but it is implemented."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"[operation.server-bdm]"},{"line_number":183,"context_line":"title\u003dCustom disk configurations on boot"}],"source_content_type":"text/x-properties","patch_set":47,"id":"5f7c97a3_eda6f2ab","line":180,"updated":"2018-05-22 14:04:47.000000000","message":"when this is tested in CI, this needs to be updated. Maybe something like\n\n  This is not tested for every CI run. Add a \"powervm:volume-check\" comment to trigger a CI job running volume tests.","commit_id":"4210aa2b0745401da7fb696ca26d781a20c894a5"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":177,"context_line":"hyperv\u003dcomplete"},{"line_number":178,"context_line":"ironic\u003dmissing"},{"line_number":179,"context_line":"powervm\u003dcomplete"},{"line_number":180,"context_line":"driver-notes-powervm\u003dThis is not tested in a CI system, but it is implemented."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"[operation.server-bdm]"},{"line_number":183,"context_line":"title\u003dCustom disk configurations on boot"}],"source_content_type":"text/x-properties","patch_set":47,"id":"5f7c97a3_e31b63c7","line":180,"in_reply_to":"5f7c97a3_eda6f2ab","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"4210aa2b0745401da7fb696ca26d781a20c894a5"}],"doc/source/user/support-matrix.ini":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":179,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":180,"context_line":"driver-impl-libvirt-vz-vm\u003dunknown"},{"line_number":181,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":182,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"[operation.attach-interface]"},{"line_number":185,"context_line":"title\u003dAttach virtual network interface to instance"}],"source_content_type":"text/x-properties","patch_set":38,"id":"df7087c5_01eeb2b3","line":182,"range":{"start_line":182,"start_character":20,"end_line":182,"end_character":27},"updated":"2018-03-20 13:55:58.000000000","message":"complete","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":179,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":180,"context_line":"driver-impl-libvirt-vz-vm\u003dunknown"},{"line_number":181,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":182,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"[operation.attach-interface]"},{"line_number":185,"context_line":"title\u003dAttach virtual network interface to instance"}],"source_content_type":"text/x-properties","patch_set":38,"id":"df7087c5_c083cb55","line":182,"range":{"start_line":182,"start_character":20,"end_line":182,"end_character":27},"in_reply_to":"df7087c5_01eeb2b3","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1159,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1160,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1161,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"[storage.block.backend.iscsi.auth.chap]"},{"line_number":1164,"context_line":"title\u003dCHAP authentication for iSCSI"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_bca1db96","line":1161,"range":{"start_line":1161,"start_character":20,"end_line":1161,"end_character":27},"updated":"2018-04-20 15:24:55.000000000","message":"This kind of surprises me.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5651c0019ffb1a99a3b96ad88cbdac33128f87d","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1159,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1160,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1161,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"[storage.block.backend.iscsi.auth.chap]"},{"line_number":1164,"context_line":"title\u003dCHAP authentication for iSCSI"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_216b3fb7","line":1161,"range":{"start_line":1161,"start_character":20,"end_line":1161,"end_character":27},"in_reply_to":"9f6a8fd7_243d92c3","updated":"2018-04-23 16:45:07.000000000","message":"Can we then change \"vSCSI\" in the commit message title to \"vSCSI Fibre Channel\" for clarity?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1159,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1160,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1161,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"[storage.block.backend.iscsi.auth.chap]"},{"line_number":1164,"context_line":"title\u003dCHAP authentication for iSCSI"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_243d92c3","line":1161,"range":{"start_line":1161,"start_character":20,"end_line":1161,"end_character":27},"in_reply_to":"9f6a8fd7_bca1db96","updated":"2018-04-23 15:50:38.000000000","message":"Fibre Channel is very, very much more popular than iSCSI for Power systems, so we accordingly prioritized vSCSI Fibre Channel (this commit) first. We do have iSCSI support in the out-of-tree (openstack/nova-powervm) driver and intend to port that into nova in the future.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1159,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1160,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1161,"context_line":"driver-impl-powervm\u003dmissing"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"[storage.block.backend.iscsi.auth.chap]"},{"line_number":1164,"context_line":"title\u003dCHAP authentication for iSCSI"}],"source_content_type":"text/x-properties","patch_set":45,"id":"9f6a8fd7_3bb3719a","line":1161,"range":{"start_line":1161,"start_character":20,"end_line":1161,"end_character":27},"in_reply_to":"9f6a8fd7_bca1db96","updated":"2018-04-23 21:30:24.000000000","message":"iSCSI requires another volume adapter\n\nhttps://github.com/openstack/nova-powervm/blob/master/nova_powervm/virt/powervm/volume/iscsi.py","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":111,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":112,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":113,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":114,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"[operation.attach-tagged-volume]"},{"line_number":117,"context_line":"title\u003dAttach tagged block device to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"9f6a8fd7_809d2ebd","line":114,"updated":"2018-04-25 18:23:57.000000000","message":"There should be a driver note that this isn\u0027t tested in a CI system.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":112,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":113,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":114,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"[operation.attach-tagged-volume]"},{"line_number":117,"context_line":"title\u003dAttach tagged block device to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"5f7c97a3_03ae9fe6","line":114,"in_reply_to":"9f6a8fd7_809d2ebd","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":152,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":153,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":154,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":155,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"[operation.extend-volume]"},{"line_number":158,"context_line":"title\u003dExtend block volume attached to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"9f6a8fd7_60a6da11","line":155,"updated":"2018-04-25 18:23:57.000000000","message":"same","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":152,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":153,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":154,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":155,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"[operation.extend-volume]"},{"line_number":158,"context_line":"title\u003dExtend block volume attached to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"5f7c97a3_c3b7473a","line":155,"in_reply_to":"9f6a8fd7_60a6da11","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":179,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":180,"context_line":"driver-impl-libvirt-vz-vm\u003dunknown"},{"line_number":181,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":182,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"[operation.attach-interface]"},{"line_number":185,"context_line":"title\u003dAttach virtual network interface to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"9f6a8fd7_00b11e47","line":182,"updated":"2018-04-25 18:23:57.000000000","message":"same","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":179,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":180,"context_line":"driver-impl-libvirt-vz-vm\u003dunknown"},{"line_number":181,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":182,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"[operation.attach-interface]"},{"line_number":185,"context_line":"title\u003dAttach virtual network interface to instance"}],"source_content_type":"text/x-properties","patch_set":46,"id":"5f7c97a3_e3b28349","line":182,"in_reply_to":"9f6a8fd7_00b11e47","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1110,"context_line":"driver-impl-libvirt-vz-vm\u003dpartial"},{"line_number":1111,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1112,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":1113,"context_line":""},{"line_number":1114,"context_line":"[storage.block.backend.fibrechannel]"},{"line_number":1115,"context_line":"title\u003dBlock storage over fibre channel"}],"source_content_type":"text/x-properties","patch_set":46,"id":"9f6a8fd7_20ac62eb","line":1112,"updated":"2018-04-25 18:23:57.000000000","message":"same","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"driver-impl-ironic\u003dcomplete"},{"line_number":1110,"context_line":"driver-impl-libvirt-vz-vm\u003dpartial"},{"line_number":1111,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1112,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":1113,"context_line":""},{"line_number":1114,"context_line":"[storage.block.backend.fibrechannel]"},{"line_number":1115,"context_line":"title\u003dBlock storage over fibre channel"}],"source_content_type":"text/x-properties","patch_set":46,"id":"5f7c97a3_a386cb64","line":1112,"in_reply_to":"9f6a8fd7_20ac62eb","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1133,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1134,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1135,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"[storage.block.backend.iscsi]"},{"line_number":1138,"context_line":"title\u003dBlock storage over iSCSI"}],"source_content_type":"text/x-properties","patch_set":46,"id":"9f6a8fd7_c0b6c63e","line":1135,"updated":"2018-04-25 18:23:57.000000000","message":"same","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1133,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1134,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1135,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"[storage.block.backend.iscsi]"},{"line_number":1138,"context_line":"title\u003dBlock storage over iSCSI"}],"source_content_type":"text/x-properties","patch_set":46,"id":"5f7c97a3_437d776c","line":1135,"in_reply_to":"9f6a8fd7_c0b6c63e","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"484b225eb8e8e07f0a17d297427390724a88551e","unresolved":false,"context_lines":[{"line_number":111,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":112,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":113,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":114,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"[operation.attach-tagged-volume]"},{"line_number":117,"context_line":"title\u003dAttach tagged block device to instance"}],"source_content_type":"text/x-properties","patch_set":47,"id":"5f7c97a3_0dcb2e53","line":114,"updated":"2018-05-22 14:04:47.000000000","message":"include same driver note from feature-matrix-gp.ini here","commit_id":"4210aa2b0745401da7fb696ca26d781a20c894a5"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":112,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":113,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":114,"context_line":"driver-impl-powervm\u003dcomplete"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"[operation.attach-tagged-volume]"},{"line_number":117,"context_line":"title\u003dAttach tagged block device to instance"}],"source_content_type":"text/x-properties","patch_set":47,"id":"5f7c97a3_a37b2bf2","line":114,"in_reply_to":"5f7c97a3_0dcb2e53","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"4210aa2b0745401da7fb696ca26d781a20c894a5"}],"nova/exception.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class VolumeDetachFailed(Invalid):"},{"line_number":254,"context_line":"    msg_fmt \u003d _(\"Volume %(volume_id)s could not be attached. \""},{"line_number":255,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5b643222","line":253,"updated":"2017-12-08 16:35:30.000000000","message":"Did we decide to call these attach/detach or connect/disconnect?  It\u0027s still inconsistent throughout this patch.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class VolumeDetachFailed(Invalid):"},{"line_number":254,"context_line":"    msg_fmt \u003d _(\"Volume %(volume_id)s could not be attached. \""},{"line_number":255,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_92792ac9","line":253,"in_reply_to":"df87a7cf_5b643222","updated":"2017-12-13 16:10:50.000000000","message":"attach/detach to be consistent with nova terminology. Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class VolumeDetachFailed(Invalid):"},{"line_number":254,"context_line":"    msg_fmt \u003d _(\"Volume %(volume_id)s could not be attached. \""},{"line_number":255,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5b2f523e","line":254,"range":{"start_line":254,"start_character":51,"end_line":254,"end_character":59},"updated":"2017-12-08 16:35:30.000000000","message":"detached","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class VolumeDetachFailed(Invalid):"},{"line_number":254,"context_line":"    msg_fmt \u003d _(\"Volume %(volume_id)s could not be attached. \""},{"line_number":255,"context_line":"                \"Reason: %(reason)s\")"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_873d73de","line":254,"range":{"start_line":254,"start_character":51,"end_line":254,"end_character":59},"in_reply_to":"df87a7cf_5b2f523e","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"}],"nova/tests/unit/virt/powervm/tasks/test_storage.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.disk_dvr.delete_disks.assert_called_once_with([\u0027result\u0027])"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test_attach_volume(self):"},{"line_number":141,"context_line":"        vol_dvr \u003d mock.Mock(connection_info\u003d{\u0027data\u0027: {\u0027volume_id\u0027: \u00271\u0027}})"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        task \u003d tf_stg.AttachVolume(vol_dvr)"},{"line_number":144,"context_line":"        task.execute()"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_167930fb","line":141,"updated":"2018-01-11 20:22:49.000000000","message":"Yeah, autospeccing wouldn\u0027t hurt here, but meh.","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # Validate args on taskflow.task.Task instantiation"},{"line_number":189,"context_line":"        with mock.patch(\u0027taskflow.task.Task.__init__\u0027) as tf:"},{"line_number":190,"context_line":"            tf_stg.AttachVolume(vol_dvr)"},{"line_number":191,"context_line":"        tf.assert_called_once_with(\u0027attach_vol_1\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_detach_volume(self):"},{"line_number":194,"context_line":"        vol_dvr \u003d mock.Mock(connection_info\u003d{\u0027data\u0027: {\u0027volume_id\u0027: \u00271\u0027}})"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_a475949a","line":191,"range":{"start_line":191,"start_character":35,"end_line":191,"end_character":49},"updated":"2018-03-20 13:55:58.000000000","message":"name\u003d","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # Validate args on taskflow.task.Task instantiation"},{"line_number":189,"context_line":"        with mock.patch(\u0027taskflow.task.Task.__init__\u0027) as tf:"},{"line_number":190,"context_line":"            tf_stg.AttachVolume(vol_dvr)"},{"line_number":191,"context_line":"        tf.assert_called_once_with(\u0027attach_vol_1\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def test_detach_volume(self):"},{"line_number":194,"context_line":"        vol_dvr \u003d mock.Mock(connection_info\u003d{\u0027data\u0027: {\u0027volume_id\u0027: \u00271\u0027}})"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_807dd36f","line":191,"range":{"start_line":191,"start_character":35,"end_line":191,"end_character":49},"in_reply_to":"df7087c5_a475949a","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # Validate args on taskflow.task.Task instantiation"},{"line_number":205,"context_line":"        with mock.patch(\u0027taskflow.task.Task.__init__\u0027) as tf:"},{"line_number":206,"context_line":"            tf_stg.DetachVolume(vol_dvr)"},{"line_number":207,"context_line":"        tf.assert_called_once_with(\u0027detach_vol_1\u0027)"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_646f7cc5","line":207,"range":{"start_line":207,"start_character":35,"end_line":207,"end_character":49},"updated":"2018-03-20 13:55:58.000000000","message":"name\u003d","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # Validate args on taskflow.task.Task instantiation"},{"line_number":205,"context_line":"        with mock.patch(\u0027taskflow.task.Task.__init__\u0027) as tf:"},{"line_number":206,"context_line":"            tf_stg.DetachVolume(vol_dvr)"},{"line_number":207,"context_line":"        tf.assert_called_once_with(\u0027detach_vol_1\u0027)"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_a0801748","line":207,"range":{"start_line":207,"start_character":35,"end_line":207,"end_character":49},"in_reply_to":"df7087c5_646f7cc5","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"}],"nova/tests/unit/virt/powervm/test_driver.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"a679a96b0770361e216214143db621e4e973d7e2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016, 2017 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_1c86b6dc","line":1,"updated":"2017-12-07 21:45:27.000000000","message":"Update the spawn and delete tests to include the vol connect/disconnect tasks","commit_id":"4dc9050a06603d0393ef8e53c88b397daa8265dc"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"8d1d96347b06181aab88d5d7e06a1539628bf9d6","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        # Invoke the method, good path test."},{"line_number":365,"context_line":"        self.drv.detach_volume(mock_bdm.get(\u0027connection_info\u0027), self.inst,"},{"line_number":366,"context_line":"                               mock.Mock())"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        # Verify the disconnect volume was invoked"},{"line_number":369,"context_line":"        mock_vscsi_adpt.return_value.detach_volume.assert_called_once_with()"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_64781ef8","line":367,"updated":"2018-01-10 17:07:04.000000000","message":"nit: I\u0027d remove this blank line to make it clear this goes with what started on L364 (and probably add a blank line before L364 with similar reasoning)","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        # Invoke the method, good path test."},{"line_number":365,"context_line":"        self.drv.detach_volume(mock_bdm.get(\u0027connection_info\u0027), self.inst,"},{"line_number":366,"context_line":"                               mock.Mock())"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        # Verify the disconnect volume was invoked"},{"line_number":369,"context_line":"        mock_vscsi_adpt.return_value.detach_volume.assert_called_once_with()"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_6727c0b8","line":367,"in_reply_to":"7f96bb07_64781ef8","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"8d1d96347b06181aab88d5d7e06a1539628bf9d6","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        self.assertEqual(mock_vscsi_adpt.return_value.wwpns.return_value,"},{"line_number":442,"context_line":"                         vol_connector[\u0027wwpns\u0027])"},{"line_number":443,"context_line":"        self.assertFalse(vol_connector[\u0027multipath\u0027])"},{"line_number":444,"context_line":"        self.assertIsNotNone(vol_connector[\u0027host\u0027])"},{"line_number":445,"context_line":"        self.assertIsNone(vol_connector[\u0027initiator\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_a4586656","line":444,"updated":"2018-01-10 17:07:04.000000000","message":"test that this is CONF.host, not just that it isn\u0027t None","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        self.assertEqual(mock_vscsi_adpt.return_value.wwpns.return_value,"},{"line_number":442,"context_line":"                         vol_connector[\u0027wwpns\u0027])"},{"line_number":443,"context_line":"        self.assertFalse(vol_connector[\u0027multipath\u0027])"},{"line_number":444,"context_line":"        self.assertIsNotNone(vol_connector[\u0027host\u0027])"},{"line_number":445,"context_line":"        self.assertIsNone(vol_connector[\u0027initiator\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_07383cd1","line":444,"in_reply_to":"7f96bb07_a4586656","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        self.drv.detach_volume(mock_bdm.get(\u0027connection_info\u0027), self.inst,"},{"line_number":369,"context_line":"                               mock.Mock())"},{"line_number":370,"context_line":"        # Verify the disconnect volume was invoked"},{"line_number":371,"context_line":"        mock_vscsi_adpt.return_value.detach_volume.assert_called_once_with()"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_extract_bdm(self):"},{"line_number":374,"context_line":"        \"\"\"Tests the _extract_bdm method.\"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_1663701c","line":371,"updated":"2018-01-11 20:22:49.000000000","message":"no inst.save here?\n\n[Later] Ah - https://review.openstack.org/#/c/526094/25/nova/virt/powervm/driver.py@419","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        # Test with empty bdms"},{"line_number":405,"context_line":"        self.assertEqual([], _get_results([]))"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    @staticmethod"},{"line_number":408,"context_line":"    def _fake_bdms():"},{"line_number":409,"context_line":"        def _fake_bdm(volume_id, target_lun):"},{"line_number":410,"context_line":"            connection_info \u003d {\u0027driver_volume_type\u0027: \u0027fibre_channel\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_d6d0a8cc","line":407,"updated":"2018-01-11 20:22:49.000000000","message":"Wouldn\u0027t hurt my feelings if this were defined before its first use (L141).  But meh.","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        with mock.patch.object(self.inst, \u0027save\u0027) as mock_save:"},{"line_number":434,"context_line":"            # Invoke the method."},{"line_number":435,"context_line":"            self.drv.attach_volume(\u0027context\u0027, mock_bdm.get(\u0027connection_info\u0027),"},{"line_number":436,"context_line":"                                   self.inst, mock.Mock())"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # Verify the connect volume was invoked"},{"line_number":439,"context_line":"        mock_vscsi_adpt.return_value.attach_volume.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_403f1686","line":436,"range":{"start_line":436,"start_character":46,"end_line":436,"end_character":57},"updated":"2018-04-25 18:23:57.000000000","message":"mock.sentinel.stg_ftsk?","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        with mock.patch.object(self.inst, \u0027save\u0027) as mock_save:"},{"line_number":434,"context_line":"            # Invoke the method."},{"line_number":435,"context_line":"            self.drv.attach_volume(\u0027context\u0027, mock_bdm.get(\u0027connection_info\u0027),"},{"line_number":436,"context_line":"                                   self.inst, mock.Mock())"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # Verify the connect volume was invoked"},{"line_number":439,"context_line":"        mock_vscsi_adpt.return_value.attach_volume.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_632af32c","line":436,"range":{"start_line":436,"start_character":46,"end_line":436,"end_character":57},"in_reply_to":"9f6a8fd7_403f1686","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # Verify the connect volume was invoked"},{"line_number":439,"context_line":"        mock_vscsi_adpt.return_value.attach_volume.assert_called_once_with()"},{"line_number":440,"context_line":"        self.assertTrue(mock_save.called)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @mock.patch(\u0027nova.virt.powervm.volume.fcvscsi.FCVscsiVolumeAdapter\u0027)"},{"line_number":443,"context_line":"    def test_detach_volume(self, mock_vscsi_adpt):"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_2048e22a","line":440,"range":{"start_line":440,"start_character":8,"end_line":440,"end_character":41},"updated":"2018-04-25 18:23:57.000000000","message":"mock_save.assert_called_once_with()","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        # Verify the connect volume was invoked"},{"line_number":439,"context_line":"        mock_vscsi_adpt.return_value.attach_volume.assert_called_once_with()"},{"line_number":440,"context_line":"        self.assertTrue(mock_save.called)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @mock.patch(\u0027nova.virt.powervm.volume.fcvscsi.FCVscsiVolumeAdapter\u0027)"},{"line_number":443,"context_line":"    def test_detach_volume(self, mock_vscsi_adpt):"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_4327b765","line":440,"range":{"start_line":440,"start_character":8,"end_line":440,"end_character":41},"in_reply_to":"9f6a8fd7_2048e22a","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        # Invoke the method, good path test."},{"line_number":449,"context_line":"        self.drv.detach_volume(\u0027context\u0027, mock_bdm.get(\u0027connection_info\u0027),"},{"line_number":450,"context_line":"                               self.inst, mock.Mock())"},{"line_number":451,"context_line":"        # Verify the disconnect volume was invoked"},{"line_number":452,"context_line":"        mock_vscsi_adpt.return_value.detach_volume.assert_called_once_with()"},{"line_number":453,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_60425a11","line":450,"range":{"start_line":450,"start_character":42,"end_line":450,"end_character":53},"updated":"2018-04-25 18:23:57.000000000","message":"same","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        # Invoke the method, good path test."},{"line_number":449,"context_line":"        self.drv.detach_volume(\u0027context\u0027, mock_bdm.get(\u0027connection_info\u0027),"},{"line_number":450,"context_line":"                               self.inst, mock.Mock())"},{"line_number":451,"context_line":"        # Verify the disconnect volume was invoked"},{"line_number":452,"context_line":"        mock_vscsi_adpt.return_value.detach_volume.assert_called_once_with()"},{"line_number":453,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_a3300ba0","line":450,"range":{"start_line":450,"start_character":42,"end_line":450,"end_character":53},"in_reply_to":"9f6a8fd7_60425a11","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"}],"nova/tests/unit/virt/powervm/volume/test_vscsi.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"0575e87c1120c9f8e6df3aa429fd7757bd460a64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_0d089dd7","line":1,"updated":"2018-01-09 20:43:48.000000000","message":"Reworking the attach/detach tests in this file","commit_id":"49c2dec1ac1d71adebd857b589c8d9717d5d90d0"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"47af4060d686d42eb6a1594c846a76fab4dccd31","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_5c75f1f8","line":1,"in_reply_to":"9f91af0f_0d089dd7","updated":"2018-01-10 02:58:45.000000000","message":"Most of the attach_volume and related methods are tested. Still working the detach_volume, will be in PS18","commit_id":"49c2dec1ac1d71adebd857b589c8d9717d5d90d0"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":32,"context_line":"I_WWPN_2 \u003d \u002721000024FF649105\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class TestVSCSIAdapter(test.NoDBTestCase):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        super(TestVSCSIAdapter, self).setUp()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_18709d72","line":35,"updated":"2018-01-10 21:57:43.000000000","message":"missing tests for reset_stg_ftsk and _check_host_mappings","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"I_WWPN_2 \u003d \u002721000024FF649105\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class TestVSCSIAdapter(test.NoDBTestCase):"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        super(TestVSCSIAdapter, self).setUp()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_aabca4bb","line":35,"in_reply_to":"7f96bb07_18709d72","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # Check key not found"},{"line_number":86,"context_line":"        self.assertIsNone(retrieved_udid)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @mock.patch(\u0027pypowervm.tasks.partition.get_physical_wwpns\u0027, autospec\u003dTrue)"},{"line_number":89,"context_line":"    def test_wwpns(self, mock_vio_wwpns):"},{"line_number":90,"context_line":"        mock_vio_wwpns.return_value \u003d [\u0027aa\u0027, \u0027bb\u0027]"},{"line_number":91,"context_line":"        wwpns \u003d self.vol_drv.wwpns()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_d8bb150c","line":88,"updated":"2018-01-10 21:57:43.000000000","message":"please reorder the tests to match the ordering of the methods they are testing in vscsi.py. That will make it much easier to review, maintain, etc.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # Check key not found"},{"line_number":86,"context_line":"        self.assertIsNone(retrieved_udid)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @mock.patch(\u0027pypowervm.tasks.partition.get_physical_wwpns\u0027, autospec\u003dTrue)"},{"line_number":89,"context_line":"    def test_wwpns(self, mock_vio_wwpns):"},{"line_number":90,"context_line":"        mock_vio_wwpns.return_value \u003d [\u0027aa\u0027, \u0027bb\u0027]"},{"line_number":91,"context_line":"        wwpns \u003d self.vol_drv.wwpns()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_798760d9","line":88,"in_reply_to":"7f96bb07_d8bb150c","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        wwpns \u003d self.vol_drv.wwpns()"},{"line_number":92,"context_line":"        self.assertListEqual([\u0027aa\u0027, \u0027bb\u0027], wwpns)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def test_get_hdisk_itls(self):"},{"line_number":95,"context_line":"        \"\"\"Validates the _get_hdisk_itls method.\"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        mock_vios \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_7319c286","line":94,"updated":"2018-01-10 21:57:43.000000000","message":"also out of order","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        wwpns \u003d self.vol_drv.wwpns()"},{"line_number":92,"context_line":"        self.assertListEqual([\u0027aa\u0027, \u0027bb\u0027], wwpns)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def test_get_hdisk_itls(self):"},{"line_number":95,"context_line":"        \"\"\"Validates the _get_hdisk_itls method.\"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        mock_vios \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_196c1c35","line":94,"in_reply_to":"7f96bb07_7319c286","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        i_wwpn, t_wwpns, lun \u003d self.vol_drv._get_hdisk_itls(mock_vios)"},{"line_number":112,"context_line":"        self.assertListEqual([], i_wwpn)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027)"},{"line_number":115,"context_line":"    @mock.patch(\u0027pypowervm.utils.transaction.FeedTask\u0027, autospec\u003dTrue)"},{"line_number":116,"context_line":"    def test_attach_volume(self, mock_feed_task, mock_get_wrap):"},{"line_number":117,"context_line":"        mock_lpar_wrap \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_b3c8aa74","line":114,"updated":"2018-01-10 21:57:43.000000000","message":"shouldn\u0027t we autospec this? missing that in a bunch of places.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        i_wwpn, t_wwpns, lun \u003d self.vol_drv._get_hdisk_itls(mock_vios)"},{"line_number":112,"context_line":"        self.assertListEqual([], i_wwpn)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027)"},{"line_number":115,"context_line":"    @mock.patch(\u0027pypowervm.utils.transaction.FeedTask\u0027, autospec\u003dTrue)"},{"line_number":116,"context_line":"    def test_attach_volume(self, mock_feed_task, mock_get_wrap):"},{"line_number":117,"context_line":"        mock_lpar_wrap \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_627315e9","line":114,"in_reply_to":"7f96bb07_b3c8aa74","updated":"2018-01-11 15:51:02.000000000","message":"Discussed on IRC. An effort to add more autospeccing throughout the code will be a future goal.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        mock_lpar_wrap.can_modify_io.return_value \u003d True, None"},{"line_number":119,"context_line":"        mock_get_wrap.return_value \u003d mock_lpar_wrap"},{"line_number":120,"context_line":"        mock_attach_ftsk \u003d mock_feed_task.return_value"},{"line_number":121,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":122,"context_line":"        mock_attach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":123,"context_line":"        self.vol_drv.attach_volume()"},{"line_number":124,"context_line":"        mock_feed_task.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_7389c224","line":121,"updated":"2018-01-10 21:57:43.000000000","message":"better have multiple vios and have cases where all are modified (you have), none are modified (you have), and some are modified (you\u0027re missing).","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        mock_lpar_wrap.can_modify_io.return_value \u003d True, None"},{"line_number":119,"context_line":"        mock_get_wrap.return_value \u003d mock_lpar_wrap"},{"line_number":120,"context_line":"        mock_attach_ftsk \u003d mock_feed_task.return_value"},{"line_number":121,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":122,"context_line":"        mock_attach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":123,"context_line":"        self.vol_drv.attach_volume()"},{"line_number":124,"context_line":"        mock_feed_task.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_79e1a0fe","line":121,"in_reply_to":"7f96bb07_7389c224","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        mock_log.info.assert_not_called()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # Bad discovery, device in use status"},{"line_number":206,"context_line":"        mock_disc_hdisk.return_value \u003d hdisk.LUAStatus.DEVICE_IN_USE, \u0027dev\u0027, \\"},{"line_number":207,"context_line":"                                       \u0027udid\u0027"},{"line_number":208,"context_line":"        self.vol_drv._discover_volume_on_vios(mock_vios)"},{"line_number":209,"context_line":"        mock_log.warning.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_93c24ee9","line":206,"range":{"start_line":206,"start_character":77,"end_line":206,"end_character":78},"updated":"2018-01-10 21:57:43.000000000","message":"use parenthesis instead of \\","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        mock_log.info.assert_not_called()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # Bad discovery, device in use status"},{"line_number":206,"context_line":"        mock_disc_hdisk.return_value \u003d hdisk.LUAStatus.DEVICE_IN_USE, \u0027dev\u0027, \\"},{"line_number":207,"context_line":"                                       \u0027udid\u0027"},{"line_number":208,"context_line":"        self.vol_drv._discover_volume_on_vios(mock_vios)"},{"line_number":209,"context_line":"        mock_log.warning.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_b92c089a","line":206,"range":{"start_line":206,"start_character":77,"end_line":206,"end_character":78},"in_reply_to":"7f96bb07_93c24ee9","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def test_add_append_mapping(self, mock_add_map, mock_bld_map, mock_pv):"},{"line_number":216,"context_line":"        def test_afs(add_func):"},{"line_number":217,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":218,"context_line":"            self.assertEqual(mock_add_map.return_value, add_func(mock_vios))"},{"line_number":219,"context_line":"            mock_pv.assert_called_once_with(self.adpt, \u0027devname\u0027)"},{"line_number":220,"context_line":"            mock_bld_map.assert_called_once_with("},{"line_number":221,"context_line":"                None, mock_vios, self.vol_drv.vm_uuid, mock_pv.return_value)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_25e3ed07","line":218,"updated":"2018-01-10 21:57:43.000000000","message":"need to set the return_value for mock_add_map before comparing against it.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def test_add_append_mapping(self, mock_add_map, mock_bld_map, mock_pv):"},{"line_number":216,"context_line":"        def test_afs(add_func):"},{"line_number":217,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":218,"context_line":"            self.assertEqual(mock_add_map.return_value, add_func(mock_vios))"},{"line_number":219,"context_line":"            mock_pv.assert_called_once_with(self.adpt, \u0027devname\u0027)"},{"line_number":220,"context_line":"            mock_bld_map.assert_called_once_with("},{"line_number":221,"context_line":"                None, mock_vios, self.vol_drv.vm_uuid, mock_pv.return_value)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_82e98181","line":218,"in_reply_to":"7f96bb07_25e3ed07","updated":"2018-01-11 15:51:02.000000000","message":"Discussed on IRC, not needed.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        def test_afs(add_func):"},{"line_number":217,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":218,"context_line":"            self.assertEqual(mock_add_map.return_value, add_func(mock_vios))"},{"line_number":219,"context_line":"            mock_pv.assert_called_once_with(self.adpt, \u0027devname\u0027)"},{"line_number":220,"context_line":"            mock_bld_map.assert_called_once_with("},{"line_number":221,"context_line":"                None, mock_vios, self.vol_drv.vm_uuid, mock_pv.return_value)"},{"line_number":222,"context_line":"            mock_add_map.assert_called_once_with("},{"line_number":223,"context_line":"                mock_vios, mock_bld_map.return_value)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.ftsk.add_functor_subtask.side_effect \u003d test_afs"},{"line_number":226,"context_line":"        self.vol_drv._add_append_mapping(\u0027vios_uuid\u0027, \u0027devname\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_8589a127","line":223,"range":{"start_line":219,"start_character":0,"end_line":223,"end_character":53},"updated":"2018-01-10 21:57:43.000000000","message":"move these lines to the end of the test_add_append_mapping method to make sure they are reached. As it is, I don\u0027t think test_afs is ever called, so nothing is really tested (see next comment).","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        def test_afs(add_func):"},{"line_number":217,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":218,"context_line":"            self.assertEqual(mock_add_map.return_value, add_func(mock_vios))"},{"line_number":219,"context_line":"            mock_pv.assert_called_once_with(self.adpt, \u0027devname\u0027)"},{"line_number":220,"context_line":"            mock_bld_map.assert_called_once_with("},{"line_number":221,"context_line":"                None, mock_vios, self.vol_drv.vm_uuid, mock_pv.return_value)"},{"line_number":222,"context_line":"            mock_add_map.assert_called_once_with("},{"line_number":223,"context_line":"                mock_vios, mock_bld_map.return_value)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.ftsk.add_functor_subtask.side_effect \u003d test_afs"},{"line_number":226,"context_line":"        self.vol_drv._add_append_mapping(\u0027vios_uuid\u0027, \u0027devname\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_c29469eb","line":223,"range":{"start_line":219,"start_character":0,"end_line":223,"end_character":53},"in_reply_to":"7f96bb07_8589a127","updated":"2018-01-11 15:51:02.000000000","message":"Added a check that the functor subtask is added","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            mock_add_map.assert_called_once_with("},{"line_number":223,"context_line":"                mock_vios, mock_bld_map.return_value)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.ftsk.add_functor_subtask.side_effect \u003d test_afs"},{"line_number":226,"context_line":"        self.vol_drv._add_append_mapping(\u0027vios_uuid\u0027, \u0027devname\u0027)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_e569858b","line":225,"range":{"start_line":225,"start_character":13,"end_line":225,"end_character":17},"updated":"2018-01-10 21:57:43.000000000","message":"doesn\u0027t this need to be wtsk?","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            mock_add_map.assert_called_once_with("},{"line_number":223,"context_line":"                mock_vios, mock_bld_map.return_value)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.ftsk.add_functor_subtask.side_effect \u003d test_afs"},{"line_number":226,"context_line":"        self.vol_drv._add_append_mapping(\u0027vios_uuid\u0027, \u0027devname\u0027)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @mock.patch(\u0027nova.virt.powervm.vm.get_instance_wrapper\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_e299651f","line":225,"range":{"start_line":225,"start_character":13,"end_line":225,"end_character":17},"in_reply_to":"7f96bb07_e569858b","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        mock_lpar_wrap.can_modify_io.return_value \u003d True, None"},{"line_number":233,"context_line":"        mock_get_wrap.return_value \u003d mock_lpar_wrap"},{"line_number":234,"context_line":"        mock_detach_ftsk \u003d mock_feed_task.return_value"},{"line_number":235,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":236,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":237,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_25c8cd53","line":235,"updated":"2018-01-10 21:57:43.000000000","message":"as with test_attach_volume, better have multiple vios and test all, none, and some cases.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        mock_lpar_wrap.can_modify_io.return_value \u003d True, None"},{"line_number":233,"context_line":"        mock_get_wrap.return_value \u003d mock_lpar_wrap"},{"line_number":234,"context_line":"        mock_detach_ftsk \u003d mock_feed_task.return_value"},{"line_number":235,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":236,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":237,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_ef695e8b","line":235,"in_reply_to":"7f96bb07_25c8cd53","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":236,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":237,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        mock_feed_task.assert_called_once()"},{"line_number":240,"context_line":"        mock_detach_ftsk.add_functor_subtask.assert_called_once_with("},{"line_number":241,"context_line":"            self.vol_drv._detach_vol_for_vio, provides\u003d\u0027vio_modified\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_253bed38","line":238,"updated":"2018-01-10 21:57:43.000000000","message":"blank line would make more sense shifted up one line","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True}}}"},{"line_number":236,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":237,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        mock_feed_task.assert_called_once()"},{"line_number":240,"context_line":"        mock_detach_ftsk.add_functor_subtask.assert_called_once_with("},{"line_number":241,"context_line":"            self.vol_drv._detach_vol_for_vio, provides\u003d\u0027vio_modified\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_de553a1f","line":238,"in_reply_to":"7f96bb07_253bed38","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        mock_rm_map.reset_mock()"},{"line_number":276,"context_line":"        mock_rm_hdisk.reset_mock()"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        # Good detach, bdm data was lost"},{"line_number":279,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d None"},{"line_number":280,"context_line":"        mock_disc_vol.return_value \u003d \u0027status\u0027, \u0027devname\u0027, \u0027udid\u0027"},{"line_number":281,"context_line":"        mock_good_disc.return_value \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_05b11190","line":278,"updated":"2018-01-10 21:57:43.000000000","message":"there\u0027s also the case that there is no udid set","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        mock_rm_map.reset_mock()"},{"line_number":276,"context_line":"        mock_rm_hdisk.reset_mock()"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        # Good detach, bdm data was lost"},{"line_number":279,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d None"},{"line_number":280,"context_line":"        mock_disc_vol.return_value \u003d \u0027status\u0027, \u0027devname\u0027, \u0027udid\u0027"},{"line_number":281,"context_line":"        mock_good_disc.return_value \u003d True"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_d990f498","line":278,"in_reply_to":"7f96bb07_05b11190","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        mock_rm_map.assert_not_called()"},{"line_number":295,"context_line":"        mock_rm_hdisk.assert_not_called()"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        # Bad detach, exception discovering volue on vios"},{"line_number":298,"context_line":"        mock_disc_vol.side_effect \u003d Exception()"},{"line_number":299,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"},{"line_number":300,"context_line":"        self.assertFalse(ret)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_0576f1d9","line":297,"range":{"start_line":297,"start_character":44,"end_line":297,"end_character":49},"updated":"2018-01-10 21:57:43.000000000","message":"volume*","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        mock_rm_map.assert_not_called()"},{"line_number":295,"context_line":"        mock_rm_hdisk.assert_not_called()"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        # Bad detach, exception discovering volue on vios"},{"line_number":298,"context_line":"        mock_disc_vol.side_effect \u003d Exception()"},{"line_number":299,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"},{"line_number":300,"context_line":"        self.assertFalse(ret)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_be586e56","line":297,"range":{"start_line":297,"start_character":44,"end_line":297,"end_character":49},"in_reply_to":"7f96bb07_0576f1d9","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    @mock.patch(\u0027pypowervm.tasks.scsi_mapper.gen_match_func\u0027, autospec\u003dTrue)"},{"line_number":305,"context_line":"    @mock.patch(\u0027pypowervm.tasks.scsi_mapper.remove_maps\u0027, autospec\u003dTrue)"},{"line_number":306,"context_line":"    def test_add_remove_mapping(self, mock_rm_maps, mock_gen_match):"},{"line_number":307,"context_line":"        def test_afs(rm_func):"},{"line_number":308,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":309,"context_line":"            self.assertEqual(mock_rm_maps.return_value, rm_func(mock_vios))"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_c834a0e1","line":306,"updated":"2018-01-10 21:57:43.000000000","message":"see comments for test_add_append_mapping","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    @mock.patch(\u0027pypowervm.tasks.scsi_mapper.gen_match_func\u0027, autospec\u003dTrue)"},{"line_number":305,"context_line":"    @mock.patch(\u0027pypowervm.tasks.scsi_mapper.remove_maps\u0027, autospec\u003dTrue)"},{"line_number":306,"context_line":"    def test_add_remove_mapping(self, mock_rm_maps, mock_gen_match):"},{"line_number":307,"context_line":"        def test_afs(rm_func):"},{"line_number":308,"context_line":"            mock_vios \u003d mock.create_autospec(pvm_vios.VIOS)"},{"line_number":309,"context_line":"            self.assertEqual(mock_rm_maps.return_value, rm_func(mock_vios))"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_c219c988","line":306,"in_reply_to":"7f96bb07_c834a0e1","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        mock_check_maps.return_value \u003d True"},{"line_number":327,"context_line":"        self.vol_drv._add_remove_hdisk(mock_vios, \u0027devname\u0027)"},{"line_number":328,"context_line":"        mock_functask.assert_not_called()"},{"line_number":329,"context_line":"        self.ftsk.add_post_execute.assert_not_called()"},{"line_number":330,"context_line":"        mock_check_maps.assert_called_once_with(mock_vios, \u0027devname\u0027)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        def test_functor_task(rm_hdisk, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_68046c7c","line":329,"updated":"2018-01-10 21:57:43.000000000","message":"let\u0027s also mock_rm_hdisk.assert_not_called()","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        mock_check_maps.return_value \u003d True"},{"line_number":327,"context_line":"        self.vol_drv._add_remove_hdisk(mock_vios, \u0027devname\u0027)"},{"line_number":328,"context_line":"        mock_functask.assert_not_called()"},{"line_number":329,"context_line":"        self.ftsk.add_post_execute.assert_not_called()"},{"line_number":330,"context_line":"        mock_check_maps.assert_called_once_with(mock_vios, \u0027devname\u0027)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        def test_functor_task(rm_hdisk, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_3e6c5e07","line":329,"in_reply_to":"7f96bb07_68046c7c","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        def test_functor_task(rm_hdisk, name\u003dNone):"},{"line_number":333,"context_line":"            rm_hdisk()"},{"line_number":334,"context_line":"            mock_rm_hdisk.assert_called_once_with(self.adpt, CONF.host,"},{"line_number":335,"context_line":"                                                  \u0027devname\u0027, \u0027uuid\u0027)"},{"line_number":336,"context_line":"            return \u0027functor_task\u0027"},{"line_number":337,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_087da81b","line":334,"updated":"2018-01-10 21:57:43.000000000","message":"no need for the assert to be in this method... move it out with the others for better safety and readability.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        def test_functor_task(rm_hdisk, name\u003dNone):"},{"line_number":333,"context_line":"            rm_hdisk()"},{"line_number":334,"context_line":"            mock_rm_hdisk.assert_called_once_with(self.adpt, CONF.host,"},{"line_number":335,"context_line":"                                                  \u0027devname\u0027, \u0027uuid\u0027)"},{"line_number":336,"context_line":"            return \u0027functor_task\u0027"},{"line_number":337,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_7e62e618","line":334,"in_reply_to":"7f96bb07_087da81b","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"07ceb84ae956de09551ef1f92f54107327f982ec","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                                          \u0027vios2\u0027: {\u0027vio_modified\u0027: False}}}"},{"line_number":290,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":291,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":292,"context_line":"        mock_log.assert_not_called()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # No vioses modifed"},{"line_number":295,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: False},"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_78dc2846","line":292,"updated":"2018-01-11 16:28:32.000000000","message":"instead or a negative check, and on logs no less, let\u0027s replace this with mock_feed_task.assert_called_once or one of the other positive checks.","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8b45884d47ef5291ae9deed2931c7883657df6fc","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                                          \u0027vios2\u0027: {\u0027vio_modified\u0027: False}}}"},{"line_number":290,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":291,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":292,"context_line":"        mock_log.assert_not_called()"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # No vioses modifed"},{"line_number":295,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: False},"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_82f97e81","line":292,"in_reply_to":"7f96bb07_78dc2846","updated":"2018-01-11 17:07:28.000000000","message":"Done","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"07ceb84ae956de09551ef1f92f54107327f982ec","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                                          \u0027vios2\u0027: {\u0027vio_modified\u0027: False}}}"},{"line_number":297,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":298,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":299,"context_line":"        mock_log.assert_called_once()"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        # Raise if exception during execute"},{"line_number":302,"context_line":"        mock_detach_ftsk.execute.side_effect \u003d Exception()"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_38e6a018","line":299,"updated":"2018-01-11 16:28:32.000000000","message":"ditto","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8b45884d47ef5291ae9deed2931c7883657df6fc","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                                          \u0027vios2\u0027: {\u0027vio_modified\u0027: False}}}"},{"line_number":297,"context_line":"        mock_detach_ftsk.execute.return_value \u003d mock_ret"},{"line_number":298,"context_line":"        self.vol_drv.detach_volume()"},{"line_number":299,"context_line":"        mock_log.assert_called_once()"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        # Raise if exception during execute"},{"line_number":302,"context_line":"        mock_detach_ftsk.execute.side_effect \u003d Exception()"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_a2f6fa8e","line":299,"in_reply_to":"7f96bb07_38e6a018","updated":"2018-01-11 17:07:28.000000000","message":"Done","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"07ceb84ae956de09551ef1f92f54107327f982ec","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        mock_rm_map.reset_mock()"},{"line_number":343,"context_line":"        mock_rm_hdisk.reset_mock()"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Good detach, no udid"},{"line_number":346,"context_line":"        self.vol_drv._set_udid(None)"},{"line_number":347,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d \u0027devname\u0027"},{"line_number":348,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_78b188e1","line":345,"updated":"2018-01-11 16:28:32.000000000","message":"nit: would make more sense to test this before the \"no device name\" case, following the order of the vscsi.py code","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8b45884d47ef5291ae9deed2931c7883657df6fc","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        mock_rm_map.reset_mock()"},{"line_number":343,"context_line":"        mock_rm_hdisk.reset_mock()"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Good detach, no udid"},{"line_number":346,"context_line":"        self.vol_drv._set_udid(None)"},{"line_number":347,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d \u0027devname\u0027"},{"line_number":348,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_d850dc35","line":345,"in_reply_to":"7f96bb07_78b188e1","updated":"2018-01-11 17:07:28.000000000","message":"Done","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"07ceb84ae956de09551ef1f92f54107327f982ec","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Good detach, no udid"},{"line_number":346,"context_line":"        self.vol_drv._set_udid(None)"},{"line_number":347,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d \u0027devname\u0027"},{"line_number":348,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"},{"line_number":349,"context_line":"        self.assertTrue(ret)"},{"line_number":350,"context_line":"        mock_rm_map.assert_called_once_with(\u0027part_id\u0027, \u0027vios_uuid\u0027, \u0027devname\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_f8d91822","line":347,"updated":"2018-01-11 16:28:32.000000000","message":"in the no udid case, hdisk_from_uuid shouldn\u0027t be called.","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8b45884d47ef5291ae9deed2931c7883657df6fc","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Good detach, no udid"},{"line_number":346,"context_line":"        self.vol_drv._set_udid(None)"},{"line_number":347,"context_line":"        mock_vios.hdisk_from_uuid.return_value \u003d \u0027devname\u0027"},{"line_number":348,"context_line":"        ret \u003d self.vol_drv._detach_vol_for_vio(mock_vios)"},{"line_number":349,"context_line":"        self.assertTrue(ret)"},{"line_number":350,"context_line":"        mock_rm_map.assert_called_once_with(\u0027part_id\u0027, \u0027vios_uuid\u0027, \u0027devname\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_827dfe1d","line":347,"in_reply_to":"7f96bb07_f8d91822","updated":"2018-01-11 17:07:28.000000000","message":"Done","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"023a6dd37a78f3adc2eb17beaa58c52723cfa19c","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        mock_detach_ftsk.execute.assert_called_once_with()"},{"line_number":283,"context_line":"        self.ftsk.execute.assert_called_once_with()"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        mock_feed_task.reset_mock()"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # 1 vios modified"},{"line_number":288,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True},"}],"source_content_type":"text/x-python","patch_set":24,"id":"7f96bb07_c556b007","line":285,"updated":"2018-01-11 17:31:44.000000000","message":"I was wrong, the mock_log asserts were useful and better than what we replaced them with... better put them back (all 3).","commit_id":"f3ed1f2c4a0ff019fdfcaaec0e11dbeb5e26c623"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f5f582d9759e45d292dc81a2043933c4f0200f63","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        mock_detach_ftsk.execute.assert_called_once_with()"},{"line_number":283,"context_line":"        self.ftsk.execute.assert_called_once_with()"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        mock_feed_task.reset_mock()"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # 1 vios modified"},{"line_number":288,"context_line":"        mock_ret \u003d {\u0027wrapper_task_rets\u0027: {\u0027vios1\u0027: {\u0027vio_modified\u0027: True},"}],"source_content_type":"text/x-python","patch_set":24,"id":"7f96bb07_05dd7813","line":285,"in_reply_to":"7f96bb07_c556b007","updated":"2018-01-11 17:47:04.000000000","message":"Done","commit_id":"f3ed1f2c4a0ff019fdfcaaec0e11dbeb5e26c623"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                                                stg_ftsk\u003dself.ftsk)"},{"line_number":63,"context_line":"        self.vol_drv \u003d init_vol_adpt()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @mock.patch(\u0027pypowervm.utils.transaction.FeedTask\u0027, autospec\u003dTrue)"},{"line_number":66,"context_line":"    @mock.patch(\u0027pypowervm.wrappers.virtual_io_server.VIOS\u0027, autospec\u003dTrue)"},{"line_number":67,"context_line":"    def test_reset_stg_ftsk(self, mock_vios, mock_ftsk):"},{"line_number":68,"context_line":"        self.vol_drv.reset_stg_ftsk(\u0027stg_ftsk\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_114dba71","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":70},"updated":"2018-01-11 20:22:49.000000000","message":"How is this different from self.ftsk (L43)?\n\n[Later] Ah, we need to mock the initialization here.  Okay.","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.vol_drv.reset_stg_ftsk(\u0027stg_ftsk\u0027)"},{"line_number":69,"context_line":"        self.assertEqual(\u0027stg_ftsk\u0027, self.vol_drv.stg_ftsk)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        mock_vios.getter.return_value \u003d \u0027getter\u0027"},{"line_number":72,"context_line":"        mock_ftsk.return_value \u003d \u0027local_feed_task\u0027"},{"line_number":73,"context_line":"        self.vol_drv.reset_stg_ftsk()"},{"line_number":74,"context_line":"        self.assertEqual(\u0027local_feed_task\u0027, self.vol_drv.stg_ftsk)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_f145ae18","line":71,"range":{"start_line":71,"start_character":41,"end_line":71,"end_character":47},"updated":"2018-01-11 20:22:49.000000000","message":"several of these explicit return values seem unnecessary.  E.g. in this case, L77 could assert_called_once_with(mock_ftsk.return_value, mock_vios.getter.return_value)","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"}],"nova/virt/powervm/__init__.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_c284b2d5","line":1,"updated":"2018-01-10 15:55:34.000000000","message":"shouldn\u0027t be updating the copyright on a file that we\u0027re not changing in this patch set. If the copyright is wrong, change it with a separate commit.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_040a7a25","line":1,"in_reply_to":"9f91af0f_c284b2d5","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_91a22a9a","line":1,"updated":"2018-01-11 20:22:49.000000000","message":"This shouldn\u0027t be modified if the file contents didn\u0027t change.  (And if they did change, it would need to express a range.)","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"401b203ce760e7cfa8db90667c5af702c713180c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_b173a6e7","line":1,"in_reply_to":"7f96bb07_91a22a9a","updated":"2018-01-11 20:28:16.000000000","message":"Done","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"}],"nova/virt/powervm/driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        # Run the flow."},{"line_number":221,"context_line":"        tf_base.run(flow_spawn, instance\u003dinstance)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _add_volume_connection_tasks(self, context, instance, bdms,"},{"line_number":224,"context_line":"                                     flow, stg_ftsk):"},{"line_number":225,"context_line":"        \"\"\"Determine if there are volumes to connect to this instance."},{"line_number":226,"context_line":"        If there are volumes to connect to this instance add a task to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_9ba95a7d","line":223,"range":{"start_line":223,"start_character":8,"end_line":223,"end_character":36},"updated":"2017-12-08 16:35:30.000000000","message":"Is this used anywhere other than above?  Doesn\u0027t seem worth splitting it out if not; just inline it.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        # Run the flow."},{"line_number":221,"context_line":"        tf_base.run(flow_spawn, instance\u003dinstance)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _add_volume_connection_tasks(self, context, instance, bdms,"},{"line_number":224,"context_line":"                                     flow, stg_ftsk):"},{"line_number":225,"context_line":"        \"\"\"Determine if there are volumes to connect to this instance."},{"line_number":226,"context_line":"        If there are volumes to connect to this instance add a task to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_50ce4882","line":223,"range":{"start_line":223,"start_character":8,"end_line":223,"end_character":36},"in_reply_to":"df87a7cf_9ba95a7d","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            # Convert to a Nova exception"},{"line_number":320,"context_line":"            raise exc.InstanceTerminationFailure(reason\u003dsix.text_type(e))"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def _add_volume_disconnection_tasks(self, context, instance, bdms,"},{"line_number":323,"context_line":"                                        flow, stg_ftsk):"},{"line_number":324,"context_line":"        \"\"\"Determine if there are volumes to disconnect from this instance."},{"line_number":325,"context_line":"        If there are volumes to disconnect from this instance add a task to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3bb4ced0","line":322,"range":{"start_line":322,"start_character":8,"end_line":322,"end_character":39},"updated":"2017-12-08 16:35:30.000000000","message":"and ditto","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            # Convert to a Nova exception"},{"line_number":320,"context_line":"            raise exc.InstanceTerminationFailure(reason\u003dsix.text_type(e))"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def _add_volume_disconnection_tasks(self, context, instance, bdms,"},{"line_number":323,"context_line":"                                        flow, stg_ftsk):"},{"line_number":324,"context_line":"        \"\"\"Determine if there are volumes to disconnect from this instance."},{"line_number":325,"context_line":"        If there are volumes to disconnect from this instance add a task to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_f0c67c68","line":322,"range":{"start_line":322,"start_character":8,"end_line":322,"end_character":39},"in_reply_to":"df87a7cf_3bb4ced0","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":477,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":478,"context_line":"        represents one volume connection."},{"line_number":479,"context_line":"        An example string representation of the a DriverVolumeBlockDevice"},{"line_number":480,"context_line":"        from the early Liberty time frame is:"},{"line_number":481,"context_line":"        {\u0027guest_format\u0027: None,"},{"line_number":482,"context_line":"        \u0027boot_index\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3b028e70","line":479,"range":{"start_line":479,"start_character":44,"end_line":479,"end_character":47},"updated":"2017-12-08 16:35:30.000000000","message":"strike","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":477,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":478,"context_line":"        represents one volume connection."},{"line_number":479,"context_line":"        An example string representation of the a DriverVolumeBlockDevice"},{"line_number":480,"context_line":"        from the early Liberty time frame is:"},{"line_number":481,"context_line":"        {\u0027guest_format\u0027: None,"},{"line_number":482,"context_line":"        \u0027boot_index\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3096244e","line":479,"range":{"start_line":479,"start_character":44,"end_line":479,"end_character":47},"in_reply_to":"df87a7cf_3b028e70","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"},{"line_number":389,"context_line":"                      disk_bus\u003dNone, device_type\u003dNone, encryption\u003dNone):"},{"line_number":390,"context_line":"        \"\"\"Attach the volume to the instance at mountpoint using info.\"\"\""},{"line_number":391,"context_line":"        self._log_operation(\u0027attach_volume\u0027, instance)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # Define the flow"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_1fce9f81","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":73},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def attach_volume(self, context, connection_info, instance, mountpoint,"},{"line_number":389,"context_line":"                      disk_bus\u003dNone, device_type\u003dNone, encryption\u003dNone):"},{"line_number":390,"context_line":"        \"\"\"Attach the volume to the instance at mountpoint using info.\"\"\""},{"line_number":391,"context_line":"        self._log_operation(\u0027attach_volume\u0027, instance)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # Define the flow"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_ea5bdff2","line":390,"range":{"start_line":390,"start_character":8,"end_line":390,"end_character":73},"in_reply_to":"9f91af0f_1fce9f81","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        # Define the flow"},{"line_number":394,"context_line":"        flow \u003d tf_lf.Flow(\"attach_volume\")"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # Determine if there are volumes to attach.  If so, add a connection"},{"line_number":397,"context_line":"        # for each type."},{"line_number":398,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":399,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":400,"context_line":"        flow.add(tf_stg.AttachVolume(vol_drv))"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_ffa3bb9c","line":397,"range":{"start_line":396,"start_character":8,"end_line":397,"end_character":24},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        # Define the flow"},{"line_number":394,"context_line":"        flow \u003d tf_lf.Flow(\"attach_volume\")"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # Determine if there are volumes to attach.  If so, add a connection"},{"line_number":397,"context_line":"        # for each type."},{"line_number":398,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":399,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":400,"context_line":"        flow.add(tf_stg.AttachVolume(vol_drv))"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_2a0b07d6","line":397,"range":{"start_line":396,"start_character":8,"end_line":397,"end_character":24},"in_reply_to":"9f91af0f_ffa3bb9c","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # Determine if there are volumes to attach.  If so, add a connection"},{"line_number":397,"context_line":"        # for each type."},{"line_number":398,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":399,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":400,"context_line":"        flow.add(tf_stg.AttachVolume(vol_drv))"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_7a1002a9","line":398,"updated":"2018-01-09 17:34:07.000000000","message":"before we can do this, we need to check the connection_info\u0027s driver_volume_type and confirm that it is vSCSI, else raise an InvalidVolume exception. See nova_powervm.virt.powervm.volume.build_volume_driver from the nova-powervm code.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # Determine if there are volumes to attach.  If so, add a connection"},{"line_number":397,"context_line":"        # for each type."},{"line_number":398,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":399,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":400,"context_line":"        flow.add(tf_stg.AttachVolume(vol_drv))"},{"line_number":401,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_c720569e","line":398,"in_reply_to":"9f91af0f_7a1002a9","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def detach_volume(self, connection_info, instance, mountpoint,"},{"line_number":413,"context_line":"                      encryption\u003dNone):"},{"line_number":414,"context_line":"        \"\"\"Detach the volume attached to the instance.\"\"\""},{"line_number":415,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Get a volume adapter for this volume"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_bfc69367","line":414,"range":{"start_line":414,"start_character":8,"end_line":414,"end_character":57},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def detach_volume(self, connection_info, instance, mountpoint,"},{"line_number":413,"context_line":"                      encryption\u003dNone):"},{"line_number":414,"context_line":"        \"\"\"Detach the volume attached to the instance.\"\"\""},{"line_number":415,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Get a volume adapter for this volume"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_ca261b69","line":414,"range":{"start_line":414,"start_character":8,"end_line":414,"end_character":57},"in_reply_to":"9f91af0f_bfc69367","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Get a volume adapter for this volume"},{"line_number":418,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":419,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_fa8c12d8","line":418,"updated":"2018-01-09 17:34:07.000000000","message":"as noted above, should confirm something is vscsi before you treat it as such.\n\nI suggest implementing the build_volume_driver method just to check the type is supported and return driver if it is, raise if it\u0027s not. Can hardcode vSCSI driver in there for the time being instead of using FC_STRATEGY_MAPPING, but still need the method to a) do the check and b) not have to duplicate that code wherever the driver is needed).","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Get a volume adapter for this volume"},{"line_number":418,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":419,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_67162a4c","line":418,"in_reply_to":"9f91af0f_fa8c12d8","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":419,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":422,"context_line":"        try:"},{"line_number":423,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":424,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_356b6d1e","line":421,"updated":"2018-01-09 17:34:07.000000000","message":"this doesn\u0027t depend on vol_drv, so I would do this first and save ourselves the effor of building vol_drv if the instance doesn\u0027t exist.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":419,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":422,"context_line":"        try:"},{"line_number":423,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":424,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_c755b6fb","line":421,"in_reply_to":"9f91af0f_356b6d1e","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":422,"context_line":"        try:"},{"line_number":423,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":424,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"},{"line_number":425,"context_line":"                         qprop\u003d\u0027PartitionID\u0027, log_errors\u003dFalse)"},{"line_number":426,"context_line":"        except exc.InstanceNotFound:"},{"line_number":427,"context_line":"            LOG.info(\u0027During volume detach, the instance was not found on \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_d57d61b2","line":424,"updated":"2018-01-09 17:34:07.000000000","message":"I liked using vm.instance_exists() in nova-powervm, which makes this cleaner. I\u0027m ok with that being a separate change we make later if necessary, but I would probably have just gone ahead with it here.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":422,"context_line":"        try:"},{"line_number":423,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":424,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"},{"line_number":425,"context_line":"                         qprop\u003d\u0027PartitionID\u0027, log_errors\u003dFalse)"},{"line_number":426,"context_line":"        except exc.InstanceNotFound:"},{"line_number":427,"context_line":"            LOG.info(\u0027During volume detach, the instance was not found on \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_6744ea47","line":424,"in_reply_to":"9f91af0f_d57d61b2","updated":"2018-01-09 20:26:18.000000000","message":"Yeah I went back and forth on this. Was trying to limit the number of files being touched to make it a tiny bit easier on reviewers. I can change it back if you would like.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                     \u0027this host.\u0027, instance\u003dinstance)"},{"line_number":429,"context_line":"            return"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        # Define the flow"},{"line_number":432,"context_line":"        flow \u003d tf_lf.Flow(\"detach_volume\")"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        # Add a task to detach the volume"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_35936d5d","line":431,"updated":"2018-01-09 17:34:07.000000000","message":"nit: a little odd that in the attach we create the Flow then build vol_drv, where here we reversed that. Not sure which I prefer, but I like consistency.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                     \u0027this host.\u0027, instance\u003dinstance)"},{"line_number":429,"context_line":"            return"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        # Define the flow"},{"line_number":432,"context_line":"        flow \u003d tf_lf.Flow(\"detach_volume\")"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        # Add a task to detach the volume"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_876c8ece","line":431,"in_reply_to":"9f91af0f_35936d5d","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    @staticmethod"},{"line_number":441,"context_line":"    def _extract_bdm(block_device_info):"},{"line_number":442,"context_line":"        \"\"\"Returns the block device mapping out of the block device info."},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":445,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":446,"context_line":"        represents one volume connection."},{"line_number":447,"context_line":"        \"\"\""},{"line_number":448,"context_line":"        if block_device_info is None:"},{"line_number":449,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_7fa24bb0","line":446,"range":{"start_line":442,"start_character":8,"end_line":446,"end_character":41},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    @staticmethod"},{"line_number":441,"context_line":"    def _extract_bdm(block_device_info):"},{"line_number":442,"context_line":"        \"\"\"Returns the block device mapping out of the block device info."},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":445,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":446,"context_line":"        represents one volume connection."},{"line_number":447,"context_line":"        \"\"\""},{"line_number":448,"context_line":"        if block_device_info is None:"},{"line_number":449,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_8a97b348","line":446,"range":{"start_line":442,"start_character":8,"end_line":446,"end_character":41},"in_reply_to":"9f91af0f_7fa24bb0","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":453,"context_line":"        \"\"\"Yields a bdm and volume driver.\"\"\""},{"line_number":454,"context_line":"        # Get a volume driver for each volume"},{"line_number":455,"context_line":"        for bdm in bdms or []:"},{"line_number":456,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_5fad0799","line":453,"range":{"start_line":453,"start_character":8,"end_line":453,"end_character":44},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":453,"context_line":"        \"\"\"Yields a bdm and volume driver.\"\"\""},{"line_number":454,"context_line":"        # Get a volume driver for each volume"},{"line_number":455,"context_line":"        for bdm in bdms or []:"},{"line_number":456,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_cab4dbf4","line":453,"range":{"start_line":453,"start_character":8,"end_line":453,"end_character":44},"in_reply_to":"9f91af0f_5fad0799","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":458,"context_line":"            if not conn_info:"},{"line_number":459,"context_line":"                continue"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":462,"context_line":"                self.adapter, instance, conn_info, stg_ftsk\u003dstg_ftsk)"},{"line_number":463,"context_line":"            yield bdm, vol_drv"},{"line_number":464,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_55ce312d","line":461,"updated":"2018-01-09 17:34:07.000000000","message":"another place to use build_volume_driver because we can\u0027t assume vSCSI","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":458,"context_line":"            if not conn_info:"},{"line_number":459,"context_line":"                continue"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter("},{"line_number":462,"context_line":"                self.adapter, instance, conn_info, stg_ftsk\u003dstg_ftsk)"},{"line_number":463,"context_line":"            yield bdm, vol_drv"},{"line_number":464,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_07871e64","line":461,"in_reply_to":"9f91af0f_55ce312d","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            yield bdm, vol_drv"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":466,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":467,"context_line":"        Connector information is a dictionary representing the ip of the"},{"line_number":468,"context_line":"        machine that will be making the connection, the name of the iscsi"},{"line_number":469,"context_line":"        initiator and the hostname of the machine as follows::"},{"line_number":470,"context_line":"            {"},{"line_number":471,"context_line":"                \u0027ip\u0027: ip,"},{"line_number":472,"context_line":"                \u0027initiator\u0027: initiator,"},{"line_number":473,"context_line":"                \u0027host\u0027: hostname"},{"line_number":474,"context_line":"            }"},{"line_number":475,"context_line":"        \"\"\""},{"line_number":476,"context_line":"        # Put the values in the connector"},{"line_number":477,"context_line":"        connector \u003d {}"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_df983776","line":475,"range":{"start_line":466,"start_character":0,"end_line":475,"end_character":11},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            yield bdm, vol_drv"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":466,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":467,"context_line":"        Connector information is a dictionary representing the ip of the"},{"line_number":468,"context_line":"        machine that will be making the connection, the name of the iscsi"},{"line_number":469,"context_line":"        initiator and the hostname of the machine as follows::"},{"line_number":470,"context_line":"            {"},{"line_number":471,"context_line":"                \u0027ip\u0027: ip,"},{"line_number":472,"context_line":"                \u0027initiator\u0027: initiator,"},{"line_number":473,"context_line":"                \u0027host\u0027: hostname"},{"line_number":474,"context_line":"            }"},{"line_number":475,"context_line":"        \"\"\""},{"line_number":476,"context_line":"        # Put the values in the connector"},{"line_number":477,"context_line":"        connector \u003d {}"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_0aa403b9","line":475,"range":{"start_line":466,"start_character":0,"end_line":475,"end_character":11},"in_reply_to":"9f91af0f_df983776","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"c9bacd5439a9e39c1a48fb7556ab4b8ae14b9976","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        fc_conn_info \u003d {\u0027driver_volume_type\u0027: \u0027fibre_channel\u0027}"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        fc_vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter(self.adapter, instance,"},{"line_number":482,"context_line":"                                                  fc_conn_info)"},{"line_number":483,"context_line":"        wwpn_list \u003d fc_vol_drv.wwpns()"},{"line_number":484,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_103d17c3","line":481,"updated":"2018-01-09 17:34:07.000000000","message":"just to be clear, I\u0027m actually ok with this here, as opposed to other places that assumed vscsi. Here we can, because we\u0027re just creating face connection info anyway.","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        fc_conn_info \u003d {\u0027driver_volume_type\u0027: \u0027fibre_channel\u0027}"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        fc_vol_drv \u003d vscsi.PVVscsiFCVolumeAdapter(self.adapter, instance,"},{"line_number":482,"context_line":"                                                  fc_conn_info)"},{"line_number":483,"context_line":"        wwpn_list \u003d fc_vol_drv.wwpns()"},{"line_number":484,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_2b230ebf","line":481,"in_reply_to":"9f91af0f_103d17c3","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        \"\"\""},{"line_number":434,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":437,"context_line":"        try:"},{"line_number":438,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":439,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_e21c5679","line":436,"updated":"2018-01-10 15:55:34.000000000","message":"I\u0027m curious why this is necessary, why it\u0027s done here rather than in the DetachVolume task, and why it\u0027s not necessary/done on attach_volume... ?","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        \"\"\""},{"line_number":434,"context_line":"        self._log_operation(\u0027detach_volume\u0027, instance)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        # Before attempting to detach a volume, ensure the instance exists."},{"line_number":437,"context_line":"        try:"},{"line_number":438,"context_line":"            # If we\u0027re able to get the property, then it exists."},{"line_number":439,"context_line":"            vm.get_vm_qp(self.adapter, vm.get_pvm_uuid(instance),"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_ad5369e2","line":436,"in_reply_to":"9f91af0f_e21c5679","updated":"2018-01-10 19:01:07.000000000","message":"This is only needed once live migration is added. Removing","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e7a2073ed9620a754dfd26da1e16411b60e54e97","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        # Run the flow"},{"line_number":415,"context_line":"        tf_base.run(flow, instance\u003dinstance)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # The volume connector may have updated the system metadata.  Save"},{"line_number":418,"context_line":"        # the instance to persist the data.  Spawn/destroy auto saves instance,"},{"line_number":419,"context_line":"        # but the attach does not.  Detach does not need this save - as the"},{"line_number":420,"context_line":"        # detach flows do not (currently) modify system metadata.  May need"},{"line_number":421,"context_line":"        # to revise in the future as volume connectors evolve."},{"line_number":422,"context_line":"        instance.save()"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def detach_volume(self, connection_info, instance, mountpoint,"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f96bb07_310b168f","line":421,"range":{"start_line":417,"start_character":0,"end_line":421,"end_character":62},"updated":"2018-01-11 20:22:49.000000000","message":"++ great comment","commit_id":"6df6df482d0836ede3533ac8fe164804545a4993"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        tf_base.run(flow, instance\u003dinstance)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def extend_volume(self, connection_info, instance):"},{"line_number":463,"context_line":"        \"\"\"Resize an attached volume."},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        :param connection_info: The connection info for the extended volume."},{"line_number":466,"context_line":"        :param instance: nova.objects.instance.Instance."}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_c1167aa8","line":463,"updated":"2018-03-20 13:55:58.000000000","message":"let\u0027s copy the docstring from the parent class","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        tf_base.run(flow, instance\u003dinstance)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def extend_volume(self, connection_info, instance):"},{"line_number":463,"context_line":"        \"\"\"Resize an attached volume."},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        :param connection_info: The connection info for the extended volume."},{"line_number":466,"context_line":"        :param instance: nova.objects.instance.Instance."}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_40c57b8d","line":463,"in_reply_to":"df7087c5_c1167aa8","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        # Determine if there are volumes to connect.  If so, add a connection"},{"line_number":216,"context_line":"        # for each type."},{"line_number":217,"context_line":"        for bdm, vol_drv in self._vol_drv_iter(context, instance, bdms,"},{"line_number":218,"context_line":"                                               stg_ftsk\u003dstg_ftsk):"},{"line_number":219,"context_line":"            # Connect the volume.  This will update the connection_info."},{"line_number":220,"context_line":"            flow_spawn.add(tf_stg.AttachVolume(vol_drv))"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_5c1f5fb6","line":217,"updated":"2018-04-20 15:24:55.000000000","message":"So the driver does support boot from volume now?\n\nIf so, I noticed that (1) the feature support matrix docs probably need to be updated to reflect that and (2) that the feature matrix docs don\u0027t mention support for quiesce and unquiesce which is used during snapshot of volume-backed instances - is that something that the driver can support? Maybe not necessarily in this already very large change (which could have been split up, btw).","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        # Determine if there are volumes to connect.  If so, add a connection"},{"line_number":216,"context_line":"        # for each type."},{"line_number":217,"context_line":"        for bdm, vol_drv in self._vol_drv_iter(context, instance, bdms,"},{"line_number":218,"context_line":"                                               stg_ftsk\u003dstg_ftsk):"},{"line_number":219,"context_line":"            # Connect the volume.  This will update the connection_info."},{"line_number":220,"context_line":"            flow_spawn.add(tf_stg.AttachVolume(vol_drv))"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_29148b43","line":217,"in_reply_to":"9f6a8fd7_5c1f5fb6","updated":"2018-04-23 21:30:24.000000000","message":"Boot from volume is not supported yet. This code block is used for spawning with volumes attached. Not sure on the quiesce, unquiesce. Would need to be investigated and tested, which I\u0027m also okay with pushing to a later change","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        vol_drv \u003d volume.build_volume_driver("},{"line_number":528,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":529,"context_line":"        vol_drv.extend_volume()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @staticmethod"},{"line_number":532,"context_line":"    def _extract_bdm(block_device_info):"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_bf6b0d1c","line":529,"updated":"2018-04-20 15:24:55.000000000","message":"Since this is just a pass, why even call it? I guess for the future if you have other volume types that actually need to do something for extend volume?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        vol_drv \u003d volume.build_volume_driver("},{"line_number":528,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":529,"context_line":"        vol_drv.extend_volume()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @staticmethod"},{"line_number":532,"context_line":"    def _extract_bdm(block_device_info):"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_7e11d75c","line":529,"in_reply_to":"9f6a8fd7_bf6b0d1c","updated":"2018-04-23 21:30:24.000000000","message":"Correct","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        vol_drv \u003d volume.build_volume_driver("},{"line_number":528,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":529,"context_line":"        vol_drv.extend_volume()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @staticmethod"},{"line_number":532,"context_line":"    def _extract_bdm(block_device_info):"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_04e16e2a","line":529,"in_reply_to":"9f6a8fd7_bf6b0d1c","updated":"2018-04-23 15:50:38.000000000","message":"exactly","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":528,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":529,"context_line":"        vol_drv.extend_volume()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @staticmethod"},{"line_number":532,"context_line":"    def _extract_bdm(block_device_info):"},{"line_number":533,"context_line":"        \"\"\"Returns the block device mapping out of the block device info."},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":536,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":537,"context_line":"        represents one volume connection."},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"        :param block_device_info: Information about block devices to be"},{"line_number":540,"context_line":"                                  attached to the instance"},{"line_number":541,"context_line":"        \"\"\""},{"line_number":542,"context_line":"        if block_device_info is None:"},{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_bc0c7b41","line":544,"range":{"start_line":531,"start_character":4,"end_line":544,"end_character":64},"updated":"2018-04-20 15:24:55.000000000","message":"You don\u0027t need this, the parent ComputeDriver class has block_device_info_get_mapping which can be used and does the same thing.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":528,"context_line":"            self.adapter, instance, connection_info)"},{"line_number":529,"context_line":"        vol_drv.extend_volume()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @staticmethod"},{"line_number":532,"context_line":"    def _extract_bdm(block_device_info):"},{"line_number":533,"context_line":"        \"\"\"Returns the block device mapping out of the block device info."},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        The block device mapping is a list of instances of block device"},{"line_number":536,"context_line":"        classes from nova.virt.block_device.  Each block device"},{"line_number":537,"context_line":"        represents one volume connection."},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"        :param block_device_info: Information about block devices to be"},{"line_number":540,"context_line":"                                  attached to the instance"},{"line_number":541,"context_line":"        \"\"\""},{"line_number":542,"context_line":"        if block_device_info is None:"},{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_2957ab5a","line":544,"range":{"start_line":531,"start_character":4,"end_line":544,"end_character":64},"in_reply_to":"9f6a8fd7_bc0c7b41","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        :param context: security context"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_bf11cd54","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":61},"updated":"2018-04-20 15:24:55.000000000","message":"storage_feedtask would be better, this isn\u0027t C or green screen programming fellas.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        :param context: security context"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_cad85d7c","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":61},"in_reply_to":"9f6a8fd7_bf11cd54","updated":"2018-04-23 15:50:38.000000000","message":"This is used in some long lines, which is probably why it was abbreviated, but the real issue with renaming it now is that it is used in so many places. It would be a very pervasive change. I\u0027d really like to leave this if we can.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        :param context: security context"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9e106baa","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":61},"in_reply_to":"9f6a8fd7_bf11cd54","updated":"2018-04-23 21:30:24.000000000","message":"We\u0027ve been using stg_ftsk everywhere prior to the change. I think the consistency is valuable. Leaving for now, if you feel strongly I can change here and elsewhere. If so I would prefer to do it everywhere in a follow up.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5651c0019ffb1a99a3b96ad88cbdac33128f87d","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            return []"},{"line_number":544,"context_line":"        return block_device_info.get(\u0027block_device_mapping\u0027, [])"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def _vol_drv_iter(self, context, instance, bdms, stg_ftsk\u003dNone):"},{"line_number":547,"context_line":"        \"\"\"Yields a bdm and volume driver."},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        :param context: security context"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_61f057fe","line":546,"range":{"start_line":546,"start_character":53,"end_line":546,"end_character":61},"in_reply_to":"9f6a8fd7_cad85d7c","updated":"2018-04-23 16:45:07.000000000","message":"Long lines can be folded, so that\u0027s not a good excuse. As for the pervasive nature of it, that\u0027s probably because of the out of tree driver, which I frankly don\u0027t care much about whether or not renaming this in the in-tree driver impacts the maintenance of the out of tree driver. I won\u0027t block the patch on renaming this, but will be annoyed for all time.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        # Get a volume driver for each volume"},{"line_number":555,"context_line":"        for bdm in bdms or []:"},{"line_number":556,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":557,"context_line":"            # if it doesn\u0027t have connection_info, it\u0027s not a volume"},{"line_number":558,"context_line":"            if not conn_info:"},{"line_number":559,"context_line":"                continue"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"},{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_5f33d1f6","line":559,"range":{"start_line":557,"start_character":12,"end_line":559,"end_character":24},"updated":"2018-04-20 15:24:55.000000000","message":"Umm, not necessarily, it just means it\u0027s not attached. BlockDeviceMapping.is_volume tells you if it\u0027s a volume.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ee2932d635aa7105fd2e64a6ceb5f4bc33202b47","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        # Get a volume driver for each volume"},{"line_number":555,"context_line":"        for bdm in bdms or []:"},{"line_number":556,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":557,"context_line":"            # if it doesn\u0027t have connection_info, it\u0027s not a volume"},{"line_number":558,"context_line":"            if not conn_info:"},{"line_number":559,"context_line":"                continue"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"},{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_44ed0ab5","line":559,"range":{"start_line":557,"start_character":12,"end_line":559,"end_character":24},"in_reply_to":"9f6a8fd7_246256d9","updated":"2018-04-24 14:47:27.000000000","message":"The ironic driver faced the same issue here. Using the same logic and adding a TODO to clean it up when ironic does.\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/ironic/driver.py#L392-L396","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c2118d8e984cb0bb14f1345d8e7dece78d2d5235","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        # Get a volume driver for each volume"},{"line_number":555,"context_line":"        for bdm in bdms or []:"},{"line_number":556,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":557,"context_line":"            # if it doesn\u0027t have connection_info, it\u0027s not a volume"},{"line_number":558,"context_line":"            if not conn_info:"},{"line_number":559,"context_line":"                continue"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"},{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"}],"source_content_type":"text/x-python","patch_set":45,"id":"5f7c97a3_d1fddeb1","line":559,"range":{"start_line":557,"start_character":12,"end_line":559,"end_character":24},"in_reply_to":"9f6a8fd7_44ed0ab5","updated":"2018-05-08 13:08:26.000000000","message":"https://review.openstack.org/#/c/564017/ is merged now.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        # Get a volume driver for each volume"},{"line_number":555,"context_line":"        for bdm in bdms or []:"},{"line_number":556,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":557,"context_line":"            # if it doesn\u0027t have connection_info, it\u0027s not a volume"},{"line_number":558,"context_line":"            if not conn_info:"},{"line_number":559,"context_line":"                continue"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"},{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_e853e437","line":559,"range":{"start_line":557,"start_character":12,"end_line":559,"end_character":24},"in_reply_to":"9f6a8fd7_5f33d1f6","updated":"2018-04-23 21:30:24.000000000","message":"Still working on this. This exposed an issue with how we are mocking the bdms which may cause significant changes in UT","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f475cbcdaebafce1ce757fa61cc990d9fb98fb6f","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        # Get a volume driver for each volume"},{"line_number":555,"context_line":"        for bdm in bdms or []:"},{"line_number":556,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":557,"context_line":"            # if it doesn\u0027t have connection_info, it\u0027s not a volume"},{"line_number":558,"context_line":"            if not conn_info:"},{"line_number":559,"context_line":"                continue"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"},{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_246256d9","line":559,"range":{"start_line":557,"start_character":12,"end_line":559,"end_character":24},"in_reply_to":"9f6a8fd7_5f33d1f6","updated":"2018-04-24 14:36:47.000000000","message":"The bdm here is a dict that can\u0027t access is_volume. Better to recreate the is_volume logic\n\nif bdm.get(\u0027destination_type\u0027) !\u003d \u0027volume\u0027\n\nOr update the bdm here so that it can use the is_volume prop?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"},{"line_number":563,"context_line":"            yield bdm, vol_drv"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":566,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        Connector information is a dictionary representing information about"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_7f457542","line":565,"updated":"2018-04-20 15:24:55.000000000","message":"Is there any reason we can\u0027t use os-brick for this? The libvirt and hyperv drivers use os-brick to get host connectors, so it seems like we\u0027d want to continue the adoption of that library by other virt drivers.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"},{"line_number":563,"context_line":"            yield bdm, vol_drv"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":566,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        Connector information is a dictionary representing information about"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_845ede73","line":565,"in_reply_to":"9f6a8fd7_7f457542","updated":"2018-04-23 15:50:38.000000000","message":"I really wish there was, but unfortunately no, I don\u0027t think that can work for PowerVM. I don\u0027t remember why anymore, but I know we looked at that.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":14532,"name":"Gerald McBrearty","email":"gfm@us.ibm.com","username":"gfm"},"change_message_id":"ac5f94445f402cafaf5859a71b9bdb0a644db676","unresolved":false,"context_lines":[{"line_number":562,"context_line":"                                                 conn_info, stg_ftsk\u003dstg_ftsk)"},{"line_number":563,"context_line":"            yield bdm, vol_drv"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":566,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        Connector information is a dictionary representing information about"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_e7c9c025","line":565,"in_reply_to":"9f6a8fd7_845ede73","updated":"2018-04-24 15:24:16.000000000","message":"The information for the connector comes back from a REST call as the information comes from the virtual IO server. This model is a bit different than the KVM os-brick model where we are running a command on the local KVM to determine the information.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        \"\"\""},{"line_number":539,"context_line":"        # Get a volume driver for each volume"},{"line_number":540,"context_line":"        for bdm in bdms or []:"},{"line_number":541,"context_line":"            # TODO(IBM): We should refactor the check below to something more"},{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_a0d87252","line":541,"updated":"2018-04-25 18:23:57.000000000","message":"TODO(IBM): isn\u0027t a thing, it should be TODO(esberglu). We don\u0027t have TODO(RedHat) all over the libvirt driver.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        \"\"\""},{"line_number":539,"context_line":"        # Get a volume driver for each volume"},{"line_number":540,"context_line":"        for bdm in bdms or []:"},{"line_number":541,"context_line":"            # TODO(IBM): We should refactor the check below to something more"},{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_a3648b4a","line":541,"in_reply_to":"9f6a8fd7_a0d87252","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4724e746076e8c9c99aa1d1cc61ccb8ccc6ff8f","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        \"\"\""},{"line_number":539,"context_line":"        # Get a volume driver for each volume"},{"line_number":540,"context_line":"        for bdm in bdms or []:"},{"line_number":541,"context_line":"            # TODO(IBM): We should refactor the check below to something more"},{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_ed3c3ae2","line":545,"range":{"start_line":541,"start_character":0,"end_line":545,"end_character":42},"updated":"2018-04-24 21:27:43.000000000","message":"See https://review.openstack.org/564017","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"eee4bec2cf2ba1d80517593a60fe2e0413fa99cd","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_4062cdd9","line":545,"range":{"start_line":545,"start_character":12,"end_line":545,"end_character":42},"updated":"2018-04-24 21:31:13.000000000","message":"This does not work.\n\nAttributeError: \u0027dict\u0027 object has no attribute \u0027_bdm_obj\u0027\n\nI also tried using the new patch [1] efried put up to expose is_volume. Same result.\n\nAttributeError: \u0027dict\u0027 object has no attribute \u0027is_volume\u0027\n\nIf anyone could shed some light that would be great.\n\n[1] https://review.openstack.org/#/c/564017/","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_23395b3e","line":545,"range":{"start_line":545,"start_character":12,"end_line":545,"end_character":42},"in_reply_to":"5f7c97a3_111d960e","updated":"2018-05-22 16:37:51.000000000","message":"This is working, must have been a problem with my test environment. But per mdbooth\u0027s comment it isn\u0027t actually needed.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c2118d8e984cb0bb14f1345d8e7dece78d2d5235","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_111d960e","line":545,"range":{"start_line":545,"start_character":12,"end_line":545,"end_character":42},"in_reply_to":"9f6a8fd7_0024be5c","updated":"2018-05-08 13:08:26.000000000","message":"https://review.openstack.org/#/c/564017/ is merged now; we should be able to use is_volume directly.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"87eb407ebd34a43935f6bee6ad035019e1f50018","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_a0d889ee","line":545,"range":{"start_line":545,"start_character":12,"end_line":545,"end_character":42},"in_reply_to":"9f6a8fd7_4062cdd9","updated":"2018-04-24 22:14:03.000000000","message":"You could:\n\n from nova.objects import block_device as bdmobj\n ...\n bdm \u003d bdmobj.BlockDeviceMapping(**bdm)\n\n...which should make is_volume work.  That seems like a hack, though.  Looking for mriedem\u0027s advice here.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            # elegant, as is_volume is not proxied through to the"},{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_0024be5c","line":545,"range":{"start_line":545,"start_character":12,"end_line":545,"end_character":42},"in_reply_to":"9f6a8fd7_a0d889ee","updated":"2018-04-25 18:23:57.000000000","message":"I pulled down efried\u0027s change and then this change and changed bdm._bdm_obj.is_volume to bdm.is_volume and the unit tests passed, so either the unit tests are broken, or your test environment is broken somehow.\n\nWhat I don\u0027t see is a test where you\u0027re using any BDMs that would have is_volume equate to False, like a destination_type\u003d\u0027local\u0027 BDM.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"76ab6b1f5d59e938bca1f90c7fd189f806ae75a3","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":549,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_19bcc267","line":546,"updated":"2018-05-09 13:32:16.000000000","message":"I believe this test is redundant anyway. Notice that the bdms we were passed were generated by:\n\n  bdms \u003d driver.block_device_info_get_mapping(block_device_info)\n\nThis method is poorly named. A better name would be block_device_info_get_volumes(). Anyway, it returns only volumes. You can see this from the code which generates it: driver.get_block_device_info:\n\n        \u0027block_device_mapping\u0027:\n            virt_block_device.convert_all_volumes(*block_device_mapping)","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            # DriverVolumeBlockDevice object. Until then, we are checking the"},{"line_number":544,"context_line":"            # underlying object\u0027s status."},{"line_number":545,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":546,"context_line":"                continue"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"            conn_info \u003d bdm.get(\u0027connection_info\u0027)"},{"line_number":549,"context_line":"            vol_drv \u003d volume.build_volume_driver(self.adapter, instance,"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_fe68daba","line":546,"in_reply_to":"5f7c97a3_19bcc267","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"}],"nova/virt/powervm/tasks/storage.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"a679a96b0770361e216214143db621e4e973d7e2","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class ConnectVolume(task.Task):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    \"\"\"The task to connect a volume to an instance.\"\"\""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_5c699e1e","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":19},"updated":"2017-12-07 21:45:27.000000000","message":"Need to rename all of the connect/disconnects as attach/detach","commit_id":"4dc9050a06603d0393ef8e53c88b397daa8265dc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        except exc.VolumeDetachFailed:"},{"line_number":61,"context_line":"            # Only log that the volume detach failed.  Should not be blocking"},{"line_number":62,"context_line":"            # due to being in the revert flow."},{"line_number":63,"context_line":"            LOG.exc(\"Unable to disconnect volume %s during rollback.\","},{"line_number":64,"context_line":"                          self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5b72f17c","line":63,"range":{"start_line":63,"start_character":16,"end_line":63,"end_character":19},"updated":"2017-12-08 16:35:30.000000000","message":"Is this a thing?  LOG.exception preferred.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        except exc.VolumeDetachFailed:"},{"line_number":61,"context_line":"            # Only log that the volume detach failed.  Should not be blocking"},{"line_number":62,"context_line":"            # due to being in the revert flow."},{"line_number":63,"context_line":"            LOG.exc(\"Unable to disconnect volume %s during rollback.\","},{"line_number":64,"context_line":"                          self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_d5c48af7","line":63,"range":{"start_line":63,"start_character":16,"end_line":63,"end_character":19},"in_reply_to":"df87a7cf_5b72f17c","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.vol_drv.disconnect_volume()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def revert(self, result, flow_failures):"},{"line_number":88,"context_line":"        # The parameters have to match the execute method, plus the response +"},{"line_number":89,"context_line":"        # failures even if only a subset are used."},{"line_number":90,"context_line":"        LOG.warning(\u0027Reconnecting volume %(vol)s on disconnect rollback.\u0027,"},{"line_number":91,"context_line":"                    {\u0027vol\u0027: self.vol_id}, instance\u003dself.vol_drv.instance)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_bb069dcd","line":89,"range":{"start_line":88,"start_character":0,"end_line":89,"end_character":50},"updated":"2017-12-08 16:35:30.000000000","message":"This is unnecessary.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.vol_drv.disconnect_volume()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def revert(self, result, flow_failures):"},{"line_number":88,"context_line":"        # The parameters have to match the execute method, plus the response +"},{"line_number":89,"context_line":"        # failures even if only a subset are used."},{"line_number":90,"context_line":"        LOG.warning(\u0027Reconnecting volume %(vol)s on disconnect rollback.\u0027,"},{"line_number":91,"context_line":"                    {\u0027vol\u0027: self.vol_id}, instance\u003dself.vol_drv.instance)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_55b07a8a","line":89,"range":{"start_line":88,"start_character":0,"end_line":89,"end_character":50},"in_reply_to":"df87a7cf_bb069dcd","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2f6d7087ced4bcbdb7b15d7ea5670ccfae4e56ee","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class SaveBDM(task.Task):"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    \"\"\"Task to save an updated block device mapping.\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def __init__(self, bdm, instance):"},{"line_number":115,"context_line":"        \"\"\"Creates the Task to save an updated block device mapping."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param bdm: The updated bdm."},{"line_number":118,"context_line":"        :param instance: The nova instance"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        self.bdm \u003d bdm"},{"line_number":121,"context_line":"        self.instance \u003d instance"},{"line_number":122,"context_line":"        super(SaveBDM, self).__init__(\u0027save_bdm_%s\u0027 % self.bdm.volume_id)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def execute(self):"},{"line_number":125,"context_line":"        LOG.info(\u0027Saving block device mapping for volume id %(vol_id)s.\u0027,"},{"line_number":126,"context_line":"                 {\u0027vol_id\u0027: self.bdm.volume_id}, instance\u003dself.instance)"},{"line_number":127,"context_line":"        self.bdm.save()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class CreateDiskForImg(task.Task):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_ab041d19","line":127,"range":{"start_line":110,"start_character":0,"end_line":127,"end_character":23},"updated":"2018-01-08 19:30:54.000000000","message":"This shouldn\u0027t be needed.","commit_id":"a19c2999bd96c08a12efd76a7668ef254f4c71f2"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"204a19df8787771bc25ccaae22d62290e840cc9e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class SaveBDM(task.Task):"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    \"\"\"Task to save an updated block device mapping.\"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def __init__(self, bdm, instance):"},{"line_number":115,"context_line":"        \"\"\"Creates the Task to save an updated block device mapping."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param bdm: The updated bdm."},{"line_number":118,"context_line":"        :param instance: The nova instance"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        self.bdm \u003d bdm"},{"line_number":121,"context_line":"        self.instance \u003d instance"},{"line_number":122,"context_line":"        super(SaveBDM, self).__init__(\u0027save_bdm_%s\u0027 % self.bdm.volume_id)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def execute(self):"},{"line_number":125,"context_line":"        LOG.info(\u0027Saving block device mapping for volume id %(vol_id)s.\u0027,"},{"line_number":126,"context_line":"                 {\u0027vol_id\u0027: self.bdm.volume_id}, instance\u003dself.instance)"},{"line_number":127,"context_line":"        self.bdm.save()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class CreateDiskForImg(task.Task):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_71de0412","line":127,"range":{"start_line":110,"start_character":0,"end_line":127,"end_character":23},"in_reply_to":"9f91af0f_ab041d19","updated":"2018-01-08 20:58:57.000000000","message":"Done","commit_id":"a19c2999bd96c08a12efd76a7668ef254f4c71f2"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, vol_drv):"},{"line_number":31,"context_line":"        \"\"\"Create the task."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        :param vol_drv: The volume driver (see volume folder).  Ties the"},{"line_number":34,"context_line":"                        storage to a connection type (ex. vSCSI or NPIV)."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_bf8e9376","line":34,"range":{"start_line":33,"start_character":8,"end_line":34,"end_character":72},"updated":"2018-01-08 23:12:20.000000000","message":"No NPIV","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, vol_drv):"},{"line_number":31,"context_line":"        \"\"\"Create the task."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        :param vol_drv: The volume driver (see volume folder).  Ties the"},{"line_number":34,"context_line":"                        storage to a connection type (ex. vSCSI or NPIV)."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_2bf8ee78","line":34,"range":{"start_line":33,"start_character":8,"end_line":34,"end_character":72},"in_reply_to":"9f91af0f_bf8e9376","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.vol_drv.attach_volume()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def revert(self, result, flow_failures):"},{"line_number":47,"context_line":"        # The parameters have to match the execute method, plus the response +"},{"line_number":48,"context_line":"        # failures even if only a subset are used."},{"line_number":49,"context_line":"        LOG.warning(\u0027Rolling back attachment for volume %(vol)s.\u0027,"},{"line_number":50,"context_line":"                    {\u0027vol\u0027: self.vol_id}, instance\u003dself.vol_drv.instance)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_3f7b637b","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":50},"updated":"2018-01-08 23:12:20.000000000","message":"Remove","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.vol_drv.attach_volume()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def revert(self, result, flow_failures):"},{"line_number":47,"context_line":"        # The parameters have to match the execute method, plus the response +"},{"line_number":48,"context_line":"        # failures even if only a subset are used."},{"line_number":49,"context_line":"        LOG.warning(\u0027Rolling back attachment for volume %(vol)s.\u0027,"},{"line_number":50,"context_line":"                    {\u0027vol\u0027: self.vol_id}, instance\u003dself.vol_drv.instance)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_ebed26b7","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":50},"in_reply_to":"9f91af0f_3f7b637b","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # the terminate attachment runs smoothly."},{"line_number":60,"context_line":"            self.vol_drv.detach_volume()"},{"line_number":61,"context_line":"        except exc.VolumeDetachFailed:"},{"line_number":62,"context_line":"            # Only log that the volume detach failed.  Should not be blocking"},{"line_number":63,"context_line":"            # due to being in the revert flow."},{"line_number":64,"context_line":"            LOG.exception(\"Unable to detach volume %s during rollback.\","},{"line_number":65,"context_line":"                          self.vol_id, instance\u003dself.vol_drv.instance)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_9fef0f1d","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":55},"updated":"2018-01-08 23:12:20.000000000","message":"Remove","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # the terminate attachment runs smoothly."},{"line_number":60,"context_line":"            self.vol_drv.detach_volume()"},{"line_number":61,"context_line":"        except exc.VolumeDetachFailed:"},{"line_number":62,"context_line":"            # Only log that the volume detach failed.  Should not be blocking"},{"line_number":63,"context_line":"            # due to being in the revert flow."},{"line_number":64,"context_line":"            LOG.exception(\"Unable to detach volume %s during rollback.\","},{"line_number":65,"context_line":"                          self.vol_id, instance\u003dself.vol_drv.instance)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_0b408aa4","line":62,"range":{"start_line":62,"start_character":12,"end_line":62,"end_character":55},"in_reply_to":"9f91af0f_9fef0f1d","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def __init__(self, vol_drv):"},{"line_number":73,"context_line":"        \"\"\"Create the task."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param vol_drv: The volume driver (see volume folder).  Ties the"},{"line_number":76,"context_line":"                        storage to a connection type (ex. vSCSI or NPIV)."},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":79,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_3ff043fd","line":76,"range":{"start_line":75,"start_character":7,"end_line":76,"end_character":72},"updated":"2018-01-08 23:12:20.000000000","message":"Ditto","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def __init__(self, vol_drv):"},{"line_number":73,"context_line":"        \"\"\"Create the task."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param vol_drv: The volume driver (see volume folder).  Ties the"},{"line_number":76,"context_line":"                        storage to a connection type (ex. vSCSI or NPIV)."},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":79,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_eb4206ab","line":76,"range":{"start_line":75,"start_character":7,"end_line":76,"end_character":72},"in_reply_to":"9f91af0f_3ff043fd","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ce809942feadda999ed57036fb0b338f3a2ba987","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            # if there is an operational error."},{"line_number":102,"context_line":"            self.vol_drv.attach_volume()"},{"line_number":103,"context_line":"        except exc.VolumeAttachFailed:"},{"line_number":104,"context_line":"            # Only log that the volume attach failed.  Should not be blocking"},{"line_number":105,"context_line":"            # due to being in the revert flow.  See comment above."},{"line_number":106,"context_line":"            LOG.exception(\"Unable to reattach volume %s during rollback.\","},{"line_number":107,"context_line":"                self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_9fd86f7b","line":105,"range":{"start_line":104,"start_character":12,"end_line":105,"end_character":66},"updated":"2018-01-08 23:12:20.000000000","message":"Update","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"2c824c73fc0d6d09312c40d7bbdcc210535b1eba","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            # if there is an operational error."},{"line_number":102,"context_line":"            self.vol_drv.attach_volume()"},{"line_number":103,"context_line":"        except exc.VolumeAttachFailed:"},{"line_number":104,"context_line":"            # Only log that the volume attach failed.  Should not be blocking"},{"line_number":105,"context_line":"            # due to being in the revert flow.  See comment above."},{"line_number":106,"context_line":"            LOG.exception(\"Unable to reattach volume %s during rollback.\","},{"line_number":107,"context_line":"                self.vol_id, instance\u003dself.vol_drv.instance)"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_cb1e22ba","line":105,"range":{"start_line":104,"start_character":12,"end_line":105,"end_character":66},"in_reply_to":"9f91af0f_9fd86f7b","updated":"2018-01-09 20:26:18.000000000","message":"Done","commit_id":"e63e33a9fec86d3d01e3f2c9af9cf2f46a6060d3"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        super(AttachVolume, self).__init__(\u0027attach_vol_%s\u0027 % self.vol_id)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def execute(self):"},{"line_number":42,"context_line":"        LOG.info(\u0027Attaching volume %(vol)s.\u0027, {\u0027vol\u0027: self.vol_id},"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_415a6a50","line":39,"range":{"start_line":39,"start_character":43,"end_line":39,"end_character":72},"updated":"2018-03-20 13:55:58.000000000","message":"name\u003d","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        super(AttachVolume, self).__init__(\u0027attach_vol_%s\u0027 % self.vol_id)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def execute(self):"},{"line_number":42,"context_line":"        LOG.info(\u0027Attaching volume %(vol)s.\u0027, {\u0027vol\u0027: self.vol_id},"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_a0f577ef","line":39,"range":{"start_line":39,"start_character":43,"end_line":39,"end_character":72},"in_reply_to":"df7087c5_415a6a50","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"0ff9bc4626b07bc32721008d91b7dfcb71394d89","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        super(DetachVolume, self).__init__("},{"line_number":79,"context_line":"            \u0027detach_vol_%s\u0027 % self.vol_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def execute(self):"},{"line_number":82,"context_line":"        LOG.info(\u0027Detaching volume %(vol)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_e1585e57","line":79,"range":{"start_line":79,"start_character":12,"end_line":79,"end_character":41},"updated":"2018-03-20 13:55:58.000000000","message":"name\u003d","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"56a0556f38fc4cecdf31cbdd44dd957cc19b6eaa","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        super(DetachVolume, self).__init__("},{"line_number":79,"context_line":"            \u0027detach_vol_%s\u0027 % self.vol_id)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def execute(self):"},{"line_number":82,"context_line":"        LOG.info(\u0027Detaching volume %(vol)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"df7087c5_60d75f51","line":79,"range":{"start_line":79,"start_character":12,"end_line":79,"end_character":41},"in_reply_to":"df7087c5_e1585e57","updated":"2018-03-20 18:50:29.000000000","message":"Done","commit_id":"56db2e4e4d1cf0adb014684baa5a8bde27e2a29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                        type (ex. vSCSI)."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        super(AttachVolume, self).__init__(name\u003d\u0027attach_vol_%s\u0027 % self.vol_id)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9f6ba9b5","line":37,"range":{"start_line":37,"start_character":22,"end_line":37,"end_character":71},"updated":"2018-04-20 15:24:55.000000000","message":"Use this utility method to be safe:\n\nhttps://github.com/openstack/nova/blob/64e503d82fe5966cb50b650b3309a7fc36c63cda/nova/virt/block_device.py#L901\n\nThe connection_info dict is unstructured sillyness based on which storage backend in cinder you\u0027re using, so lets use the utility we have to try and sort it out.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                        type (ex. vSCSI)."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":37,"context_line":"        self.vol_id \u003d self.vol_drv.connection_info[\u0027data\u0027][\u0027volume_id\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        super(AttachVolume, self).__init__(name\u003d\u0027attach_vol_%s\u0027 % self.vol_id)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_a40682cd","line":37,"range":{"start_line":37,"start_character":22,"end_line":37,"end_character":71},"in_reply_to":"9f6a8fd7_9f6ba9b5","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4724e746076e8c9c99aa1d1cc61ccb8ccc6ff8f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                        type (ex. vSCSI)."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        self.vol_drv \u003d vol_drv"},{"line_number":38,"context_line":"        self.vol_id \u003d block_device.get_volume_id(self.vol_drv.connection_info)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        super(AttachVolume, self).__init__(name\u003d\u0027attach_vol_%s\u0027 % self.vol_id)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_cd129662","line":38,"range":{"start_line":38,"start_character":22,"end_line":38,"end_character":49},"updated":"2018-04-24 21:27:43.000000000","message":"ooo, let\u0027s get this back to OOT.","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"}],"nova/virt/powervm/volume/__init__.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, 2017 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_b8496961","line":1,"updated":"2018-01-10 21:57:43.000000000","message":"2018","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, 2017 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_a8503434","line":1,"in_reply_to":"7f96bb07_b8496961","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"}],"nova/virt/powervm/volume/fcvscsi.py":[{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"1b68bbed6726ea51978c597337880addb7b342f3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    # Use a global variable so this is pulled once when the process starts."},{"line_number":52,"context_line":"    global _vscsi_pfc_wwpns"},{"line_number":53,"context_line":"    if _vscsi_pfc_wwpns is None:"},{"line_number":54,"context_line":"        _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(adapter)"},{"line_number":55,"context_line":"    return _vscsi_pfc_wwpns"}],"source_content_type":"text/x-python","patch_set":39,"id":"df7087c5_23d5f1e5","line":52,"updated":"2018-03-20 19:58:35.000000000","message":"pypowervm 1.1.12 will do this caching for us, so we\u0027ll need to respin to take advantage of that once 1.1.12 is in requirements.","commit_id":"d3da69f8c8e0d3d846ba4157eaf4a12a6553e872"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"30e08e1c6c0f0878376c227f79a21ee3f8ccbf9c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    # Use a global variable so this is pulled once when the process starts."},{"line_number":52,"context_line":"    global _vscsi_pfc_wwpns"},{"line_number":53,"context_line":"    if _vscsi_pfc_wwpns is None:"},{"line_number":54,"context_line":"        _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(adapter)"},{"line_number":55,"context_line":"    return _vscsi_pfc_wwpns"}],"source_content_type":"text/x-python","patch_set":39,"id":"df7087c5_1a923558","line":52,"in_reply_to":"df7087c5_23d5f1e5","updated":"2018-03-23 14:58:38.000000000","message":"...but we can do that in a followon.","commit_id":"d3da69f8c8e0d3d846ba4157eaf4a12a6553e872"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"df85a29ebb29f792b13e76b192a82600e3fe9168","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    # Use a global variable so this is pulled once when the process starts."},{"line_number":52,"context_line":"    global _vscsi_pfc_wwpns"},{"line_number":53,"context_line":"    if _vscsi_pfc_wwpns is None:"},{"line_number":54,"context_line":"        _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(adapter)"},{"line_number":55,"context_line":"    return _vscsi_pfc_wwpns"}],"source_content_type":"text/x-python","patch_set":40,"id":"df7087c5_5d41ab38","line":52,"updated":"2018-03-27 14:08:35.000000000","message":"rework with pypowervm 1.1.12","commit_id":"512698df35157d6a7e8c153af28e185c163ad64d"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"878697a4434c61ab39df505c560f61c9b1b20970","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    # Use a global variable so this is pulled once when the process starts."},{"line_number":52,"context_line":"    global _vscsi_pfc_wwpns"},{"line_number":53,"context_line":"    if _vscsi_pfc_wwpns is None:"},{"line_number":54,"context_line":"        _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(adapter)"},{"line_number":55,"context_line":"    return _vscsi_pfc_wwpns"}],"source_content_type":"text/x-python","patch_set":40,"id":"bf659307_90fcc1b5","line":52,"in_reply_to":"df7087c5_5d41ab38","updated":"2018-04-02 16:36:41.000000000","message":"Done","commit_id":"512698df35157d6a7e8c153af28e185c163ad64d"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"dae4e99c82b442f6f293fdbf9efb7569525ea63a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    return pvm_tpar.get_physical_wwpns(adapter, force_refresh\u003dFalse)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FCVscsiVolumeAdapter(object):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf659307_d0ceb958","line":51,"updated":"2018-04-02 16:49:16.000000000","message":"will need to bump pypowervm in requirements.txt for this to work. Probably make that a separate commit that references this one.","commit_id":"e30b563d0ab43014149dcb58a3947bfc044dafba"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f91cc1b682cf27eb57ce29f4841b3532763c3274","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :return: The list of WWPNs that need to be included in the zone set."},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    return pvm_tpar.get_physical_wwpns(adapter, force_refresh\u003dFalse)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class FCVscsiVolumeAdapter(object):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf659307_26433f15","line":51,"in_reply_to":"bf659307_d0ceb958","updated":"2018-04-02 18:42:06.000000000","message":"Done","commit_id":"e30b563d0ab43014149dcb58a3947bfc044dafba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        Every driver must implement this method if the default impl will"},{"line_number":83,"context_line":"        not work for their data."},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return self.connection_info[\u0027serial\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def reset_stg_ftsk(self, stg_ftsk\u003dNone):"},{"line_number":88,"context_line":"        \"\"\"Resets the pypowervm transaction FeedTask to a new value."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_5fe4313c","line":85,"range":{"start_line":85,"start_character":15,"end_line":85,"end_character":45},"updated":"2018-04-20 15:24:55.000000000","message":"Use https://github.com/openstack/nova/blob/64e503d82fe5966cb50b650b3309a7fc36c63cda/nova/virt/block_device.py#L901\n\nNote that what you\u0027re doing here to get the volume_id is different from in the task flows, hence my point about (in)consistency.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        Every driver must implement this method if the default impl will"},{"line_number":83,"context_line":"        not work for their data."},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return self.connection_info[\u0027serial\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def reset_stg_ftsk(self, stg_ftsk\u003dNone):"},{"line_number":88,"context_line":"        \"\"\"Resets the pypowervm transaction FeedTask to a new value."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_c4a7f6bc","line":85,"range":{"start_line":85,"start_character":15,"end_line":85,"end_character":45},"in_reply_to":"9f6a8fd7_5fe4313c","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return self.connection_info[\u0027serial\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def reset_stg_ftsk(self, stg_ftsk\u003dNone):"},{"line_number":88,"context_line":"        \"\"\"Resets the pypowervm transaction FeedTask to a new value."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        The previous updates from the original FeedTask WILL NOT be migrated"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_7fe1f529","line":87,"range":{"start_line":87,"start_character":14,"end_line":87,"end_character":22},"updated":"2018-04-20 15:24:55.000000000","message":"storage_feedtask","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        return self.connection_info[\u0027serial\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def reset_stg_ftsk(self, stg_ftsk\u003dNone):"},{"line_number":88,"context_line":"        \"\"\"Resets the pypowervm transaction FeedTask to a new value."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        The previous updates from the original FeedTask WILL NOT be migrated"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9eeceb8f","line":87,"range":{"start_line":87,"start_character":14,"end_line":87,"end_character":22},"in_reply_to":"9f6a8fd7_7fe1f529","updated":"2018-04-23 21:30:24.000000000","message":"See other comment","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            return self.connection_info[\u0027data\u0027][UDID_KEY]"},{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_3f3e1d8c","line":123,"range":{"start_line":123,"start_character":64,"end_line":123,"end_character":67},"updated":"2018-04-20 15:24:55.000000000","message":"What is LPM?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            return self.connection_info[\u0027data\u0027][UDID_KEY]"},{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_3e3a7acb","line":123,"range":{"start_line":123,"start_character":64,"end_line":123,"end_character":67},"in_reply_to":"9f6a8fd7_0ffd07b0","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            return self.connection_info[\u0027data\u0027][UDID_KEY]"},{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_0ffd07b0","line":123,"range":{"start_line":123,"start_character":64,"end_line":123,"end_character":67},"in_reply_to":"9f6a8fd7_3f3e1d8c","updated":"2018-04-23 15:50:38.000000000","message":"Live Partition Mobility, i.e. live migration. Probably better to say \"live migrate\" here.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            return self.connection_info[\u0027data\u0027][UDID_KEY]"},{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9ebaab6b","line":123,"range":{"start_line":123,"start_character":64,"end_line":123,"end_character":67},"in_reply_to":"9f6a8fd7_3f3e1d8c","updated":"2018-04-23 21:30:24.000000000","message":"Live partition migration","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9f4c0943","line":124,"range":{"start_line":124,"start_character":41,"end_line":124,"end_character":50},"updated":"2018-04-20 15:24:55.000000000","message":"target_UDID?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        except (KeyError, ValueError):"},{"line_number":122,"context_line":"            # It\u0027s common to lose our specific data in the BDM.  The connection"},{"line_number":123,"context_line":"            # information can be \u0027refreshed\u0027 by operations like LPM and resize"},{"line_number":124,"context_line":"            LOG.info(\u0027Failed to retrieve device_id key from BDM for volume id \u0027"},{"line_number":125,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":126,"context_line":"            return None"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_de52633b","line":124,"range":{"start_line":124,"start_character":41,"end_line":124,"end_character":50},"in_reply_to":"9f6a8fd7_9f4c0943","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        status, device_name, udid \u003d self._discover_volume_on_vios(vios_w)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        if hdisk.good_discovery(status, device_name):"},{"line_number":187,"context_line":"            volume_id \u003d self.connection_info[\"data\"][\"volume_id\"]"},{"line_number":188,"context_line":"            # Found a hdisk on this Virtual I/O Server.  Add the action to"},{"line_number":189,"context_line":"            # map it to the VM when the stg_ftsk is executed."},{"line_number":190,"context_line":"            with lockutils.lock(hash(self)):"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_1f8c7934","line":187,"range":{"start_line":187,"start_character":24,"end_line":187,"end_character":65},"updated":"2018-04-20 15:24:55.000000000","message":"self.volume_id","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        status, device_name, udid \u003d self._discover_volume_on_vios(vios_w)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        if hdisk.good_discovery(status, device_name):"},{"line_number":187,"context_line":"            volume_id \u003d self.connection_info[\"data\"][\"volume_id\"]"},{"line_number":188,"context_line":"            # Found a hdisk on this Virtual I/O Server.  Add the action to"},{"line_number":189,"context_line":"            # map it to the VM when the stg_ftsk is executed."},{"line_number":190,"context_line":"            with lockutils.lock(hash(self)):"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_690cc3eb","line":187,"range":{"start_line":187,"start_character":24,"end_line":187,"end_character":65},"in_reply_to":"9f6a8fd7_1f8c7934","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        :param vios_w: VIOS wrapper to process"},{"line_number":216,"context_line":"        :returns: Status of the volume or None"},{"line_number":217,"context_line":"        :returns: Device name or None"},{"line_number":218,"context_line":"        :returns: LUN or None"},{"line_number":219,"context_line":"        \"\"\""},{"line_number":220,"context_line":"        # Get the initiatior WWPNs, targets and Lun for the given VIOS."},{"line_number":221,"context_line":"        vio_wwpns, t_wwpns, lun \u003d self._get_hdisk_itls(vios_w)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_3f961d41","line":218,"range":{"start_line":218,"start_character":18,"end_line":218,"end_character":21},"updated":"2018-04-20 15:24:55.000000000","message":"UDID?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        :param vios_w: VIOS wrapper to process"},{"line_number":216,"context_line":"        :returns: Status of the volume or None"},{"line_number":217,"context_line":"        :returns: Device name or None"},{"line_number":218,"context_line":"        :returns: LUN or None"},{"line_number":219,"context_line":"        \"\"\""},{"line_number":220,"context_line":"        # Get the initiatior WWPNs, targets and Lun for the given VIOS."},{"line_number":221,"context_line":"        vio_wwpns, t_wwpns, lun \u003d self._get_hdisk_itls(vios_w)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_9ed38bd5","line":218,"range":{"start_line":218,"start_character":18,"end_line":218,"end_character":21},"in_reply_to":"9f6a8fd7_3f961d41","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            LOG.warning(\u0027Discovered device %(dev)s for volume %(volume)s \u0027"},{"line_number":243,"context_line":"                        \u0027on %(vios)s is in use. Error code: %(status)s.\u0027,"},{"line_number":244,"context_line":"                        {\u0027dev\u0027: device_name, \u0027volume\u0027: self.volume_id,"},{"line_number":245,"context_line":"                         \u0027vios\u0027: vios_w.name, \u0027status\u0027: str(status)},"},{"line_number":246,"context_line":"                        instance\u003dself.instance)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        return status, device_name, udid"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_bfca2d4b","line":245,"range":{"start_line":245,"start_character":60,"end_line":245,"end_character":66},"updated":"2018-04-20 15:24:55.000000000","message":"Is this an int so str() is safe?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            LOG.warning(\u0027Discovered device %(dev)s for volume %(volume)s \u0027"},{"line_number":243,"context_line":"                        \u0027on %(vios)s is in use. Error code: %(status)s.\u0027,"},{"line_number":244,"context_line":"                        {\u0027dev\u0027: device_name, \u0027volume\u0027: self.volume_id,"},{"line_number":245,"context_line":"                         \u0027vios\u0027: vios_w.name, \u0027status\u0027: str(status)},"},{"line_number":246,"context_line":"                        instance\u003dself.instance)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        return status, device_name, udid"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_cfe38fd8","line":245,"range":{"start_line":245,"start_character":60,"end_line":245,"end_character":66},"in_reply_to":"9f6a8fd7_bfca2d4b","updated":"2018-04-23 15:50:38.000000000","message":"I checked and this is already a string, so the str() just appears unnecessary and should be removed.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            LOG.warning(\u0027Discovered device %(dev)s for volume %(volume)s \u0027"},{"line_number":243,"context_line":"                        \u0027on %(vios)s is in use. Error code: %(status)s.\u0027,"},{"line_number":244,"context_line":"                        {\u0027dev\u0027: device_name, \u0027volume\u0027: self.volume_id,"},{"line_number":245,"context_line":"                         \u0027vios\u0027: vios_w.name, \u0027status\u0027: str(status)},"},{"line_number":246,"context_line":"                        instance\u003dself.instance)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        return status, device_name, udid"}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_1e42163f","line":245,"range":{"start_line":245,"start_character":60,"end_line":245,"end_character":66},"in_reply_to":"9f6a8fd7_cfe38fd8","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        partition_id \u003d vm.get_vm_qp(self.adapter, self.vm_uuid,"},{"line_number":385,"context_line":"                                    qprop\u003d\u0027PartitionID\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        with lockutils.lock(hash(self)):"},{"line_number":388,"context_line":"            self._add_remove_mapping(partition_id, vios_w.uuid,"},{"line_number":389,"context_line":"                                     device_name)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_1f2d59fd","line":387,"range":{"start_line":387,"start_character":28,"end_line":387,"end_character":38},"updated":"2018-04-20 15:24:55.000000000","message":"this looks kinda weird - why not lock on the volume_id or something?","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        partition_id \u003d vm.get_vm_qp(self.adapter, self.vm_uuid,"},{"line_number":385,"context_line":"                                    qprop\u003d\u0027PartitionID\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        with lockutils.lock(hash(self)):"},{"line_number":388,"context_line":"            self._add_remove_mapping(partition_id, vios_w.uuid,"},{"line_number":389,"context_line":"                                     device_name)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_de47be4b","line":387,"range":{"start_line":387,"start_character":28,"end_line":387,"end_character":38},"in_reply_to":"9f6a8fd7_1f2d59fd","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":461,"context_line":"            vios_scsi_mappings, None,"},{"line_number":462,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        LOG.info(\"%(num)d storage mapping(s) found for %(dev)s on VIOS \""},{"line_number":465,"context_line":"                 \"%(vios)s\", {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":466,"context_line":"                              \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":467,"context_line":"        # The mapping is still present as the task feed removes it later."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_3f1b7dd0","line":464,"range":{"start_line":464,"start_character":12,"end_line":464,"end_character":16},"updated":"2018-04-20 15:24:55.000000000","message":"This seems like debug, not info level type information.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":461,"context_line":"            vios_scsi_mappings, None,"},{"line_number":462,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        LOG.info(\"%(num)d storage mapping(s) found for %(dev)s on VIOS \""},{"line_number":465,"context_line":"                 \"%(vios)s\", {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":466,"context_line":"                              \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":467,"context_line":"        # The mapping is still present as the task feed removes it later."}],"source_content_type":"text/x-python","patch_set":45,"id":"9f6a8fd7_1e71bb0c","line":464,"range":{"start_line":464,"start_character":12,"end_line":464,"end_character":16},"in_reply_to":"9f6a8fd7_3f1b7dd0","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4724e746076e8c9c99aa1d1cc61ccb8ccc6ff8f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        Every driver must implement this method if the default impl will"},{"line_number":84,"context_line":"        not work for their data."},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        return block_device.get_volume_id(self.connection_info)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def reset_stg_ftsk(self, stg_ftsk\u003dNone):"},{"line_number":89,"context_line":"        \"\"\"Resets the pypowervm transaction FeedTask to a new value."}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_4d068622","line":86,"range":{"start_line":86,"start_character":15,"end_line":86,"end_character":63},"updated":"2018-04-24 21:27:43.000000000","message":"ditto","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4ef7e866ff3827d3039f4d00ef2a5687a139366","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        LOG.debug(\"%(num)d storage mapping(s) found for %(dev)s on VIOS \""},{"line_number":466,"context_line":"                 \"%(vios)s\", {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":467,"context_line":"                              \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":468,"context_line":"        # The mapping is still present as the task feed removes it later."},{"line_number":469,"context_line":"        return len(mappings) \u003e 1"}],"source_content_type":"text/x-python","patch_set":46,"id":"9f6a8fd7_20a0e28f","line":466,"updated":"2018-04-25 18:23:57.000000000","message":"nit: fix the alignment with the string above","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"f2dda171fcf70abc77553d1bb543c643af8fec4d","unresolved":false,"context_lines":[{"line_number":463,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        LOG.debug(\"%(num)d storage mapping(s) found for %(dev)s on VIOS \""},{"line_number":466,"context_line":"                 \"%(vios)s\", {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":467,"context_line":"                              \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":468,"context_line":"        # The mapping is still present as the task feed removes it later."},{"line_number":469,"context_line":"        return len(mappings) \u003e 1"}],"source_content_type":"text/x-python","patch_set":46,"id":"5f7c97a3_6337534f","line":466,"in_reply_to":"9f6a8fd7_20a0e28f","updated":"2018-05-22 16:37:51.000000000","message":"Done","commit_id":"ef82635de848aa558ad9a013f640d70a134160be"}],"nova/virt/powervm/volume/vscsi.py":[{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"a679a96b0770361e216214143db621e4e973d7e2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015, 2017 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_5c80bec0","line":1,"updated":"2017-12-07 21:45:27.000000000","message":"Reorganize this","commit_id":"4dc9050a06603d0393ef8e53c88b397daa8265dc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df87a7cf_3efb5b79","updated":"2017-12-08 16:35:30.000000000","message":"Think we\u0027re missing the tests for this guy.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df87a7cf_87a1f348","in_reply_to":"df87a7cf_3efb5b79","updated":"2017-12-13 16:10:50.000000000","message":"Will add UT next patch","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.reset_stg_ftsk(stg_ftsk\u003dstg_ftsk)"},{"line_number":69,"context_line":"        self._pfc_wwpns \u003d None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @classmethod"},{"line_number":72,"context_line":"    def min_xags(cls):"},{"line_number":73,"context_line":"        \"\"\"List of pypowervm XAGs needed to support this adapter.\"\"\""},{"line_number":74,"context_line":"        # SCSI mapping is for the connections between VIOS and client VM"},{"line_number":75,"context_line":"        return [pvm_const.XAG.VIO_SMAP]"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"},{"line_number":78,"context_line":"    def vol_type(cls):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_fbe1859c","line":75,"range":{"start_line":71,"start_character":0,"end_line":75,"end_character":39},"updated":"2017-12-08 16:35:30.000000000","message":"inline this for now.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.reset_stg_ftsk(stg_ftsk\u003dstg_ftsk)"},{"line_number":69,"context_line":"        self._pfc_wwpns \u003d None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @classmethod"},{"line_number":72,"context_line":"    def min_xags(cls):"},{"line_number":73,"context_line":"        \"\"\"List of pypowervm XAGs needed to support this adapter.\"\"\""},{"line_number":74,"context_line":"        # SCSI mapping is for the connections between VIOS and client VM"},{"line_number":75,"context_line":"        return [pvm_const.XAG.VIO_SMAP]"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"},{"line_number":78,"context_line":"    def vol_type(cls):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_f5a8ae20","line":75,"range":{"start_line":71,"start_character":0,"end_line":75,"end_character":39},"in_reply_to":"df87a7cf_fbe1859c","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # SCSI mapping is for the connections between VIOS and client VM"},{"line_number":75,"context_line":"        return [pvm_const.XAG.VIO_SMAP]"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"},{"line_number":78,"context_line":"    def vol_type(cls):"},{"line_number":79,"context_line":"        \"\"\"The type of volume supported by this type.\"\"\""},{"line_number":80,"context_line":"        return \u0027vscsi\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @property"},{"line_number":83,"context_line":"    def vm_id(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_de2eef90","line":80,"range":{"start_line":77,"start_character":1,"end_line":80,"end_character":22},"updated":"2017-12-08 16:35:30.000000000","message":"I don\u0027t think we need this at the moment.  I think it\u0027s only used for init_recreate_map, which is slot manager stuff,  which we should be omitting at this time.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        # SCSI mapping is for the connections between VIOS and client VM"},{"line_number":75,"context_line":"        return [pvm_const.XAG.VIO_SMAP]"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"},{"line_number":78,"context_line":"    def vol_type(cls):"},{"line_number":79,"context_line":"        \"\"\"The type of volume supported by this type.\"\"\""},{"line_number":80,"context_line":"        return \u0027vscsi\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @property"},{"line_number":83,"context_line":"    def vm_id(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_956fe2fa","line":80,"range":{"start_line":77,"start_character":1,"end_line":80,"end_character":22},"in_reply_to":"df87a7cf_de2eef90","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return \u0027vscsi\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @property"},{"line_number":83,"context_line":"    def vm_id(self):"},{"line_number":84,"context_line":"        \"\"\"Return the short ID (not UUID) of the LPAR for our instance."},{"line_number":85,"context_line":"        This method is unavailable during a pre live migration call since"},{"line_number":86,"context_line":"        there is no instance of the VM on the destination host at the time."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5ec41f91","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":13},"updated":"2017-12-08 16:35:30.000000000","message":"Is this used?","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return \u0027vscsi\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    @property"},{"line_number":83,"context_line":"    def vm_id(self):"},{"line_number":84,"context_line":"        \"\"\"Return the short ID (not UUID) of the LPAR for our instance."},{"line_number":85,"context_line":"        This method is unavailable during a pre live migration call since"},{"line_number":86,"context_line":"        there is no instance of the VM on the destination host at the time."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_f57d0eb2","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":13},"in_reply_to":"df87a7cf_5ec41f91","updated":"2017-12-13 16:10:50.000000000","message":"Nope, done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(self.adapter)"},{"line_number":126,"context_line":"        return _vscsi_pfc_wwpns"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _set_udid(self, udid):"},{"line_number":129,"context_line":"        \"\"\"This method will set the hdisk udid in the connection_info."},{"line_number":130,"context_line":"        :param udid: The hdisk target_udid to be stored in system_metadata"},{"line_number":131,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_fe6ad37e","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":17},"updated":"2017-12-08 16:35:30.000000000","message":"Inline this if you like.\n\nBut don\u0027t inline _get_udid; so if you prefer to keep this one for symmetry, that\u0027s okay too.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            _vscsi_pfc_wwpns \u003d pvm_tpar.get_physical_wwpns(self.adapter)"},{"line_number":126,"context_line":"        return _vscsi_pfc_wwpns"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _set_udid(self, udid):"},{"line_number":129,"context_line":"        \"\"\"This method will set the hdisk udid in the connection_info."},{"line_number":130,"context_line":"        :param udid: The hdisk target_udid to be stored in system_metadata"},{"line_number":131,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_75433e6d","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":17},"in_reply_to":"df87a7cf_fe6ad37e","updated":"2017-12-13 16:10:50.000000000","message":"I\u0027d prefer symmetry","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":145,"context_line":"            return None"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def connect_volume(self):"},{"line_number":148,"context_line":"        \"\"\"Connects the volume.\"\"\""},{"line_number":149,"context_line":"        # Check if the VM is in a state where the attach is acceptable."},{"line_number":150,"context_line":"        lpar_w \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":151,"context_line":"        capable, reason \u003d lpar_w.can_modify_io()"},{"line_number":152,"context_line":"        if not capable:"},{"line_number":153,"context_line":"            raise exc.VolumeAttachFailed("},{"line_number":154,"context_line":"                volume_id\u003dself.volume_id, reason\u003dreason)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Run the connect"},{"line_number":157,"context_line":"        self._connect_volume()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if self.stg_ftsk.name \u003d\u003d LOCAL_FEED_TASK:"},{"line_number":160,"context_line":"            self.stg_ftsk.execute()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _connect_volume(self):"},{"line_number":163,"context_line":"        \"\"\"Connects the volume."},{"line_number":164,"context_line":"        :param connect_volume_to_vio: Function to connect a volume to the vio."},{"line_number":165,"context_line":"                                      :param vios_w: Vios wrapper."},{"line_number":166,"context_line":"                                      :return: True if mapping was created."},{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Its about to get weird.  The transaction manager has a list of"},{"line_number":170,"context_line":"        # VIOSes.  We could use those, but they only have SCSI mappings (by"},{"line_number":171,"context_line":"        # design).  They do not have storage (super expensive)."},{"line_number":172,"context_line":"        #"},{"line_number":173,"context_line":"        # We need the storage xag when we are determining which mappings to"},{"line_number":174,"context_line":"        # add to the system.  But we don\u0027t want to tie it to the stg_ftsk.  If"},{"line_number":175,"context_line":"        # we do, every retry, every etag gather, etc... takes MUCH longer."},{"line_number":176,"context_line":"        #"},{"line_number":177,"context_line":"        # So we get the VIOSes with the storage xag here, separately, to save"},{"line_number":178,"context_line":"        # the stg_ftsk from potentially having to run it multiple times."},{"line_number":179,"context_line":"        connect_ftsk \u003d pvm_tx.FeedTask("},{"line_number":180,"context_line":"            \u0027connect_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":181,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":182,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":185,"context_line":"        connect_ftsk.add_functor_subtask("},{"line_number":186,"context_line":"            self._connect_volume_to_vio, provides\u003d\u0027vio_modified\u0027,"},{"line_number":187,"context_line":"            flag_update\u003dFalse)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        ret \u003d connect_ftsk.execute()"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        # Check the number of VIOSes"},{"line_number":192,"context_line":"        vioses_modified \u003d 0"},{"line_number":193,"context_line":"        for result in ret[\u0027wrapper_task_rets\u0027].values():"},{"line_number":194,"context_line":"            if result[\u0027vio_modified\u0027]:"},{"line_number":195,"context_line":"                vioses_modified +\u003d 1"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        self._validate_vios_on_connection(vioses_modified)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _connect_volume_to_vio(self, vios_w):"},{"line_number":200,"context_line":"        \"\"\"Attempts to connect a volume to a given VIO."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3ee83be0","line":197,"range":{"start_line":147,"start_character":0,"end_line":197,"end_character":58},"updated":"2017-12-08 16:35:30.000000000","message":"Yeah, collapse this","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                     \u0027%s\u0027, self.volume_id, instance\u003dself.instance)"},{"line_number":145,"context_line":"            return None"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def connect_volume(self):"},{"line_number":148,"context_line":"        \"\"\"Connects the volume.\"\"\""},{"line_number":149,"context_line":"        # Check if the VM is in a state where the attach is acceptable."},{"line_number":150,"context_line":"        lpar_w \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":151,"context_line":"        capable, reason \u003d lpar_w.can_modify_io()"},{"line_number":152,"context_line":"        if not capable:"},{"line_number":153,"context_line":"            raise exc.VolumeAttachFailed("},{"line_number":154,"context_line":"                volume_id\u003dself.volume_id, reason\u003dreason)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Run the connect"},{"line_number":157,"context_line":"        self._connect_volume()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if self.stg_ftsk.name \u003d\u003d LOCAL_FEED_TASK:"},{"line_number":160,"context_line":"            self.stg_ftsk.execute()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _connect_volume(self):"},{"line_number":163,"context_line":"        \"\"\"Connects the volume."},{"line_number":164,"context_line":"        :param connect_volume_to_vio: Function to connect a volume to the vio."},{"line_number":165,"context_line":"                                      :param vios_w: Vios wrapper."},{"line_number":166,"context_line":"                                      :return: True if mapping was created."},{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        # Its about to get weird.  The transaction manager has a list of"},{"line_number":170,"context_line":"        # VIOSes.  We could use those, but they only have SCSI mappings (by"},{"line_number":171,"context_line":"        # design).  They do not have storage (super expensive)."},{"line_number":172,"context_line":"        #"},{"line_number":173,"context_line":"        # We need the storage xag when we are determining which mappings to"},{"line_number":174,"context_line":"        # add to the system.  But we don\u0027t want to tie it to the stg_ftsk.  If"},{"line_number":175,"context_line":"        # we do, every retry, every etag gather, etc... takes MUCH longer."},{"line_number":176,"context_line":"        #"},{"line_number":177,"context_line":"        # So we get the VIOSes with the storage xag here, separately, to save"},{"line_number":178,"context_line":"        # the stg_ftsk from potentially having to run it multiple times."},{"line_number":179,"context_line":"        connect_ftsk \u003d pvm_tx.FeedTask("},{"line_number":180,"context_line":"            \u0027connect_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":181,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":182,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":185,"context_line":"        connect_ftsk.add_functor_subtask("},{"line_number":186,"context_line":"            self._connect_volume_to_vio, provides\u003d\u0027vio_modified\u0027,"},{"line_number":187,"context_line":"            flag_update\u003dFalse)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        ret \u003d connect_ftsk.execute()"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        # Check the number of VIOSes"},{"line_number":192,"context_line":"        vioses_modified \u003d 0"},{"line_number":193,"context_line":"        for result in ret[\u0027wrapper_task_rets\u0027].values():"},{"line_number":194,"context_line":"            if result[\u0027vio_modified\u0027]:"},{"line_number":195,"context_line":"                vioses_modified +\u003d 1"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        self._validate_vios_on_connection(vioses_modified)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def _connect_volume_to_vio(self, vios_w):"},{"line_number":200,"context_line":"        \"\"\"Attempts to connect a volume to a given VIO."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_d0d8187c","line":197,"range":{"start_line":147,"start_character":0,"end_line":197,"end_character":58},"in_reply_to":"df87a7cf_3ee83be0","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        return vio_wwpns, t_wwpns, lun"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_9e862713","line":288,"range":{"start_line":288,"start_character":58,"end_line":288,"end_character":71},"updated":"2017-12-08 16:35:30.000000000","message":"kill this","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        return vio_wwpns, t_wwpns, lun"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_352616d0","line":288,"range":{"start_line":288,"start_character":58,"end_line":288,"end_character":71},"in_reply_to":"df87a7cf_9e862713","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return vio_wwpns, t_wwpns, lun"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":292,"context_line":"        :param device_name: The The hdisk device name."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_7e81e3fa","line":289,"range":{"start_line":289,"start_character":39,"end_line":289,"end_character":65},"updated":"2017-12-08 16:35:30.000000000","message":"These aren\u0027t documented.  Are they needed for non-iSCSI?","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        return vio_wwpns, t_wwpns, lun"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":292,"context_line":"        :param device_name: The The hdisk device name."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_55239abd","line":289,"range":{"start_line":289,"start_character":39,"end_line":289,"end_character":65},"in_reply_to":"df87a7cf_7e81e3fa","updated":"2017-12-13 16:10:50.000000000","message":"Nope, removed","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":292,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":293,"context_line":"        :param lpar_slot_num: (Optional, Default:None) If specified, the client"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_dea7cfbc","line":290,"updated":"2017-12-08 16:35:30.000000000","message":"Is pep8 letting you get away with no newline after the docstring title?  In any case, that\u0027s inconsistent with what we usually do, so I\u0027d prefer it be re-added throughout.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _add_append_mapping(self, vios_uuid, device_name, lpar_slot_num\u003dNone,"},{"line_number":289,"context_line":"                            lua\u003dNone, target_name\u003dNone, udid\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Update the stg_ftsk to append the mapping to the VIOS."},{"line_number":291,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":292,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":293,"context_line":"        :param lpar_slot_num: (Optional, Default:None) If specified, the client"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_90113007","line":290,"in_reply_to":"df87a7cf_dea7cfbc","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            return tsk_map.add_map(vios_w, v_map)"},{"line_number":310,"context_line":"        self.stg_ftsk.wrapper_tasks[vios_uuid].add_functor_subtask(add_func)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def _validate_vios_on_connection(self, num_vioses_found):"},{"line_number":313,"context_line":"        \"\"\"Validates that the correct number of VIOSes were discovered."},{"line_number":314,"context_line":"        Certain environments may have redundancy requirements.  For PowerVM"},{"line_number":315,"context_line":"        this is achieved by having multiple Virtual I/O Servers.  This method"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3ea4bba5","line":312,"range":{"start_line":312,"start_character":8,"end_line":312,"end_character":36},"updated":"2017-12-08 16:35:30.000000000","message":"Inline this, in its collapsed (only checking for zero, as we discussed in IRC) form.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            return tsk_map.add_map(vios_w, v_map)"},{"line_number":310,"context_line":"        self.stg_ftsk.wrapper_tasks[vios_uuid].add_functor_subtask(add_func)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def _validate_vios_on_connection(self, num_vioses_found):"},{"line_number":313,"context_line":"        \"\"\"Validates that the correct number of VIOSes were discovered."},{"line_number":314,"context_line":"        Certain environments may have redundancy requirements.  For PowerVM"},{"line_number":315,"context_line":"        this is achieved by having multiple Virtual I/O Servers.  This method"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_e7fa3f41","line":312,"range":{"start_line":312,"start_character":8,"end_line":312,"end_character":36},"in_reply_to":"df87a7cf_3ea4bba5","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        ex_args \u003d {\u0027volume_id\u0027: self.volume_id, \u0027reason\u0027: msg}"},{"line_number":338,"context_line":"        raise exc.VolumeAttachFailed(**ex_args)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def disconnect_volume(self):"},{"line_number":341,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":342,"context_line":"        # Check if the VM is in a state where the detach is acceptable."},{"line_number":343,"context_line":"        lpar_w \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":344,"context_line":"        capable, reason \u003d lpar_w.can_modify_io()"},{"line_number":345,"context_line":"        if not capable:"},{"line_number":346,"context_line":"            raise exc.VolumeDetachFailed("},{"line_number":347,"context_line":"                volume_id\u003dself.volume_id, reason\u003dreason)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        # Run the disconnect"},{"line_number":350,"context_line":"        self._disconnect_volume()"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        if self.stg_ftsk.name \u003d\u003d LOCAL_FEED_TASK:"},{"line_number":353,"context_line":"            self.stg_ftsk.execute()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _disconnect_volume(self):"},{"line_number":356,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":357,"context_line":"        try:"},{"line_number":358,"context_line":"            # See logic in _connect_volume for why this new FeedTask is here."},{"line_number":359,"context_line":"            discon_ftsk \u003d pvm_tx.FeedTask("},{"line_number":360,"context_line":"                \u0027discon_volume_from_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":361,"context_line":"                    self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR]))"},{"line_number":362,"context_line":"            # Find hdisks to disconnect"},{"line_number":363,"context_line":"            discon_ftsk.add_functor_subtask("},{"line_number":364,"context_line":"                self._discon_vol_for_vio, provides\u003d\u0027vio_modified\u0027,"},{"line_number":365,"context_line":"                flag_update\u003dFalse)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"            ret \u003d discon_ftsk.execute()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"            # Warn if no hdisks disconnected."},{"line_number":370,"context_line":"            if not any([result[\u0027vio_modified\u0027]"},{"line_number":371,"context_line":"                        for result in ret[\u0027wrapper_task_rets\u0027].values()]):"},{"line_number":372,"context_line":"                LOG.warning(\"Disconnect Volume: Failed to disconnect the \""},{"line_number":373,"context_line":"                            \"volume %(volume_id)s on ANY of the Virtual \""},{"line_number":374,"context_line":"                            \"I/O Servers.\", {\u0027volume_id\u0027: self.volume_id},"},{"line_number":375,"context_line":"                            instance\u003dself.instance)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        except Exception as e:"},{"line_number":378,"context_line":"            LOG.exception(\u0027PowerVM error detaching volume from virtual \u0027"},{"line_number":379,"context_line":"                          \u0027machine.\u0027, instance\u003dself.instance)"},{"line_number":380,"context_line":"            ex_args \u003d {\u0027volume_id\u0027: self.volume_id, \u0027reason\u0027: six.text_type(e)}"},{"line_number":381,"context_line":"            raise exc.VolumeDetachFailed(**ex_args)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def _discon_vol_for_vio(self, vios_w):"},{"line_number":384,"context_line":"        \"\"\"Removes the volume from a specific Virtual I/O Server."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_beb9abcc","line":381,"range":{"start_line":340,"start_character":0,"end_line":381,"end_character":51},"updated":"2017-12-08 16:35:30.000000000","message":"collapse.","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        ex_args \u003d {\u0027volume_id\u0027: self.volume_id, \u0027reason\u0027: msg}"},{"line_number":338,"context_line":"        raise exc.VolumeAttachFailed(**ex_args)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def disconnect_volume(self):"},{"line_number":341,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":342,"context_line":"        # Check if the VM is in a state where the detach is acceptable."},{"line_number":343,"context_line":"        lpar_w \u003d vm.get_instance_wrapper(self.adapter, self.instance)"},{"line_number":344,"context_line":"        capable, reason \u003d lpar_w.can_modify_io()"},{"line_number":345,"context_line":"        if not capable:"},{"line_number":346,"context_line":"            raise exc.VolumeDetachFailed("},{"line_number":347,"context_line":"                volume_id\u003dself.volume_id, reason\u003dreason)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"        # Run the disconnect"},{"line_number":350,"context_line":"        self._disconnect_volume()"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        if self.stg_ftsk.name \u003d\u003d LOCAL_FEED_TASK:"},{"line_number":353,"context_line":"            self.stg_ftsk.execute()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _disconnect_volume(self):"},{"line_number":356,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":357,"context_line":"        try:"},{"line_number":358,"context_line":"            # See logic in _connect_volume for why this new FeedTask is here."},{"line_number":359,"context_line":"            discon_ftsk \u003d pvm_tx.FeedTask("},{"line_number":360,"context_line":"                \u0027discon_volume_from_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":361,"context_line":"                    self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR]))"},{"line_number":362,"context_line":"            # Find hdisks to disconnect"},{"line_number":363,"context_line":"            discon_ftsk.add_functor_subtask("},{"line_number":364,"context_line":"                self._discon_vol_for_vio, provides\u003d\u0027vio_modified\u0027,"},{"line_number":365,"context_line":"                flag_update\u003dFalse)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"            ret \u003d discon_ftsk.execute()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"            # Warn if no hdisks disconnected."},{"line_number":370,"context_line":"            if not any([result[\u0027vio_modified\u0027]"},{"line_number":371,"context_line":"                        for result in ret[\u0027wrapper_task_rets\u0027].values()]):"},{"line_number":372,"context_line":"                LOG.warning(\"Disconnect Volume: Failed to disconnect the \""},{"line_number":373,"context_line":"                            \"volume %(volume_id)s on ANY of the Virtual \""},{"line_number":374,"context_line":"                            \"I/O Servers.\", {\u0027volume_id\u0027: self.volume_id},"},{"line_number":375,"context_line":"                            instance\u003dself.instance)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        except Exception as e:"},{"line_number":378,"context_line":"            LOG.exception(\u0027PowerVM error detaching volume from virtual \u0027"},{"line_number":379,"context_line":"                          \u0027machine.\u0027, instance\u003dself.instance)"},{"line_number":380,"context_line":"            ex_args \u003d {\u0027volume_id\u0027: self.volume_id, \u0027reason\u0027: six.text_type(e)}"},{"line_number":381,"context_line":"            raise exc.VolumeDetachFailed(**ex_args)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def _discon_vol_for_vio(self, vios_w):"},{"line_number":384,"context_line":"        \"\"\"Removes the volume from a specific Virtual I/O Server."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_b0d31460","line":381,"range":{"start_line":340,"start_character":0,"end_line":381,"end_character":51},"in_reply_to":"df87a7cf_beb9abcc","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"956d039e8ba2e87521a2ec97647af40ce3e69178","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        return True"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def _add_remove_mapping(self, vm_uuid, vios_uuid, device_name):"},{"line_number":450,"context_line":"        \"\"\"Adds a transaction to remove the storage mapping."},{"line_number":451,"context_line":"        :param vm_uuid: The UUID of the VM instance"},{"line_number":452,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":453,"context_line":"        :param device_name: The The hdisk device name."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3ed27b01","line":450,"range":{"start_line":450,"start_character":18,"end_line":450,"end_character":29},"updated":"2017-12-08 16:35:30.000000000","message":"subtask","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"ace41687a4f854a5022eddceb6c6b7f38c0f4c98","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        return True"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def _add_remove_mapping(self, vm_uuid, vios_uuid, device_name):"},{"line_number":450,"context_line":"        \"\"\"Adds a transaction to remove the storage mapping."},{"line_number":451,"context_line":"        :param vm_uuid: The UUID of the VM instance"},{"line_number":452,"context_line":"        :param vios_uuid: The UUID of the vios for the pypowervm adapter."},{"line_number":453,"context_line":"        :param device_name: The The hdisk device name."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_b51b067f","line":450,"range":{"start_line":450,"start_character":18,"end_line":450,"end_character":29},"in_reply_to":"df87a7cf_3ed27b01","updated":"2017-12-13 16:10:50.000000000","message":"Done","commit_id":"25815787a6e44ca5c2f6b08c3608fe3b52290c7b"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        attach_ftsk \u003d pvm_tx.FeedTask("},{"line_number":152,"context_line":"            \u0027attach_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":153,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":154,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":157,"context_line":"        attach_ftsk.add_functor_subtask("}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_5ee85515","line":154,"range":{"start_line":154,"start_character":35,"end_line":154,"end_character":57},"updated":"2018-01-10 15:55:34.000000000","message":"is VIO_SMAP needed here? I noticed it wasn\u0027t included in similar code for detach_volume.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"dfe0f8e99b7a1be5e3ae09df05675b57ac7b96ef","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        attach_ftsk \u003d pvm_tx.FeedTask("},{"line_number":152,"context_line":"            \u0027attach_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":153,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":154,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":157,"context_line":"        attach_ftsk.add_functor_subtask("}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_33b7ba89","line":154,"range":{"start_line":154,"start_character":35,"end_line":154,"end_character":57},"in_reply_to":"7f96bb07_0d705d72","updated":"2018-01-10 20:49:20.000000000","message":"It *should* definitely be needed.  And if it\u0027s not in detach, that *should* be a bug in detach.  Which we wouldn\u0027t necessarily notice because it wouldn\u0027t cause a failure, and then we would clean up the orphan when we do a scrub.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"99ba96787f55b4bfd8464bb6c8b8edc0f741b90f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        attach_ftsk \u003d pvm_tx.FeedTask("},{"line_number":152,"context_line":"            \u0027attach_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":153,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":154,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":157,"context_line":"        attach_ftsk.add_functor_subtask("}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_456f19c5","line":154,"range":{"start_line":154,"start_character":35,"end_line":154,"end_character":57},"in_reply_to":"7f96bb07_33b7ba89","updated":"2018-01-10 21:04:43.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        attach_ftsk \u003d pvm_tx.FeedTask("},{"line_number":152,"context_line":"            \u0027attach_volume_to_vio\u0027, pvm_vios.VIOS.getter("},{"line_number":153,"context_line":"                self.adapter, xag\u003d[pvm_const.XAG.VIO_STOR,"},{"line_number":154,"context_line":"                                   pvm_const.XAG.VIO_SMAP]))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Find valid hdisks and map to VM."},{"line_number":157,"context_line":"        attach_ftsk.add_functor_subtask("}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_0d705d72","line":154,"range":{"start_line":154,"start_character":35,"end_line":154,"end_character":57},"in_reply_to":"7f96bb07_5ee85515","updated":"2018-01-10 19:01:07.000000000","message":"Can\u0027t answer confidently. Waiting to hear back from efried","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            # Save the UDID for the disk in the connection info.  It is"},{"line_number":197,"context_line":"            # used for the detach."},{"line_number":198,"context_line":"            self._set_udid(udid)"},{"line_number":199,"context_line":"            LOG.debug(\u0027Added deferred task to attach device %s\u0027, device_name,"},{"line_number":200,"context_line":"                      instance\u003dself.instance)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"            # Valid attachment"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_7e99911d","line":199,"updated":"2018-01-10 15:55:34.000000000","message":"probably ought to include vios name in this log statement","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            # Save the UDID for the disk in the connection info.  It is"},{"line_number":197,"context_line":"            # used for the detach."},{"line_number":198,"context_line":"            self._set_udid(udid)"},{"line_number":199,"context_line":"            LOG.debug(\u0027Added deferred task to attach device %s\u0027, device_name,"},{"line_number":200,"context_line":"                      instance\u003dself.instance)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"            # Valid attachment"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_07f6fc90","line":199,"in_reply_to":"7f96bb07_7e99911d","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        return False"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _discover_volume_on_vios(self, vios_w, volume_id):"},{"line_number":208,"context_line":"        \"\"\"Discovers an hdisk on a single vios for the volume."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        :param vios_w: VIOS wrapper to process"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f91af0f_6867c5ea","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":56},"updated":"2018-01-10 15:55:34.000000000","message":"we don\u0027t need to pass this... just use self.volume_id wherever wanted.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        return False"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _discover_volume_on_vios(self, vios_w, volume_id):"},{"line_number":208,"context_line":"        \"\"\"Discovers an hdisk on a single vios for the volume."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        :param vios_w: VIOS wrapper to process"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_e772f07c","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":56},"in_reply_to":"9f91af0f_6867c5ea","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":277,"context_line":"        \"\"\""},{"line_number":278,"context_line":"        def add_func(vios_w):"},{"line_number":279,"context_line":"            LOG.info(\"Adding vSCSI mapping to Physical Volume %(dev)s\","},{"line_number":280,"context_line":"                     {\u0027dev\u0027: device_name}, instance\u003dself.instance)"},{"line_number":281,"context_line":"            pv \u003d pvm_stor.PV.bld(self.adapter, device_name)"},{"line_number":282,"context_line":"            v_map \u003d tsk_map.build_vscsi_mapping(None, vios_w, self.vm_uuid, pv)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_be46394f","line":279,"updated":"2018-01-10 15:55:34.000000000","message":"probably ought to include vios name in this log statement","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":277,"context_line":"        \"\"\""},{"line_number":278,"context_line":"        def add_func(vios_w):"},{"line_number":279,"context_line":"            LOG.info(\"Adding vSCSI mapping to Physical Volume %(dev)s\","},{"line_number":280,"context_line":"                     {\u0027dev\u0027: device_name}, instance\u003dself.instance)"},{"line_number":281,"context_line":"            pv \u003d pvm_stor.PV.bld(self.adapter, device_name)"},{"line_number":282,"context_line":"            v_map \u003d tsk_map.build_vscsi_mapping(None, vios_w, self.vm_uuid, pv)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_0724bc0c","line":279,"in_reply_to":"7f96bb07_be46394f","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        :return: True if a remove action was done against this VIOS.  False"},{"line_number":329,"context_line":"                 otherwise."},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        LOG.debug(\"Detach volume %(vol)s from vios uuid %(uuid)s\","},{"line_number":332,"context_line":"                  dict(vol\u003dself.volume_id, uuid\u003dvios_w.uuid),"},{"line_number":333,"context_line":"                  instance\u003dself.instance)"},{"line_number":334,"context_line":"        udid, device_name \u003d None, None"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_5e5ff5e4","line":331,"range":{"start_line":331,"start_character":51,"end_line":331,"end_character":55},"updated":"2018-01-10 15:55:34.000000000","message":"we log uuid in some places and name in others (e.g. L224, L357)... Consistency would improve debug.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        :return: True if a remove action was done against this VIOS.  False"},{"line_number":329,"context_line":"                 otherwise."},{"line_number":330,"context_line":"        \"\"\""},{"line_number":331,"context_line":"        LOG.debug(\"Detach volume %(vol)s from vios uuid %(uuid)s\","},{"line_number":332,"context_line":"                  dict(vol\u003dself.volume_id, uuid\u003dvios_w.uuid),"},{"line_number":333,"context_line":"                  instance\u003dself.instance)"},{"line_number":334,"context_line":"        udid, device_name \u003d None, None"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_e70c3044","line":331,"range":{"start_line":331,"start_character":51,"end_line":331,"end_character":55},"in_reply_to":"7f96bb07_5e5ff5e4","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                status, device_name, udid \u003d self._discover_volume_on_vios("},{"line_number":345,"context_line":"                    vios_w, self.volume_id)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"                # If we have a device name, but not a udid, at this point"},{"line_number":348,"context_line":"                # we should not continue.  The hdisk is in a bad state"},{"line_number":349,"context_line":"                # in the I/O Server.  Subsequent scrub code on future"},{"line_number":350,"context_line":"                # deploys will clean this up."},{"line_number":351,"context_line":"                if not hdisk.good_discovery(status, device_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_fee28101","line":348,"range":{"start_line":347,"start_character":18,"end_line":348,"end_character":41},"updated":"2018-01-10 15:55:34.000000000","message":"confusing comment. We don\u0027t seem to be checking for that...","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                status, device_name, udid \u003d self._discover_volume_on_vios("},{"line_number":345,"context_line":"                    vios_w, self.volume_id)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"                # If we have a device name, but not a udid, at this point"},{"line_number":348,"context_line":"                # we should not continue.  The hdisk is in a bad state"},{"line_number":349,"context_line":"                # in the I/O Server.  Subsequent scrub code on future"},{"line_number":350,"context_line":"                # deploys will clean this up."},{"line_number":351,"context_line":"                if not hdisk.good_discovery(status, device_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_6761003a","line":348,"range":{"start_line":347,"start_character":18,"end_line":348,"end_character":41},"in_reply_to":"7f96bb07_fee28101","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        except Exception:"},{"line_number":362,"context_line":"            LOG.exception("},{"line_number":363,"context_line":"                \"Detach Volume: Failed to find disk on Virtual I/O \""},{"line_number":364,"context_line":"                \"Server %(vios_name)s for volume %(volume_id)s. Volume \""},{"line_number":365,"context_line":"                \"UDID: %(volume_uid)s.\","},{"line_number":366,"context_line":"                {\u0027volume_uid\u0027: udid, \u0027vios_name\u0027: vios_w.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_be9ab96b","line":363,"updated":"2018-01-10 15:55:34.000000000","message":"Can\u0027t give a specific reason like this for a generic Exception. Either we need to catch a more specific Exception (preferred), or this message needs to be more generic.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        except Exception:"},{"line_number":362,"context_line":"            LOG.exception("},{"line_number":363,"context_line":"                \"Detach Volume: Failed to find disk on Virtual I/O \""},{"line_number":364,"context_line":"                \"Server %(vios_name)s for volume %(volume_id)s. Volume \""},{"line_number":365,"context_line":"                \"UDID: %(volume_uid)s.\","},{"line_number":366,"context_line":"                {\u0027volume_uid\u0027: udid, \u0027vios_name\u0027: vios_w.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_927a4c86","line":363,"in_reply_to":"7f96bb07_be9ab96b","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        LOG.info(\"Detach Volume: Discovered the device %(hdisk)s \""},{"line_number":372,"context_line":"                 \"on Virtual I/O Server %(vios_name)s for volume \""},{"line_number":373,"context_line":"                 \"%(volume_id)s.  Volume UDID: %(volume_uid)s.\","},{"line_number":374,"context_line":"                 {\u0027volume_uid\u0027: udid, \u0027volume_id\u0027: self.volume_id,"},{"line_number":375,"context_line":"                  \u0027vios_name\u0027: vios_w.name, \u0027hdisk\u0027: device_name},"},{"line_number":376,"context_line":"                 instance\u003dself.instance)"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_bea87977","line":374,"updated":"2018-01-10 15:55:34.000000000","message":"easier to read if you reorder the dict to match the ordering in the message.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        LOG.info(\"Detach Volume: Discovered the device %(hdisk)s \""},{"line_number":372,"context_line":"                 \"on Virtual I/O Server %(vios_name)s for volume \""},{"line_number":373,"context_line":"                 \"%(volume_id)s.  Volume UDID: %(volume_uid)s.\","},{"line_number":374,"context_line":"                 {\u0027volume_uid\u0027: udid, \u0027volume_id\u0027: self.volume_id,"},{"line_number":375,"context_line":"                  \u0027vios_name\u0027: vios_w.name, \u0027hdisk\u0027: device_name},"},{"line_number":376,"context_line":"                 instance\u003dself.instance)"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_4745e416","line":374,"in_reply_to":"7f96bb07_bea87977","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":398,"context_line":"        \"\"\""},{"line_number":399,"context_line":"        def rm_func(vios_w):"},{"line_number":400,"context_line":"            LOG.info(\"Removing vSCSI mapping from physical volume %(dev)s.\","},{"line_number":401,"context_line":"                     {\u0027dev\u0027: device_name}, instance\u003dself.instance)"},{"line_number":402,"context_line":"            removed_maps \u003d tsk_map.remove_maps("},{"line_number":403,"context_line":"                vios_w, vm_uuid,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_5e629518","line":400,"updated":"2018-01-10 15:55:34.000000000","message":"probably ought to include vios name in this log statement","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        :param device_name: The The hdisk device name."},{"line_number":398,"context_line":"        \"\"\""},{"line_number":399,"context_line":"        def rm_func(vios_w):"},{"line_number":400,"context_line":"            LOG.info(\"Removing vSCSI mapping from physical volume %(dev)s.\","},{"line_number":401,"context_line":"                     {\u0027dev\u0027: device_name}, instance\u003dself.instance)"},{"line_number":402,"context_line":"            removed_maps \u003d tsk_map.remove_maps("},{"line_number":403,"context_line":"                vios_w, vm_uuid,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_e7d990f4","line":400,"in_reply_to":"7f96bb07_5e629518","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.stg_ftsk.wrapper_tasks[vios_uuid].add_functor_subtask(rm_func)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def _add_remove_hdisk(self, vio_wrap, device_name,"},{"line_number":409,"context_line":"                          stg_ftsk\u003dNone):"},{"line_number":410,"context_line":"        \"\"\"Adds a post-mapping task to remove the hdisk from the VIOS."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        This removal is only done after the mapping updates have completed."}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_9e06dd20","line":409,"range":{"start_line":409,"start_character":26,"end_line":409,"end_character":39},"updated":"2018-01-10 15:55:34.000000000","message":"not needed with current usage. Can add it later when it\u0027s needed.","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.stg_ftsk.wrapper_tasks[vios_uuid].add_functor_subtask(rm_func)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def _add_remove_hdisk(self, vio_wrap, device_name,"},{"line_number":409,"context_line":"                          stg_ftsk\u003dNone):"},{"line_number":410,"context_line":"        \"\"\"Adds a post-mapping task to remove the hdisk from the VIOS."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        This removal is only done after the mapping updates have completed."}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_e7c43095","line":409,"range":{"start_line":409,"start_character":26,"end_line":409,"end_character":39},"in_reply_to":"7f96bb07_9e06dd20","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        \"\"\"Adds a post-mapping task to remove the hdisk from the VIOS."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        This removal is only done after the mapping updates have completed."},{"line_number":413,"context_line":"        This method is also used during migration to remove hdisks that remain"},{"line_number":414,"context_line":"        on the source host after the VM is migrated to the destination."},{"line_number":415,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":416,"context_line":"                         from."},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_e13ae0cb","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":71},"updated":"2018-01-10 15:55:34.000000000","message":"not yet... save for a future patch set when we add migration. We\u0027ll have to be editing this method anyway to add the stg_ftsk kwarg","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        \"\"\"Adds a post-mapping task to remove the hdisk from the VIOS."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        This removal is only done after the mapping updates have completed."},{"line_number":413,"context_line":"        This method is also used during migration to remove hdisks that remain"},{"line_number":414,"context_line":"        on the source host after the VM is migrated to the destination."},{"line_number":415,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":416,"context_line":"                         from."},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_87d68c4f","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":71},"in_reply_to":"7f96bb07_e13ae0cb","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        on the source host after the VM is migrated to the destination."},{"line_number":415,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":416,"context_line":"                         from."},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        :param device_name: The hdisk name to remove."},{"line_number":419,"context_line":"        :param stg_ftsk: The feed task to add to. If None, then self.stg_ftsk"},{"line_number":420,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_3e4a2980","line":417,"updated":"2018-01-10 15:55:34.000000000","message":"blank line should be moved up between description and first param instead of in the middle of params","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        on the source host after the VM is migrated to the destination."},{"line_number":415,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":416,"context_line":"                         from."},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        :param device_name: The hdisk name to remove."},{"line_number":419,"context_line":"        :param stg_ftsk: The feed task to add to. If None, then self.stg_ftsk"},{"line_number":420,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_67d10058","line":417,"in_reply_to":"7f96bb07_3e4a2980","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":451,"context_line":"                         from."},{"line_number":452,"context_line":"        :param device_name: The hdisk name to remove."},{"line_number":453,"context_line":"        :return: True is there are multiple instances using the given hdisk"},{"line_number":454,"context_line":"        \"\"\""},{"line_number":455,"context_line":"        vios_scsi_mappings \u003d next(v.scsi_mappings for v in self.stg_ftsk.feed"},{"line_number":456,"context_line":"                                  if v.uuid \u003d\u003d vios_wrap.uuid)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_216f68c6","line":453,"range":{"start_line":453,"start_character":22,"end_line":453,"end_character":24},"updated":"2018-01-10 15:55:34.000000000","message":"s/is/if/","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        :param vio_wrap: The Virtual I/O Server wrapper to remove the disk"},{"line_number":451,"context_line":"                         from."},{"line_number":452,"context_line":"        :param device_name: The hdisk name to remove."},{"line_number":453,"context_line":"        :return: True is there are multiple instances using the given hdisk"},{"line_number":454,"context_line":"        \"\"\""},{"line_number":455,"context_line":"        vios_scsi_mappings \u003d next(v.scsi_mappings for v in self.stg_ftsk.feed"},{"line_number":456,"context_line":"                                  if v.uuid \u003d\u003d vios_wrap.uuid)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_27a45808","line":453,"range":{"start_line":453,"start_character":22,"end_line":453,"end_character":24},"in_reply_to":"7f96bb07_216f68c6","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":458,"context_line":"            vios_scsi_mappings, None,"},{"line_number":459,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        LOG.info(\"%(num)d storage mappings found for %(dev)s on VIOS %(vios)s\","},{"line_number":462,"context_line":"                 {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":463,"context_line":"                  \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":464,"context_line":"        # the mapping is still present as the task feed removes"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_c18d647c","line":461,"range":{"start_line":461,"start_character":34,"end_line":461,"end_character":42},"updated":"2018-01-10 15:55:34.000000000","message":"nit: say \"mapping(s)\"","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":458,"context_line":"            vios_scsi_mappings, None,"},{"line_number":459,"context_line":"            tsk_map.gen_match_func(pvm_stor.PV, names\u003d[device_name]))"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        LOG.info(\"%(num)d storage mappings found for %(dev)s on VIOS %(vios)s\","},{"line_number":462,"context_line":"                 {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":463,"context_line":"                  \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":464,"context_line":"        # the mapping is still present as the task feed removes"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_c7e25430","line":461,"range":{"start_line":461,"start_character":34,"end_line":461,"end_character":42},"in_reply_to":"7f96bb07_c18d647c","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"b422db802bc87da48ae4817c1ba04aa1106d63c4","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        LOG.info(\"%(num)d storage mappings found for %(dev)s on VIOS %(vios)s\","},{"line_number":462,"context_line":"                 {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":463,"context_line":"                  \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":464,"context_line":"        # the mapping is still present as the task feed removes"},{"line_number":465,"context_line":"        # the mapping later"},{"line_number":466,"context_line":"        return len(mappings) \u003e 1"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_01ab4cd6","line":464,"updated":"2018-01-10 15:55:34.000000000","message":"nit: this comment would fit on one line (at least if you use \"it later\")","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"4f6bbefc40a8a0bd74f8c462304a4f261818396f","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        LOG.info(\"%(num)d storage mappings found for %(dev)s on VIOS %(vios)s\","},{"line_number":462,"context_line":"                 {\u0027num\u0027: len(mappings), \u0027dev\u0027: device_name,"},{"line_number":463,"context_line":"                  \u0027vios\u0027: vios_wrap.name}, instance\u003dself.instance)"},{"line_number":464,"context_line":"        # the mapping is still present as the task feed removes"},{"line_number":465,"context_line":"        # the mapping later"},{"line_number":466,"context_line":"        return len(mappings) \u003e 1"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_c75fb40c","line":464,"in_reply_to":"7f96bb07_01ab4cd6","updated":"2018-01-10 19:01:07.000000000","message":"Done","commit_id":"79b3364e9d240352fcb218e4d48d5eeb88626a11"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                  instance\u003dself.instance)"},{"line_number":336,"context_line":"        udid, device_name \u003d None, None"},{"line_number":337,"context_line":"        try:"},{"line_number":338,"context_line":"            udid \u003d self._get_udid()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"            if udid:"},{"line_number":341,"context_line":"                # This will only work if vios_w has the Storage XAG."}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_65601534","line":338,"updated":"2018-01-10 21:57:43.000000000","message":"_get_udid doesn\u0027t raise, so there\u0027s no reason to have this inside the try","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                  instance\u003dself.instance)"},{"line_number":336,"context_line":"        udid, device_name \u003d None, None"},{"line_number":337,"context_line":"        try:"},{"line_number":338,"context_line":"            udid \u003d self._get_udid()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"            if udid:"},{"line_number":341,"context_line":"                # This will only work if vios_w has the Storage XAG."}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_280ae425","line":338,"in_reply_to":"7f96bb07_65601534","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"19591f0872121e427460d9b477c995ac888a2f92","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        except Exception:"},{"line_number":362,"context_line":"            LOG.exception("},{"line_number":363,"context_line":"                \"Detach Volume: Failed to detach volume %(volume_id)s from \""},{"line_number":364,"context_line":"                \"Virtual I/O Server %(vios_name)s. Volume UDID: \""},{"line_number":365,"context_line":"                \"%(volume_uid)s.\","},{"line_number":366,"context_line":"                {\u0027volume_id\u0027: self.volume_id, \u0027vios_name\u0027: vios_w.name,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_5882a551","line":363,"updated":"2018-01-10 21:57:43.000000000","message":"My comment in PS17 here was wrong. You can say \"Failed to find disk...\" because that\u0027s what it\u0027s doing inside the try block. Revert this LOG statement back to the way it looked in PS17.","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"5a0ac40aa72ea645990315e83b99b4556878e7f4","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        except Exception:"},{"line_number":362,"context_line":"            LOG.exception("},{"line_number":363,"context_line":"                \"Detach Volume: Failed to detach volume %(volume_id)s from \""},{"line_number":364,"context_line":"                \"Virtual I/O Server %(vios_name)s. Volume UDID: \""},{"line_number":365,"context_line":"                \"%(volume_uid)s.\","},{"line_number":366,"context_line":"                {\u0027volume_id\u0027: self.volume_id, \u0027vios_name\u0027: vios_w.name,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_9b510412","line":363,"in_reply_to":"7f96bb07_5882a551","updated":"2018-01-11 15:51:02.000000000","message":"Done","commit_id":"2d157da0d79c9e99db43c76ae2f3a78da51a5487"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"07ceb84ae956de09551ef1f92f54107327f982ec","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        LOG.debug(\"Detach volume %(vol)s from vios %(vios)s\","},{"line_number":335,"context_line":"                  dict(vol\u003dself.volume_id, vios\u003dvios_w.name),"},{"line_number":336,"context_line":"                  instance\u003dself.instance)"},{"line_number":337,"context_line":"        udid, device_name \u003d None, None"},{"line_number":338,"context_line":"        udid \u003d self._get_udid()"},{"line_number":339,"context_line":"        try:"},{"line_number":340,"context_line":"            if udid:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_f81b5870","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":12},"updated":"2018-01-11 16:28:32.000000000","message":"no need to set udid \u003d None here if we\u0027re going to set it differently on the next line.","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"8b45884d47ef5291ae9deed2931c7883657df6fc","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        LOG.debug(\"Detach volume %(vol)s from vios %(vios)s\","},{"line_number":335,"context_line":"                  dict(vol\u003dself.volume_id, vios\u003dvios_w.name),"},{"line_number":336,"context_line":"                  instance\u003dself.instance)"},{"line_number":337,"context_line":"        udid, device_name \u003d None, None"},{"line_number":338,"context_line":"        udid \u003d self._get_udid()"},{"line_number":339,"context_line":"        try:"},{"line_number":340,"context_line":"            if udid:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7f96bb07_38030045","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":12},"in_reply_to":"7f96bb07_f81b5870","updated":"2018-01-11 17:07:28.000000000","message":"Done","commit_id":"624c367266999791ccef748efbc9cb361ba8fc55"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cc01d2158ec90e288392800be49d20fd76da9b23","unresolved":false,"context_lines":[{"line_number":42,"context_line":"_vscsi_pfc_wwpns \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PVVscsiFCVolumeAdapter(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, adapter, instance, connection_info, stg_ftsk\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Initialize the PowerVMVolumeAdapter"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa0c359_b2173da4","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":28},"updated":"2018-02-14 22:47:25.000000000","message":"let\u0027s make sure we use the same name for this in both nova and nova-powervm","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"c2c974362f0e53e4565f8257b5531e59e1473dd3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"_vscsi_pfc_wwpns \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PVVscsiFCVolumeAdapter(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, adapter, instance, connection_info, stg_ftsk\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Initialize the PowerVMVolumeAdapter"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa0c359_9059128f","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":28},"in_reply_to":"3fa0c359_b2173da4","updated":"2018-02-23 18:24:41.000000000","message":"Done","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cc01d2158ec90e288392800be49d20fd76da9b23","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self.stg_ftsk \u003d stg_ftsk"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @lockutils.synchronized(\u0027vscsi_wwpns\u0027)"},{"line_number":99,"context_line":"    def wwpns(self):"},{"line_number":100,"context_line":"        \"\"\"Builds the WWPNs of the adapters that will connect the ports."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :return: The list of WWPNs that need to be included in the zone set."}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa0c359_126b911f","line":99,"updated":"2018-02-14 22:47:25.000000000","message":"let\u0027s pull this out of the class as we\u0027re doing in the nova-powervm refactor. The place where this is called doesn\u0027t need to go to the trouble of building a driver instance that it\u0027s not going to use just to get the WWPNs.","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"c2c974362f0e53e4565f8257b5531e59e1473dd3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            self.stg_ftsk \u003d stg_ftsk"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @lockutils.synchronized(\u0027vscsi_wwpns\u0027)"},{"line_number":99,"context_line":"    def wwpns(self):"},{"line_number":100,"context_line":"        \"\"\"Builds the WWPNs of the adapters that will connect the ports."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :return: The list of WWPNs that need to be included in the zone set."}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa0c359_70524669","line":99,"in_reply_to":"3fa0c359_126b911f","updated":"2018-02-23 18:24:41.000000000","message":"Done","commit_id":"35d56fbd420e26988c640902c5ac2ca94835889d"}],"releasenotes/notes/powervm-vscsi-46c82559f082d4ed.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bec783a81ef0a2c309bc1811403ea0fefaebff92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The PowerVM virt driver now supports vSCSI cinder volumes."}],"source_content_type":"text/x-yaml","patch_set":45,"id":"9f6a8fd7_3f35bd8f","line":4,"updated":"2018-04-20 15:24:55.000000000","message":"This is way too brief. Off the top of my head, I can think of at least a few things:\n\n* only fibre_channel volume types are supported\n* attach/detach\n* (boot from volume?)\n* extend the size of attached volumes","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":16710,"name":"Eric Berglund","email":"esberglu@us.ibm.com","username":"esberglu"},"change_message_id":"113dbf1a6c37aa2af4aaac73387f90684e84af79","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The PowerVM virt driver now supports vSCSI cinder volumes."}],"source_content_type":"text/x-yaml","patch_set":45,"id":"9f6a8fd7_1242073f","line":4,"in_reply_to":"9f6a8fd7_3f35bd8f","updated":"2018-04-23 21:30:24.000000000","message":"Done","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d8bf7e464a31ef7a4c07fbd26b5d2aba5f4b3c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The PowerVM virt driver now supports vSCSI cinder volumes."}],"source_content_type":"text/x-yaml","patch_set":45,"id":"9f6a8fd7_a299b6c4","line":4,"in_reply_to":"9f6a8fd7_3f35bd8f","updated":"2018-04-20 15:41:04.000000000","message":"In addition to the feature support matrix and release note, I think it would be worthwhile to add at least some high-level information to the powervm driver in-tree docs:\n\nhttps://docs.openstack.org/nova/latest/admin/configuration/hypervisor-powervm.html\n\nI\u0027m assuming you guys can at least talk about whatever is required/supported for using volumes with this driver at a high level and/or reference external docs for more information.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"cce708c92604f60d6140670bdb3f762817b03a46","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The PowerVM virt driver now supports vSCSI cinder volumes."}],"source_content_type":"text/x-yaml","patch_set":45,"id":"9f6a8fd7_ef8e9377","line":4,"in_reply_to":"9f6a8fd7_a299b6c4","updated":"2018-04-23 15:50:38.000000000","message":"both great points.","commit_id":"232bf6feb432ea857110a63c33e589d2fe00975a"}]}
