)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f431b30aac03a71c05c33323d7059ec49c8179a1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"A cinder interface driver that can be called in order to signal"},{"line_number":10,"context_line":"cinder to attach and detach volumes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Joanna Taryma \u003cjoanna.taryma@intel.com\u003e"},{"line_number":13,"context_line":"Change-Id: I3d6bb126ef34b30f316ed5a10fd13a3106d1400b"},{"line_number":14,"context_line":"Partial-Bug: #1559691"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"bff0334d_0ee7dee6","line":12,"updated":"2017-04-06 15:59:48.000000000","message":"nit: Can you add me as a co-author since your now the author and committer in the git commit details?","commit_id":"730a3de92b72ee7afe8c6283fdd6a31d67e330b0"}],"etc/ironic/ironic.conf.sample":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":237,"context_line":"# setting this value, please make sure that every enabled"},{"line_number":238,"context_line":"# hardware type will have the same set of enabled storage"},{"line_number":239,"context_line":"# interfaces on every ironic-conductor service. (list value)"},{"line_number":240,"context_line":"#enabled_storage_interfaces \u003d noop,cinder"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"# Default storage interface to be used for nodes that do not"},{"line_number":243,"context_line":"# have storage_interface field set. A complete list of storage"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"3f044301_713f90d6","line":240,"updated":"2017-05-04 09:12:04.000000000","message":"until the volume action are wired in, I\u0027d prefer we don\u0027t enable this interface by default","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"abc3b1c3cd18f2fbfbd90c1ded38cc345a443813","unresolved":false,"context_lines":[{"line_number":237,"context_line":"# setting this value, please make sure that every enabled"},{"line_number":238,"context_line":"# hardware type will have the same set of enabled storage"},{"line_number":239,"context_line":"# interfaces on every ironic-conductor service. (list value)"},{"line_number":240,"context_line":"#enabled_storage_interfaces \u003d noop,cinder"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"# Default storage interface to be used for nodes that do not"},{"line_number":243,"context_line":"# have storage_interface field set. A complete list of storage"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"3f044301_bd628915","line":240,"in_reply_to":"3f044301_713f90d6","updated":"2017-05-04 11:14:02.000000000","message":"+1","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"}],"ironic/conf/cinder.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4b12d8ba9a08e50f51618bc2e0d148988296de8b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027 action (only specific actions are retried).\u0027)),"},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"},{"line_number":36,"context_line":"               default\u003d5,"},{"line_number":37,"context_line":"               help\u003d_(\u0027Retry interval in seconds in the case of a failed \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_315e1e76","line":34,"range":{"start_line":34,"start_character":23,"end_line":34,"end_character":24},"updated":"2017-03-28 14:40:18.000000000","message":"nit: extra space","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"66d9c5471573516defdc39196506ae6cca1f7e14","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027 action (only specific actions are retried).\u0027)),"},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"},{"line_number":36,"context_line":"               default\u003d5,"},{"line_number":37,"context_line":"               help\u003d_(\u0027Retry interval in seconds in the case of a failed \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"dfeb2761_0adc9f72","line":34,"range":{"start_line":34,"start_character":23,"end_line":34,"end_character":24},"in_reply_to":"ffe62b97_315e1e76","updated":"2017-03-30 20:49:52.000000000","message":"Done","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f1dbb41b1e442ab67d6b58b0a597a04d52f00462","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried).\u0027)),"},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"},{"line_number":36,"context_line":"               default\u003d5,"},{"line_number":37,"context_line":"               help\u003d_(\u0027Retry interval in seconds in the case of a failed \u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"bff0334d_a88618b8","line":34,"updated":"2017-04-11 19:23:46.000000000","message":"You may want to add a note similar to L29-39, indicating that this won\u0027t be exposed to users (until https://review.openstack.org/#/c/214586 lands, right?)","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried).\u0027)),"},{"line_number":35,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"},{"line_number":36,"context_line":"               default\u003d5,"},{"line_number":37,"context_line":"               help\u003d_(\u0027Retry interval in seconds in the case of a failed \u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_e54a9625","line":34,"in_reply_to":"bff0334d_a88618b8","updated":"2017-04-25 17:59:55.000000000","message":"Done","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"107467102b4020eca3b4adc3cd8e480c355dd7d3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               help\u003d_(\u0027Client retries in the case of a failed request \u0027"},{"line_number":29,"context_line":"                      \u0027connection. This option is part of boot-from-volume \u0027"},{"line_number":30,"context_line":"                      \u0027work, which is not currently exposed to users.\u0027)),"},{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried). \u0027"}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_477414cf","line":31,"range":{"start_line":31,"start_character":16,"end_line":31,"end_character":30},"updated":"2017-04-29 02:06:39.000000000","message":"why a different option? Can we re-use the \u0027retries\u0027 option or define a single option for retries? I am sure this must have came to your mind, if there are specific actions may be that should be added in short in help string?","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"38aceafb685925912aa6fb12e2ca696ca2e2d7c1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               help\u003d_(\u0027Client retries in the case of a failed request \u0027"},{"line_number":29,"context_line":"                      \u0027connection. This option is part of boot-from-volume \u0027"},{"line_number":30,"context_line":"                      \u0027work, which is not currently exposed to users.\u0027)),"},{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried). \u0027"}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_94f791d5","line":31,"range":{"start_line":31,"start_character":16,"end_line":31,"end_character":30},"in_reply_to":"5ff73747_477414cf","updated":"2017-05-03 16:10:18.000000000","message":"\u0027Retries\u0027 is passed to cinderclient as connect_retries for connection retry when failing to connect a server. \u0027Retries\u0027 parameters are also used in neutron and glance group for passing to clients.\n\u0027Acttion_retries\u0027 is used for retrying specific volume actions in ironic conductor.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               help\u003d_(\u0027Client retries in the case of a failed request \u0027"},{"line_number":29,"context_line":"                      \u0027connection. This option is part of boot-from-volume \u0027"},{"line_number":30,"context_line":"                      \u0027work, which is not currently exposed to users.\u0027)),"},{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried). \u0027"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_7d03cc43","line":31,"range":{"start_line":31,"start_character":16,"end_line":31,"end_character":30},"in_reply_to":"5ff73747_94f791d5","updated":"2017-05-04 22:14:40.000000000","message":"I get that, but was wondering can it happen that the value given for \"retries\" is a lot more and we don\u0027t want that many number of retries for the specific action? e.g. \"retries\" is 5 and we don\u0027t want to retry 5 times for specific action? In that case should there be than a upper limit on \"action_retries\" conf option","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried). \u0027"},{"line_number":35,"context_line":"                      \u0027This option is part of boot-from-volume work, \u0027"},{"line_number":36,"context_line":"                      \u0027which is not currently exposed to users.\u0027)),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_0cfa6c41","line":34,"updated":"2017-05-15 10:42:26.000000000","message":"Would be great to mention which ones are retried, otherwise it may sound confusing (more of a nit though)","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    cfg.IntOpt(\u0027action_retries\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d_(\u0027Number of retries in the case of a failed \u0027"},{"line_number":34,"context_line":"                      \u0027action (only specific actions are retried). \u0027"},{"line_number":35,"context_line":"                      \u0027This option is part of boot-from-volume work, \u0027"},{"line_number":36,"context_line":"                      \u0027which is not currently exposed to users.\u0027)),"},{"line_number":37,"context_line":"    cfg.IntOpt(\u0027action_retry_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_11ecaec5","line":34,"in_reply_to":"1f013ff3_0cfa6c41","updated":"2017-05-16 00:44:44.000000000","message":"Currently only detach_volumes uses this. I\u0027ll mention that!","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"}],"ironic/conf/default.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":150,"context_line":"               help\u003d_DEFAULT_IFACE_HELP_WITH_WARNING.format(\u0027raid\u0027)),"},{"line_number":151,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":152,"context_line":"                default\u003d[\u0027noop\u0027, \u0027cinder\u0027],"},{"line_number":153,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":154,"context_line":"    cfg.ListOpt(\u0027default_storage_interface\u0027,"},{"line_number":155,"context_line":"                help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_a768eef6","line":152,"updated":"2017-01-02 17:18:33.000000000","message":"please regenerate sample config with this change","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":150,"context_line":"               help\u003d_DEFAULT_IFACE_HELP_WITH_WARNING.format(\u0027raid\u0027)),"},{"line_number":151,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":152,"context_line":"                default\u003d[\u0027noop\u0027, \u0027cinder\u0027],"},{"line_number":153,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":154,"context_line":"    cfg.ListOpt(\u0027default_storage_interface\u0027,"},{"line_number":155,"context_line":"                help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_002019f6","line":152,"in_reply_to":"ba5201f7_a768eef6","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":150,"context_line":"               help\u003d_DEFAULT_IFACE_HELP_WITH_WARNING.format(\u0027raid\u0027)),"},{"line_number":151,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":152,"context_line":"                default\u003d[\u0027noop\u0027, \u0027cinder\u0027],"},{"line_number":153,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":154,"context_line":"    cfg.ListOpt(\u0027default_storage_interface\u0027,"},{"line_number":155,"context_line":"                help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_1fa265fd","line":152,"updated":"2017-01-17 16:53:01.000000000","message":"please regenerate sample config","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":150,"context_line":"               help\u003d_DEFAULT_IFACE_HELP_WITH_WARNING.format(\u0027raid\u0027)),"},{"line_number":151,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":152,"context_line":"                default\u003d[\u0027noop\u0027, \u0027cinder\u0027],"},{"line_number":153,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":154,"context_line":"    cfg.ListOpt(\u0027default_storage_interface\u0027,"},{"line_number":155,"context_line":"                help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_0d99447c","line":152,"in_reply_to":"7a3c09a3_1fa265fd","updated":"2017-01-23 21:59:51.000000000","message":"Done.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"585be53487366d13394c178afdefc2b51466ed0f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    cfg.StrOpt(\u0027default_raid_interface\u0027,"},{"line_number":136,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027raid\u0027)),"},{"line_number":137,"context_line":"    cfg.ListOpt(\u0027enabled_storage_interfaces\u0027,"},{"line_number":138,"context_line":"                default\u003d[\u0027noop\u0027, \u0027cinder\u0027],"},{"line_number":139,"context_line":"                help\u003d_ENABLED_IFACE_HELP.format(\u0027storage\u0027)),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027default_storage_interface\u0027,"},{"line_number":141,"context_line":"               help\u003d_DEFAULT_IFACE_HELP.format(\u0027storage\u0027)),"}],"source_content_type":"text/x-python","patch_set":43,"id":"3f044301_f11bfcc6","line":138,"updated":"2017-05-12 11:54:20.000000000","message":"nit: dunno what I feel about enabling it already.. it\u0027s not wired it, so what\u0027s the point?","commit_id":"ad8485210079d6ebd6a5c5acc4078f47eabedd7d"}],"ironic/drivers/modules/storage/cinder.py":[{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        raise exception.StorageError(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _validate_connectors(self, task):"},{"line_number":45,"context_line":"        \"\"\"Validate connector information helper.."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":48,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_38b433d0","line":45,"updated":"2016-11-21 14:48:50.000000000","message":"nit: extra dot","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        raise exception.StorageError(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _validate_connectors(self, task):"},{"line_number":45,"context_line":"        \"\"\"Validate connector information helper.."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":48,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_11bf2461","line":45,"in_reply_to":"7a77a97e_38b433d0","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def _validate_connectors(self, task):"},{"line_number":45,"context_line":"        \"\"\"Validate connector information helper.."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":48,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"},{"line_number":49,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":50,"context_line":"        is not enabled."}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d8db3f20","line":47,"updated":"2016-11-21 14:48:50.000000000","message":"nit: s/conenctor/connector","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":72,"context_line":"                iscsi_found \u003d True"},{"line_number":73,"context_line":"                if (iscsi_found and not ipxe_enabled):"},{"line_number":74,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the ironic \""},{"line_number":75,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":76,"context_line":"                             \"enabled. This option must be enabled to support \""},{"line_number":77,"context_line":"                             \"network booting to an iSCSI volume.\") %"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d8ba5f71","line":74,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":72,"context_line":"                iscsi_found \u003d True"},{"line_number":73,"context_line":"                if (iscsi_found and not ipxe_enabled):"},{"line_number":74,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the ironic \""},{"line_number":75,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":76,"context_line":"                             \"enabled. This option must be enabled to support \""},{"line_number":77,"context_line":"                             \"network booting to an iSCSI volume.\") %"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_113484f9","line":74,"in_reply_to":"7a77a97e_d8ba5f71","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":94,"context_line":"        \"\"\"Validate target information helper.."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":97,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_b854c321","line":94,"updated":"2016-11-21 14:48:50.000000000","message":"ditto","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":94,"context_line":"        \"\"\"Validate target information helper.."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":97,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_710cd842","line":94,"in_reply_to":"7a77a97e_b854c321","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":94,"context_line":"        \"\"\"Validate target information helper.."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":97,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"},{"line_number":98,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":99,"context_line":"        is not enabled."}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_3848b387","line":96,"updated":"2016-11-21 14:48:50.000000000","message":"ditto","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":94,"context_line":"        \"\"\"Validate target information helper.."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Enumerates through all conenctor objects, and identifies if"},{"line_number":97,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"},{"line_number":98,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":99,"context_line":"        is not enabled."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_51151c47","line":96,"in_reply_to":"7a77a97e_3848b387","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            # as well."},{"line_number":123,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":124,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":125,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is\""},{"line_number":126,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":127,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":128,"context_line":"                             \"the node.\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_93bd2805","line":125,"updated":"2016-11-21 14:48:50.000000000","message":"missing space here.","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            # as well."},{"line_number":123,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":124,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":125,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is\""},{"line_number":126,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":127,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":128,"context_line":"                             \"the node.\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_cc2fcf86","line":125,"in_reply_to":"7a77a97e_93bd2805","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":130,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":131,"context_line":"                if not found_types[\u0027fc_found\u0027]:"},{"line_number":132,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is\""},{"line_number":133,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":134,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":135,"context_line":"                             \"the node\u0027s volume connectors.\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_13403807","line":132,"updated":"2016-11-21 14:48:50.000000000","message":"ditto","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":130,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":131,"context_line":"                if not found_types[\u0027fc_found\u0027]:"},{"line_number":132,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is\""},{"line_number":133,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":134,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":135,"context_line":"                             \"the node\u0027s volume connectors.\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_0c9e27b8","line":132,"in_reply_to":"7a77a97e_13403807","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"            else:"},{"line_number":153,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unkown type \""},{"line_number":154,"context_line":"                         \"\u0027%(type)s.\u0027\"),"},{"line_number":155,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"},{"line_number":156,"context_line":"                self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_73ab2cd7","line":153,"updated":"2016-11-21 14:48:50.000000000","message":"s/unkown/unknown","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"            else:"},{"line_number":153,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unkown type \""},{"line_number":154,"context_line":"                         \"\u0027%(type)s.\u0027\"),"},{"line_number":155,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"},{"line_number":156,"context_line":"                self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_eccf2bb1","line":153,"in_reply_to":"7a77a97e_73ab2cd7","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def attach_volumes(self, task):"},{"line_number":204,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        :param task: a TaskManager instance."},{"line_number":207,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_33e1b4ff","line":204,"updated":"2016-11-21 14:48:50.000000000","message":"s/detach/attach","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def attach_volumes(self, task):"},{"line_number":204,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        :param task: a TaskManager instance."},{"line_number":207,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_2c41230c","line":204,"in_reply_to":"7a77a97e_33e1b4ff","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        try:"},{"line_number":213,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":214,"context_line":"        except exception.StorageError as e:"},{"line_number":215,"context_line":"            msg \u003d (_(\"Error attaching volumes for node %(node)s: %(err)s\"),"},{"line_number":216,"context_line":"                   {\u0027node\u0027: node.uuid,"},{"line_number":217,"context_line":"                    \u0027err\u0027: e})"},{"line_number":218,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d32a402f","line":215,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        try:"},{"line_number":213,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":214,"context_line":"        except exception.StorageError as e:"},{"line_number":215,"context_line":"            msg \u003d (_(\"Error attaching volumes for node %(node)s: %(err)s\"),"},{"line_number":216,"context_line":"                   {\u0027node\u0027: node.uuid,"},{"line_number":217,"context_line":"                    \u0027err\u0027: e})"},{"line_number":218,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_4c12df0a","line":215,"in_reply_to":"7a77a97e_d32a402f","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            try:"},{"line_number":220,"context_line":"                cinder.detach_volumes(task, connected, connector)"},{"line_number":221,"context_line":"            except exception.StorageError as e:"},{"line_number":222,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":223,"context_line":"                         \"%(err)s.\"),"},{"line_number":224,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":225,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d3b880eb","line":222,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            try:"},{"line_number":220,"context_line":"                cinder.detach_volumes(task, connected, connector)"},{"line_number":221,"context_line":"            except exception.StorageError as e:"},{"line_number":222,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":223,"context_line":"                         \"%(err)s.\"),"},{"line_number":224,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":225,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_8cf4f7cf","line":222,"in_reply_to":"7a77a97e_d3b880eb","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            raise exception.StorageError(msg)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":229,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":230,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":231,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":232,"context_line":"                   {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_b3c4e45f","line":229,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            raise exception.StorageError(msg)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":229,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":230,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":231,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":232,"context_line":"                   {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_ecd2cb33","line":229,"in_reply_to":"7a77a97e_b3c4e45f","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":229,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":230,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":231,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":232,"context_line":"                   {\u0027node\u0027: node.uuid})"},{"line_number":233,"context_line":"            LOG.error(msg)"},{"line_number":234,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_33aff495","line":231,"updated":"2016-11-21 14:48:50.000000000","message":"s/%/,","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":229,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":230,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":231,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":232,"context_line":"                   {\u0027node\u0027: node.uuid})"},{"line_number":233,"context_line":"            LOG.error(msg)"},{"line_number":234,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_2c820301","line":231,"in_reply_to":"7a77a97e_33aff495","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            try:"},{"line_number":235,"context_line":"                cinder.detach_volumes(task, connected, connector)"},{"line_number":236,"context_line":"            except exception.StorageError as e:"},{"line_number":237,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":238,"context_line":"                         \"%(err)s\") %"},{"line_number":239,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":240,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_73916c52","line":237,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            try:"},{"line_number":235,"context_line":"                cinder.detach_volumes(task, connected, connector)"},{"line_number":236,"context_line":"            except exception.StorageError as e:"},{"line_number":237,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":238,"context_line":"                         \"%(err)s\") %"},{"line_number":239,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":240,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_6c7cfb20","line":237,"in_reply_to":"7a77a97e_73916c52","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            connected \u003d cinder.detach_volumes(task, targets, connector)"},{"line_number":267,"context_line":"        except exception.StorageError as e:"},{"line_number":268,"context_line":"            msg \u003d (_(\"Error detaching volumes for node %(node)s: %(err)s\") %"},{"line_number":269,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":270,"context_line":"            LOG.error(msg)"},{"line_number":271,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_93752834","line":268,"updated":"2016-11-21 14:48:50.000000000","message":"ditto","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            connected \u003d cinder.detach_volumes(task, targets, connector)"},{"line_number":267,"context_line":"        except exception.StorageError as e:"},{"line_number":268,"context_line":"            msg \u003d (_(\"Error detaching volumes for node %(node)s: %(err)s\") %"},{"line_number":269,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":270,"context_line":"            LOG.error(msg)"},{"line_number":271,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_8c77973a","line":268,"in_reply_to":"7a77a97e_93752834","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                cinder.detach_volumes("},{"line_number":276,"context_line":"                    task, connected, connector, allow_errors\u003dTrue)"},{"line_number":277,"context_line":"            except exception.StorageError as e:"},{"line_number":278,"context_line":"                msg \u003d (_(\"Error re-attempting to detach for node %(node)s: \""},{"line_number":279,"context_line":"                         \"%(err)s\") %"},{"line_number":280,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":281,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d38de02b","line":278,"updated":"2016-11-21 14:48:50.000000000","message":"ditto","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f96db19d359697322c119dee50b59b7bf92439e7","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                cinder.detach_volumes("},{"line_number":276,"context_line":"                    task, connected, connector, allow_errors\u003dTrue)"},{"line_number":277,"context_line":"            except exception.StorageError as e:"},{"line_number":278,"context_line":"                msg \u003d (_(\"Error re-attempting to detach for node %(node)s: \""},{"line_number":279,"context_line":"                         \"%(err)s\") %"},{"line_number":280,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":281,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_cc718f46","line":278,"in_reply_to":"7a77a97e_d38de02b","updated":"2016-12-02 18:40:39.000000000","message":"Done","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":341,"context_line":"                valid \u003d True"},{"line_number":342,"context_line":"                continue"},{"line_number":343,"context_line":"            LOG.warning(_(\u0027Node %(node)s has a volume_connector \u0027"},{"line_number":344,"context_line":"                          \u0027(%(uuid)s) defined with an unsupported type: \u0027"},{"line_number":345,"context_line":"                          \u0027%(type)s.\u0027),"},{"line_number":346,"context_line":"                        {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_3310d4a8","line":343,"updated":"2016-11-21 14:48:50.000000000","message":"_LW","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"dec988524201c603a2478c9d96183398fcd296cb","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                         \u0027uuid\u0027: connector.uuid,"},{"line_number":348,"context_line":"                         \u0027type\u0027: connector.type})"},{"line_number":349,"context_line":"        if not valid:"},{"line_number":350,"context_line":"            msg \u003d (_(\u0027Insufficent or incompatible volume connection \u0027"},{"line_number":351,"context_line":"                     \u0027records for node %s.\u0027) % task.node.uuid)"},{"line_number":352,"context_line":"            LOG.error(msg)"},{"line_number":353,"context_line":"            raise exception.StorageError(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_33b454d0","line":350,"updated":"2016-11-21 14:48:50.000000000","message":"_LE","commit_id":"5e5f4dd3a8f94b976b546cee1175c89f096886ee"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return {}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _fail_validate(self, task, reason):"},{"line_number":45,"context_line":"        msg \u003d (_LE(\"Failed to validate cinder storage_interface for \""},{"line_number":46,"context_line":"                   \"%(node)s. %(reason)s\") %"},{"line_number":47,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":48,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_7b9eb064","line":45,"updated":"2016-12-07 14:38:10.000000000","message":"you raise an exception with this message, so s/LE//","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return {}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _fail_validate(self, task, reason):"},{"line_number":45,"context_line":"        msg \u003d (_LE(\"Failed to validate cinder storage_interface for \""},{"line_number":46,"context_line":"                   \"%(node)s. %(reason)s\") %"},{"line_number":47,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":48,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_daacae37","line":45,"in_reply_to":"3a71b18c_7b9eb064","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for volume in task.volume_targets:"},{"line_number":119,"context_line":"            if volume.volume_id is None:"},{"line_number":120,"context_line":"                msg \u003d (_LE(\"volume_id missing from target %(id)s.\"),"},{"line_number":121,"context_line":"                       {\u0027id\u0027: volume.uuid})"},{"line_number":122,"context_line":"                self._fail_validate(task, msg)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            # NOTE(TheJulia): We should likely consider incorporation"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_9b9b8c72","line":121,"updated":"2016-12-07 14:38:10.000000000","message":"msg ends up being a tuple here, you need , -\u003e % if you don\u0027t pass it instantly to logging\n\nalso it\u0027s user-visible, so s/LE//","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for volume in task.volume_targets:"},{"line_number":119,"context_line":"            if volume.volume_id is None:"},{"line_number":120,"context_line":"                msg \u003d (_LE(\"volume_id missing from target %(id)s.\"),"},{"line_number":121,"context_line":"                       {\u0027id\u0027: volume.uuid})"},{"line_number":122,"context_line":"                self._fail_validate(task, msg)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            # NOTE(TheJulia): We should likely consider incorporation"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_fdba4422","line":121,"in_reply_to":"3a71b18c_9b9b8c72","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                               \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                               \"capability fibre_channel_boot is not set on \""},{"line_number":134,"context_line":"                               \"the node.\"),"},{"line_number":135,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":136,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":137,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_bb868814","line":134,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                               \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                               \"capability fibre_channel_boot is not set on \""},{"line_number":134,"context_line":"                               \"the node.\"),"},{"line_number":135,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":136,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":137,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_3dd4bc1e","line":134,"in_reply_to":"3a71b18c_bb868814","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":139,"context_line":"                               \"configured for fibre_channel, however no \""},{"line_number":140,"context_line":"                               \"fibre channel WWPNs are configured for \""},{"line_number":141,"context_line":"                               \"the node\u0027s volume connectors.\"),"},{"line_number":142,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_db8b441d","line":141,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":139,"context_line":"                               \"configured for fibre_channel, however no \""},{"line_number":140,"context_line":"                               \"fibre channel WWPNs are configured for \""},{"line_number":141,"context_line":"                               \"the node\u0027s volume connectors.\"),"},{"line_number":142,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_9d45d018","line":141,"in_reply_to":"3a71b18c_db8b441d","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                if (not iscsi_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":147,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":148,"context_line":"                               \"configured for iscsi, however the \""},{"line_number":149,"context_line":"                               \"capability iscsi_boot is not set.\"),"},{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_fb8000fa","line":149,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                if (not iscsi_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":147,"context_line":"                    msg \u003d (_LE(\"Volume target %(id)s is \""},{"line_number":148,"context_line":"                               \"configured for iscsi, however the \""},{"line_number":149,"context_line":"                               \"capability iscsi_boot is not set.\"),"},{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_1dbb800f","line":149,"in_reply_to":"3a71b18c_fb8000fa","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        and raise a StorageError."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param task: The task object"},{"line_number":178,"context_line":"        :raises: StorageError"},{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        found_types \u003d self._validate_connectors(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_1b869c13","line":178,"updated":"2016-12-07 14:38:10.000000000","message":"validate() is expected to raise either InvalidParamterValue or MissingParamterValue or UnsupportedVendorExtension. IIRC everything else is handled as a real failure, not as a validation not passing","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        and raise a StorageError."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param task: The task object"},{"line_number":178,"context_line":"        :raises: StorageError"},{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        found_types \u003d self._validate_connectors(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_bd27ec10","line":178,"in_reply_to":"3a71b18c_1b869c13","updated":"2016-12-14 18:10:06.000000000","message":"So perhaps time for \"InvalidConfigurationValue\" or something more-so along that line?","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        found_types \u003d self._validate_connectors(task)"},{"line_number":182,"context_line":"        node \u003d task.node"},{"line_number":183,"context_line":"        capabilities \u003d node.properties.get(\u0027capabilities\u0027, {})"},{"line_number":184,"context_line":"        iscsi_boot \u003d strutils.bool_from_string("},{"line_number":185,"context_line":"            capabilities.get(\u0027iscsi_boot\u0027, None))"},{"line_number":186,"context_line":"        fc_boot \u003d strutils.bool_from_string("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_3b7b582b","line":183,"updated":"2016-12-07 14:38:10.000000000","message":"I wish capabilities were a dictionary.. but they aren\u0027t, they\u0027re something like foo:bar,foo2:bar2. I think we have somewhere a function to convert the format.\n\nor did you mean to use node.instance_info[\u0027capabilities\u0027]? this might be more appropriate","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        found_types \u003d self._validate_connectors(task)"},{"line_number":182,"context_line":"        node \u003d task.node"},{"line_number":183,"context_line":"        capabilities \u003d node.properties.get(\u0027capabilities\u0027, {})"},{"line_number":184,"context_line":"        iscsi_boot \u003d strutils.bool_from_string("},{"line_number":185,"context_line":"            capabilities.get(\u0027iscsi_boot\u0027, None))"},{"line_number":186,"context_line":"        fc_boot \u003d strutils.bool_from_string("}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_5df25870","line":183,"in_reply_to":"3a71b18c_3b7b582b","updated":"2016-12-14 18:10:06.000000000","message":"Ugh, I thought we did convert it.  It is not the instance_info capabilities, its the one in properties that we need to reference.  changing to use the ironic/driver/util.py get_node_capability.","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        node \u003d task.node"},{"line_number":183,"context_line":"        capabilities \u003d node.properties.get(\u0027capabilities\u0027, {})"},{"line_number":184,"context_line":"        iscsi_boot \u003d strutils.bool_from_string("},{"line_number":185,"context_line":"            capabilities.get(\u0027iscsi_boot\u0027, None))"},{"line_number":186,"context_line":"        fc_boot \u003d strutils.bool_from_string("},{"line_number":187,"context_line":"            capabilities.get(\u0027fibre_channel_boot\u0027, None))"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_5b78142c","line":185,"updated":"2016-12-07 14:38:10.000000000","message":"nit: None is redundant","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        node \u003d task.node"},{"line_number":183,"context_line":"        capabilities \u003d node.properties.get(\u0027capabilities\u0027, {})"},{"line_number":184,"context_line":"        iscsi_boot \u003d strutils.bool_from_string("},{"line_number":185,"context_line":"            capabilities.get(\u0027iscsi_boot\u0027, None))"},{"line_number":186,"context_line":"        fc_boot \u003d strutils.bool_from_string("},{"line_number":187,"context_line":"            capabilities.get(\u0027fibre_channel_boot\u0027, None))"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_5d8c1835","line":185,"in_reply_to":"3a71b18c_5b78142c","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        # boot capability is defined."},{"line_number":192,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":193,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":194,"context_line":"            msg \u003d (_LE(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":195,"context_line":"                       \"an associated volume_connector type must be valid for \""},{"line_number":196,"context_line":"                       \"iSCSI (iqn)\") %"},{"line_number":197,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_7b75d030","line":194,"updated":"2016-12-07 14:38:10.000000000","message":"s/LE// as it\u0027s user-visible","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        # boot capability is defined."},{"line_number":192,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":193,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":194,"context_line":"            msg \u003d (_LE(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":195,"context_line":"                       \"an associated volume_connector type must be valid for \""},{"line_number":196,"context_line":"                       \"iSCSI (iqn)\") %"},{"line_number":197,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_3d059c79","line":194,"in_reply_to":"3a71b18c_7b75d030","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        if (fc_boot and not found_types[\u0027fc_found\u0027]):"},{"line_number":201,"context_line":"            valid_types \u003d VALID_FC_TYPES.join(\u0027, \u0027)"},{"line_number":202,"context_line":"            msg \u003d (_LE(\"In order to enable the fibre_channel_boot \""},{"line_number":203,"context_line":"                       \"capabilitiy, a associated volume_connector type \""},{"line_number":204,"context_line":"                       \"must be valid for Fibre Channel (wwpn).\"))"},{"line_number":205,"context_line":"            self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_9b72ac48","line":202,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        if (fc_boot and not found_types[\u0027fc_found\u0027]):"},{"line_number":201,"context_line":"            valid_types \u003d VALID_FC_TYPES.join(\u0027, \u0027)"},{"line_number":202,"context_line":"            msg \u003d (_LE(\"In order to enable the fibre_channel_boot \""},{"line_number":203,"context_line":"                       \"capabilitiy, a associated volume_connector type \""},{"line_number":204,"context_line":"                       \"must be valid for Fibre Channel (wwpn).\"))"},{"line_number":205,"context_line":"            self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_9d02306e","line":202,"in_reply_to":"3a71b18c_9b72ac48","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def attach_volumes(self, task):"},{"line_number":210,"context_line":"        \"\"\"Informs the storage subsystem to attach all volumes for the node."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        :param task: a TaskManager instance."},{"line_number":213,"context_line":"        \"\"\""},{"line_number":214,"context_line":"        node \u003d task.node"},{"line_number":215,"context_line":"        targets \u003d task.volume_targets"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_bb8da82c","line":212,"updated":"2016-12-07 14:38:10.000000000","message":"nit: :raises:","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def attach_volumes(self, task):"},{"line_number":210,"context_line":"        \"\"\"Informs the storage subsystem to attach all volumes for the node."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        :param task: a TaskManager instance."},{"line_number":213,"context_line":"        \"\"\""},{"line_number":214,"context_line":"        node \u003d task.node"},{"line_number":215,"context_line":"        targets \u003d task.volume_targets"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_a926cecb","line":212,"in_reply_to":"3a71b18c_bb8da82c","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        targets \u003d task.volume_targets"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":218,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":219,"context_line":"            return True"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        connector \u003d self._generate_connector(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_db92644b","line":218,"updated":"2016-12-07 14:38:10.000000000","message":"nit:\n\n if not targets:\n\nseems *slightly* more pythonic to me","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        targets \u003d task.volume_targets"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":218,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":219,"context_line":"            return True"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        connector \u003d self._generate_connector(task)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_646f7dc5","line":218,"in_reply_to":"3a71b18c_db92644b","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":218,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":219,"context_line":"            return True"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_fb972038","line":219,"updated":"2016-12-07 14:38:10.000000000","message":"do we return something or should it be s/ True//?","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":218,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":219,"context_line":"            return True"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_a4143544","line":219,"in_reply_to":"3a71b18c_fb972038","updated":"2016-12-14 18:10:06.000000000","message":"//, fixing.","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        try:"},{"line_number":224,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":225,"context_line":"        except exception.StorageError as e:"},{"line_number":226,"context_line":"            msg \u003d (_LE(\"Error attaching volumes for node %(node)s: %(err)s\"),"},{"line_number":227,"context_line":"                   {\u0027node\u0027: node.uuid,"},{"line_number":228,"context_line":"                    \u0027err\u0027: e})"},{"line_number":229,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_1b9dbc59","line":226,"updated":"2016-12-07 14:38:10.000000000","message":"ditto about , and LE","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        try:"},{"line_number":224,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":225,"context_line":"        except exception.StorageError as e:"},{"line_number":226,"context_line":"            msg \u003d (_LE(\"Error attaching volumes for node %(node)s: %(err)s\"),"},{"line_number":227,"context_line":"                   {\u0027node\u0027: node.uuid,"},{"line_number":228,"context_line":"                    \u0027err\u0027: e})"},{"line_number":229,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_443b619c","line":226,"in_reply_to":"3a71b18c_1b9dbc59","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":232,"context_line":"            except exception.StorageError as e:"},{"line_number":233,"context_line":"                msg \u003d (_LE(\"Error aborting volume detach for node %(node)s: \""},{"line_number":234,"context_line":"                           \"%(err)s.\"),"},{"line_number":235,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":236,"context_line":"                LOG.error(msg)"},{"line_number":237,"context_line":"            raise exception.StorageError(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_3ba2789b","line":234,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":232,"context_line":"            except exception.StorageError as e:"},{"line_number":233,"context_line":"                msg \u003d (_LE(\"Error aborting volume detach for node %(node)s: \""},{"line_number":234,"context_line":"                           \"%(err)s.\"),"},{"line_number":235,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":236,"context_line":"                LOG.error(msg)"},{"line_number":237,"context_line":"            raise exception.StorageError(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_243825a0","line":234,"in_reply_to":"3a71b18c_3ba2789b","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":240,"context_line":"            msg \u003d (_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":241,"context_line":"                       \"does not match the number attached volumes. \""},{"line_number":242,"context_line":"                       \"Attempting detach and aborting operation.\"),"},{"line_number":243,"context_line":"                   {\u0027node\u0027: node.uuid})"},{"line_number":244,"context_line":"            LOG.error(msg)"},{"line_number":245,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_5b9f3450","line":242,"updated":"2016-12-07 14:38:10.000000000","message":"ditto","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"22bcb49aca96e3160c2e98866d4235df0a0569e9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":240,"context_line":"            msg \u003d (_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":241,"context_line":"                       \"does not match the number attached volumes. \""},{"line_number":242,"context_line":"                       \"Attempting detach and aborting operation.\"),"},{"line_number":243,"context_line":"                   {\u0027node\u0027: node.uuid})"},{"line_number":244,"context_line":"            LOG.error(msg)"},{"line_number":245,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_04bb290f","line":242,"in_reply_to":"3a71b18c_5b9f3450","updated":"2016-12-14 18:10:06.000000000","message":"Done","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"dcc9b6b009a62824e34d4ffd6ba695da84a26c84","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        \"\"\""},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        # TODO(TheJulia): This method will be written as part of the changes"},{"line_number":318,"context_line":"        # to the boot logic, and for now should always return false."},{"line_number":319,"context_line":"        return False"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _generate_connector(self, task):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_7bacf08c","line":318,"updated":"2016-12-07 14:38:10.000000000","message":"nit: please move this comment to the docstring","commit_id":"08b39fa6461f5202c780f24b09972c48560528a3"},{"author":{"_account_id":20146,"name":"yuyafei","email":"yu.yafei@foxmail.com","username":"yuyafei"},"change_message_id":"5c28f5d05662183d17fe08a848f594db5ee35616","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            try:"},{"line_number":247,"context_line":"                cinder.detach_volumes(task, connected, connector)"},{"line_number":248,"context_line":"            except exception.StorageError as e:"},{"line_number":249,"context_line":"                msg \u003d (_LE(\"Error aborting volume detach for node %(node)s: \""},{"line_number":250,"context_line":"                           \"%(err)s\") %"},{"line_number":251,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":252,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_3628e099","line":249,"range":{"start_line":249,"start_character":23,"end_line":249,"end_character":26},"updated":"2016-12-17 02:19:01.000000000","message":"LE may remove","commit_id":"08be752373bcd2b4eaefded6d9a91493c306ef0e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# NOTE(TheJulia): The list of valid types align with _generate_connector()."},{"line_number":30,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027)"},{"line_number":31,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":32,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_e7ed968c","line":29,"updated":"2017-01-02 17:18:33.000000000","message":"list? it seems to be one string, maybe you forgot a comma in a tuple? then it\u0027s still not a list though :)","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":29,"context_line":"# NOTE(TheJulia): The list of valid types align with _generate_connector()."},{"line_number":30,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027)"},{"line_number":31,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":32,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class CinderStorage(base.StorageInterface):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_07037a43","line":32,"updated":"2017-01-02 17:18:33.000000000","message":"ditto, maybe create a set?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        :param task: The task object"},{"line_number":61,"context_line":"        :raises: InvalidParameterValue"},{"line_number":62,"context_line":"        :returns: Dictonary containing iscsi_found and fc_found"},{"line_number":63,"context_line":"                  keys with boolean values representing if the"},{"line_number":64,"context_line":"                  helper found that connector type configured"},{"line_number":65,"context_line":"                  for the node."}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_27007e34","line":62,"updated":"2017-01-02 17:18:33.000000000","message":"nit: typo in dictionary","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        for connector in task.volume_connectors:"},{"line_number":74,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":75,"context_line":"                    connector.connector_id is not None):"},{"line_number":76,"context_line":"                if not iscsi_found:"},{"line_number":77,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_47fd8239","line":76,"updated":"2017-01-02 17:18:33.000000000","message":"I don\u0027t quite get this check, sorry.. it will always be False on the first iteration, why are we logging?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        for connector in task.volume_connectors:"},{"line_number":74,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":75,"context_line":"                    connector.connector_id is not None):"},{"line_number":76,"context_line":"                if not iscsi_found:"},{"line_number":77,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_5ccada6f","line":76,"in_reply_to":"ba5201f7_3aacf734","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        for connector in task.volume_connectors:"},{"line_number":74,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":75,"context_line":"                    connector.connector_id is not None):"},{"line_number":76,"context_line":"                if not iscsi_found:"},{"line_number":77,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_3aacf734","line":76,"in_reply_to":"ba5201f7_47fd8239","updated":"2017-01-03 18:30:25.000000000","message":"I think this should just be \"if iscsi_found\", so we would log if an iSCSI connector record was found in a previous iteration. Right?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":80,"context_line":"                iscsi_found \u003d True"},{"line_number":81,"context_line":"                if (iscsi_found and not ipxe_enabled):"},{"line_number":82,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the \""},{"line_number":83,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":84,"context_line":"                             \"enabled. This option must be enabled to \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_67fa8644","line":81,"updated":"2017-01-02 17:18:33.000000000","message":"check on iscsi_found is redundant, you\u0027ve just set it to True","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":80,"context_line":"                iscsi_found \u003d True"},{"line_number":81,"context_line":"                if (iscsi_found and not ipxe_enabled):"},{"line_number":82,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the \""},{"line_number":83,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":84,"context_line":"                             \"enabled. This option must be enabled to \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_7aa67f54","line":81,"in_reply_to":"ba5201f7_67fa8644","updated":"2017-01-03 18:30:25.000000000","message":"+1","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":79,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":80,"context_line":"                iscsi_found \u003d True"},{"line_number":81,"context_line":"                if (iscsi_found and not ipxe_enabled):"},{"line_number":82,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the \""},{"line_number":83,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":84,"context_line":"                             \"enabled. This option must be enabled to \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_3ccd1687","line":81,"in_reply_to":"ba5201f7_7aa67f54","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        node \u003d task.node"},{"line_number":118,"context_line":"        for volume in task.volume_targets:"},{"line_number":119,"context_line":"            if volume.volume_id is None:"},{"line_number":120,"context_line":"                msg \u003d (_(\"volume_id missing from target %(id)s.\") %"},{"line_number":121,"context_line":"                       {\u0027id\u0027: volume.uuid})"},{"line_number":122,"context_line":"                self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_3d9231a0","line":119,"updated":"2017-01-03 18:30:25.000000000","message":"I\u0027m curious - it\u0027s not possible for this attribute to be completely missing from the object, right? i.e. this wouldn\u0027t raise AttributeError","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        node \u003d task.node"},{"line_number":118,"context_line":"        for volume in task.volume_targets:"},{"line_number":119,"context_line":"            if volume.volume_id is None:"},{"line_number":120,"context_line":"                msg \u003d (_(\"volume_id missing from target %(id)s.\") %"},{"line_number":121,"context_line":"                       {\u0027id\u0027: volume.uuid})"},{"line_number":122,"context_line":"                self._fail_validate(task, msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_bc8d862c","line":119,"in_reply_to":"ba5201f7_3d9231a0","updated":"2017-01-10 02:53:52.000000000","message":"It is defined from the object, so it should be there, although it could be empty if there is a record but bad data in that record.","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            # relevent to the checks we perform here as in the end a"},{"line_number":127,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":128,"context_line":"            # as well."},{"line_number":129,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":130,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_8795aae5","line":129,"updated":"2017-01-02 17:18:33.000000000","message":"volume_type seems to be a string, why is \"in\" operator used here and below?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            # relevent to the checks we perform here as in the end a"},{"line_number":127,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":128,"context_line":"            # as well."},{"line_number":129,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":130,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_bd61c1aa","line":129,"in_reply_to":"ba5201f7_8795aae5","updated":"2017-01-03 18:30:25.000000000","message":"I\u0027m not very familiar with Cinder, but it appears as though users may create arbitrary volume types: https://wiki.openstack.org/wiki/Cinder-multi-backend#Volume_Type\n\nwhich raises the question - is there a default set of volume types that this is keying off of?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            # relevent to the checks we perform here as in the end a"},{"line_number":127,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":128,"context_line":"            # as well."},{"line_number":129,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":130,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_028c6c34","line":129,"in_reply_to":"ba5201f7_bd61c1aa","updated":"2017-01-10 02:53:52.000000000","message":"I believe this this would actually need to be along the lines of driver_volume_type, although it is a freeform field returned from drivers. Most of the drivers set it, however the LVM driver does not.  Given the use interaction, I think this is something we will need to truly perform the translation for in cinder since we\u0027re trying to be relatively generic in ironic, and in cinder we can fairly easily build the evaluations in to try and figure out what the right type would be.\n\nBack to Dimity\u0027s question, substring matching was the reason I used in, instead of doing \u003d\u003d.\n\nRegardless, I\u0027ve added an inline todo as a reminder where the data should come from.","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":128,"context_line":"            # as well."},{"line_number":129,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":130,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                             \"capability fibre_channel_boot is not set on \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_a79aae12","line":130,"updated":"2017-01-02 17:18:33.000000000","message":"nit: redundant brackets","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":128,"context_line":"            # as well."},{"line_number":129,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":130,"context_line":"                if (not fc_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                             \"capability fibre_channel_boot is not set on \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b2391cdb","line":130,"in_reply_to":"ba5201f7_a79aae12","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":134,"context_line":"                             \"the node.\") %"},{"line_number":135,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":136,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":137,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_c79fb201","line":134,"updated":"2017-01-02 17:18:33.000000000","message":"%(node)s is missing","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":132,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":133,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":134,"context_line":"                             \"the node.\") %"},{"line_number":135,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":136,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":137,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_223a50e8","line":134,"in_reply_to":"ba5201f7_c79fb201","updated":"2017-01-10 02:53:52.000000000","message":"doh!","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":139,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":140,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":141,"context_line":"                             \"the node\u0027s volume connectors.\") %"},{"line_number":142,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_e7a4b658","line":141,"updated":"2017-01-02 17:18:33.000000000","message":"ditto","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":139,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":140,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":141,"context_line":"                             \"the node\u0027s volume connectors.\") %"},{"line_number":142,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":143,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_4572feae","line":141,"in_reply_to":"ba5201f7_e7a4b658","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            elif \u0027iscsi\u0027 in volume.volume_type:"},{"line_number":146,"context_line":"                if (not iscsi_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":147,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":148,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":149,"context_line":"                             \"capability iscsi_boot is not set.\") %"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_d23dc0bc","line":146,"range":{"start_line":146,"start_character":0,"end_line":146,"end_character":63},"updated":"2017-01-10 02:53:52.000000000","message":"also fixing this excess brackets","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                if (not iscsi_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":147,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":148,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":149,"context_line":"                             \"capability iscsi_boot is not set.\") %"},{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_078a9abf","line":149,"updated":"2017-01-02 17:18:33.000000000","message":"ditto","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                if (not iscsi_boot and volume.boot_index \u003d\u003d 0):"},{"line_number":147,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":148,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":149,"context_line":"                             \"capability iscsi_boot is not set.\") %"},{"line_number":150,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":151,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_656702eb","line":149,"in_reply_to":"ba5201f7_078a9abf","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"},{"line_number":153,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":154,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":155,"context_line":"                             \"iscsi connectors are configured.\") %"},{"line_number":156,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":157,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":158,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_27879eb6","line":155,"updated":"2017-01-02 17:18:33.000000000","message":"ditto","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"},{"line_number":153,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":154,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":155,"context_line":"                             \"iscsi connectors are configured.\") %"},{"line_number":156,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":157,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":158,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_c55eee11","line":155,"in_reply_to":"ba5201f7_27879eb6","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":160,"context_line":"                         \"\u0027%(type)s.\u0027\") %"},{"line_number":161,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"},{"line_number":162,"context_line":"                self._fail_validate(task, msg)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_4794a2e1","line":160,"updated":"2017-01-02 17:18:33.000000000","message":"let\u0027s also output known types","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":160,"context_line":"                         \"\u0027%(type)s.\u0027\") %"},{"line_number":161,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"},{"line_number":162,"context_line":"                self._fail_validate(task, msg)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b2dcbc75","line":160,"in_reply_to":"ba5201f7_3df5d1ca","updated":"2017-01-10 02:53:52.000000000","message":"Done, Nothing magical since we don\u0027t have an actual list to return, but also adding an inline note for those who may touch the code in the future.","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    self._fail_validate(task, msg)"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":160,"context_line":"                         \"\u0027%(type)s.\u0027\") %"},{"line_number":161,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"},{"line_number":162,"context_line":"                self._fail_validate(task, msg)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_3df5d1ca","line":160,"in_reply_to":"ba5201f7_4794a2e1","updated":"2017-01-03 18:30:25.000000000","message":"+1","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        and raise a StorageError."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param task: The task object"},{"line_number":178,"context_line":"        :raises: InvaidParameterValue If a misconfigurtion or mismatch"},{"line_number":179,"context_line":"                 exists that would prevent storage the cinder storage"},{"line_number":180,"context_line":"                 driver from initalizing attachments."},{"line_number":181,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_3de31107","line":178,"range":{"start_line":178,"start_character":43,"end_line":178,"end_character":58},"updated":"2017-01-03 18:30:25.000000000","message":"nit: typo in misconfiguration","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        and raise a StorageError."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param task: The task object"},{"line_number":178,"context_line":"        :raises: InvaidParameterValue If a misconfigurtion or mismatch"},{"line_number":179,"context_line":"                 exists that would prevent storage the cinder storage"},{"line_number":180,"context_line":"                 driver from initalizing attachments."},{"line_number":181,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_72fdf46d","line":178,"range":{"start_line":178,"start_character":43,"end_line":178,"end_character":58},"in_reply_to":"ba5201f7_3de31107","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":189,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":190,"context_line":"        # boot capability is defined."},{"line_number":191,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_6791a6f0","line":191,"updated":"2017-01-02 17:18:33.000000000","message":"nit: redundant brackets","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":189,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":190,"context_line":"        # boot capability is defined."},{"line_number":191,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b2f75c8b","line":191,"in_reply_to":"ba5201f7_6791a6f0","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        # boot capability is defined."},{"line_number":191,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""},{"line_number":195,"context_line":"                     \"iSCSI (iqn)\") %"},{"line_number":196,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_bd92a149","line":193,"range":{"start_line":193,"start_character":56,"end_line":193,"end_character":67},"updated":"2017-01-03 18:30:25.000000000","message":"nit: typo in capability","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        # boot capability is defined."},{"line_number":191,"context_line":"        if (iscsi_boot and not found_types[\u0027iscsi_found\u0027]):"},{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""},{"line_number":195,"context_line":"                     \"iSCSI (iqn)\") %"},{"line_number":196,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_950de239","line":193,"range":{"start_line":193,"start_character":56,"end_line":193,"end_character":67},"in_reply_to":"ba5201f7_bd92a149","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""},{"line_number":195,"context_line":"                     \"iSCSI (iqn)\") %"},{"line_number":196,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"},{"line_number":197,"context_line":"            self._fail_validate(task, msg)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_87bcca6d","line":195,"updated":"2017-01-02 17:18:33.000000000","message":"msg does not contain any variables for % substitution","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            valid_types \u003d VALID_ISCSI_TYPES.join(\u0027, \u0027)"},{"line_number":193,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capabilitiy, \""},{"line_number":194,"context_line":"                     \"an associated volume_connector type must be valid for \""},{"line_number":195,"context_line":"                     \"iSCSI (iqn)\") %"},{"line_number":196,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"},{"line_number":197,"context_line":"            self._fail_validate(task, msg)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_72e7b4ac","line":195,"in_reply_to":"ba5201f7_87bcca6d","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        if (fc_boot and not found_types[\u0027fc_found\u0027]):"},{"line_number":200,"context_line":"            valid_types \u003d VALID_FC_TYPES.join(\u0027, \u0027)"},{"line_number":201,"context_line":"            msg \u003d (_(\"In order to enable the fibre_channel_boot \""},{"line_number":202,"context_line":"                     \"capabilitiy, an associated volume_connector type \""},{"line_number":203,"context_line":"                     \"must be valid for Fibre Channel (wwpn).\"))"},{"line_number":204,"context_line":"            self._fail_validate(task, msg)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_fd850907","line":202,"range":{"start_line":202,"start_character":23,"end_line":202,"end_character":33},"updated":"2017-01-03 18:30:25.000000000","message":"nit: typo in capability","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        if (fc_boot and not found_types[\u0027fc_found\u0027]):"},{"line_number":200,"context_line":"            valid_types \u003d VALID_FC_TYPES.join(\u0027, \u0027)"},{"line_number":201,"context_line":"            msg \u003d (_(\"In order to enable the fibre_channel_boot \""},{"line_number":202,"context_line":"                     \"capabilitiy, an associated volume_connector type \""},{"line_number":203,"context_line":"                     \"must be valid for Fibre Channel (wwpn).\"))"},{"line_number":204,"context_line":"            self._fail_validate(task, msg)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_955b222e","line":202,"range":{"start_line":202,"start_character":23,"end_line":202,"end_character":33},"in_reply_to":"ba5201f7_fd850907","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"4e6bce3e9fa641d23b36b88b1e877b0e0ed50c52","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def attach_volumes(self, task):"},{"line_number":209,"context_line":"        \"\"\"Informs the storage subsystem to attach all volumes for the node."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        :param task: a TaskManager instance."},{"line_number":212,"context_line":"        :raises: StorageError If an underlying exception or failure"},{"line_number":213,"context_line":"                              is detected."},{"line_number":214,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_bdb9c1cd","line":211,"updated":"2017-01-03 18:30:25.000000000","message":"might be useful to specify return value in the docstring","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def attach_volumes(self, task):"},{"line_number":209,"context_line":"        \"\"\"Informs the storage subsystem to attach all volumes for the node."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        :param task: a TaskManager instance."},{"line_number":212,"context_line":"        :raises: StorageError If an underlying exception or failure"},{"line_number":213,"context_line":"                              is detected."},{"line_number":214,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b5958689","line":211,"in_reply_to":"ba5201f7_bdb9c1cd","updated":"2017-01-10 02:53:52.000000000","message":"afaik, there really shouldn\u0027t be any.  That does on the other hand, highlight that the True below is wrong.","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        targets \u003d task.volume_targets"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":219,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":220,"context_line":"            return True"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        connector \u003d self._generate_connector(task)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_a7c1cee6","line":219,"updated":"2017-01-02 17:18:33.000000000","message":"nit: I generally prefer \"if not targets\"","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        targets \u003d task.volume_targets"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If there are no targets, then we have nothing to do."},{"line_number":219,"context_line":"        if len(targets) \u003d\u003d 0:"},{"line_number":220,"context_line":"            return True"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        connector \u003d self._generate_connector(task)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_158d727b","line":219,"in_reply_to":"ba5201f7_a7c1cee6","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":235,"context_line":"                         \"%(err)s.\") %"},{"line_number":236,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":237,"context_line":"                LOG.error(msg)"},{"line_number":238,"context_line":"            raise exception.StorageError(msg)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        if len(targets) !\u003d len(connected):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_c7b6d289","line":237,"updated":"2017-01-02 17:18:33.000000000","message":"nit: msg variable is not needed, you can just pass 2 arguments to LOG.error","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                msg \u003d (_(\"Error aborting volume detach for node %(node)s: \""},{"line_number":235,"context_line":"                         \"%(err)s.\") %"},{"line_number":236,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":237,"context_line":"                LOG.error(msg)"},{"line_number":238,"context_line":"            raise exception.StorageError(msg)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        if len(targets) !\u003d len(connected):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_55629aae","line":237,"in_reply_to":"ba5201f7_c7b6d289","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                         \"%(err)s.\") %"},{"line_number":236,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":237,"context_line":"                LOG.error(msg)"},{"line_number":238,"context_line":"            raise exception.StorageError(msg)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":241,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_e7bbd670","line":238,"updated":"2017-01-02 17:18:33.000000000","message":"let\u0027s use save_and_reraise_exception instead of wrapping StorageError again and losing traceback","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                         \"%(err)s.\") %"},{"line_number":236,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":237,"context_line":"                LOG.error(msg)"},{"line_number":238,"context_line":"            raise exception.StorageError(msg)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":241,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_75579eca","line":238,"in_reply_to":"ba5201f7_e7bbd670","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                msg \u003d (_LE(\"Error aborting volume detach for node %(node)s: \""},{"line_number":250,"context_line":"                           \"%(err)s\") %"},{"line_number":251,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":252,"context_line":"                LOG.error(msg)"},{"line_number":253,"context_line":"            raise exception.StorageError(msg)"},{"line_number":254,"context_line":"        for target in task.volume_targets:"},{"line_number":255,"context_line":"            for volume in connected:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_07b1ba8f","line":252,"updated":"2017-01-02 17:18:33.000000000","message":"nit: msg variable is not needed, you can just pass the 2 arguments to LOG.error","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                msg \u003d (_LE(\"Error aborting volume detach for node %(node)s: \""},{"line_number":250,"context_line":"                           \"%(err)s\") %"},{"line_number":251,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":252,"context_line":"                LOG.error(msg)"},{"line_number":253,"context_line":"            raise exception.StorageError(msg)"},{"line_number":254,"context_line":"        for target in task.volume_targets:"},{"line_number":255,"context_line":"            for volume in connected:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b5f826c6","line":252,"in_reply_to":"ba5201f7_07b1ba8f","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                    properties \u003d target.properties"},{"line_number":264,"context_line":"                    properties \u003d volume[\u0027data\u0027]"},{"line_number":265,"context_line":"                    target.properties \u003d properties"},{"line_number":266,"context_line":"                    target.save()"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def detach_volumes(self, task):"},{"line_number":269,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_27aebe2e","line":266,"updated":"2017-01-02 17:18:33.000000000","message":"let\u0027s move target.save outside of the nested \"for\" loop. or did you mean to \"break\" here?","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                    properties \u003d target.properties"},{"line_number":264,"context_line":"                    properties \u003d volume[\u0027data\u0027]"},{"line_number":265,"context_line":"                    target.properties \u003d properties"},{"line_number":266,"context_line":"                    target.save()"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def detach_volumes(self, task):"},{"line_number":269,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_95b882e7","line":266,"in_reply_to":"ba5201f7_27aebe2e","updated":"2017-01-10 02:53:52.000000000","message":"Yeah, We should be breaking and then saving, fixed.","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        try:"},{"line_number":287,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":288,"context_line":"        except exception.StorageError as e:"},{"line_number":289,"context_line":"            msg \u003d (_LE(\"Error detaching volumes for node %(node)s: %(err)s\") %"},{"line_number":290,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":291,"context_line":"            LOG.error(msg)"},{"line_number":292,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_47abc21d","line":289,"updated":"2017-01-02 17:18:33.000000000","message":"please mention that we\u0027re going to retry the operation. also msg is redundant, you can just pass 2 argumetns to LOG.error","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        try:"},{"line_number":287,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":288,"context_line":"        except exception.StorageError as e:"},{"line_number":289,"context_line":"            msg \u003d (_LE(\"Error detaching volumes for node %(node)s: %(err)s\") %"},{"line_number":290,"context_line":"                   {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":291,"context_line":"            LOG.error(msg)"},{"line_number":292,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b6910955","line":289,"in_reply_to":"ba5201f7_47abc21d","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            LOG.error(msg)"},{"line_number":292,"context_line":"            try:"},{"line_number":293,"context_line":"                LOG.debug(\"Re-attempting detach operations for %(node)s \""},{"line_number":294,"context_line":"                          \"such that failures are permitted.\","},{"line_number":295,"context_line":"                          {\u0027node\u0027: node.uuid})"},{"line_number":296,"context_line":"                if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":297,"context_line":"                    # NOTE(TheJulia): If the node is in ACTIVE state, we can"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_67a8c620","line":294,"updated":"2017-01-02 17:18:33.000000000","message":"I suggest we roll this message into LOG.error above","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            LOG.error(msg)"},{"line_number":292,"context_line":"            try:"},{"line_number":293,"context_line":"                LOG.debug(\"Re-attempting detach operations for %(node)s \""},{"line_number":294,"context_line":"                          \"such that failures are permitted.\","},{"line_number":295,"context_line":"                          {\u0027node\u0027: node.uuid})"},{"line_number":296,"context_line":"                if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":297,"context_line":"                    # NOTE(TheJulia): If the node is in ACTIVE state, we can"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_d6f04dcc","line":294,"in_reply_to":"ba5201f7_67a8c620","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bb1655f9ea911b87ee2fe9f6e6ee6bc444470e85","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                         \"%(err)s\") %"},{"line_number":310,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":311,"context_line":"                LOG.error(msg)"},{"line_number":312,"context_line":"                raise exception.StorageError(msg)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def should_write_image(self, task):"},{"line_number":315,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_8763ea19","line":312,"updated":"2017-01-02 17:18:33.000000000","message":"we don\u0027t need to catch exception here, just let it fall through","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd118646244b07f366a647e2b38e5e81b6e27651","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                         \"%(err)s\") %"},{"line_number":310,"context_line":"                       {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":311,"context_line":"                LOG.error(msg)"},{"line_number":312,"context_line":"                raise exception.StorageError(msg)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def should_write_image(self, task):"},{"line_number":315,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_d61f6db5","line":312,"in_reply_to":"ba5201f7_8763ea19","updated":"2017-01-10 02:53:52.000000000","message":"Done","commit_id":"a91eb6e1429f1d6d64a1371ae4be6b971d058d5f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the \""},{"line_number":89,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":90,"context_line":"                             \"enabled. This option must be enabled to \""},{"line_number":91,"context_line":"                             \"support network booting to an iSCSI volume.\") %"},{"line_number":92,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":93,"context_line":"                    LOG.error(msg)"},{"line_number":94,"context_line":"                    raise exception.InvalidParameterValue(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_26d4b21e","line":91,"updated":"2017-01-11 14:56:09.000000000","message":"I\u0027d shorted this to \"The [pxe]ipxe_enabled option should be set to True to support network booting to an iSCSI volume for node %s\"","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                    msg \u003d (_(\"Node %(node)s cannot be validated as the \""},{"line_number":89,"context_line":"                             \"conductor [pxe]ipxe_enabled is not presently \""},{"line_number":90,"context_line":"                             \"enabled. This option must be enabled to \""},{"line_number":91,"context_line":"                             \"support network booting to an iSCSI volume.\") %"},{"line_number":92,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":93,"context_line":"                    LOG.error(msg)"},{"line_number":94,"context_line":"                    raise exception.InvalidParameterValue(msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_9123cb57","line":91,"in_reply_to":"ba5201f7_26d4b21e","updated":"2017-01-11 19:19:11.000000000","message":"Makes sense, because it should get returned in the error field for the node.","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":244,"context_line":"        except exception.StorageError as e:"},{"line_number":245,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":246,"context_line":"                LOG.error(_(\"Error attaching volumes for node %(node)s: \""},{"line_number":247,"context_line":"                            \"%(err)s\"),"},{"line_number":248,"context_line":"                          {\u0027node\u0027: node.uuid,"},{"line_number":249,"context_line":"                           \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_46d9b656","line":246,"updated":"2017-01-11 14:56:09.000000000","message":"nit: s/_/_LE/ here","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":244,"context_line":"        except exception.StorageError as e:"},{"line_number":245,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":246,"context_line":"                LOG.error(_(\"Error attaching volumes for node %(node)s: \""},{"line_number":247,"context_line":"                            \"%(err)s\"),"},{"line_number":248,"context_line":"                          {\u0027node\u0027: node.uuid,"},{"line_number":249,"context_line":"                           \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_31d69ff1","line":246,"in_reply_to":"ba5201f7_46d9b656","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                    cinder.detach_volumes(task, targets, connector)"},{"line_number":252,"context_line":"                except exception.StorageError as e:"},{"line_number":253,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":254,"context_line":"                        LOG.error(_(\"Error aborting volume detach for node \""},{"line_number":255,"context_line":"                                    \"%(node)s: %(err)s.\"),"},{"line_number":256,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_66da3a4d","line":254,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                    cinder.detach_volumes(task, targets, connector)"},{"line_number":252,"context_line":"                except exception.StorageError as e:"},{"line_number":253,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":254,"context_line":"                        LOG.error(_(\"Error aborting volume detach for node \""},{"line_number":255,"context_line":"                                    \"%(node)s: %(err)s.\"),"},{"line_number":256,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_5105e377","line":254,"in_reply_to":"ba5201f7_66da3a4d","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":259,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":260,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":261,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":262,"context_line":"                   {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_86df1e39","line":259,"updated":"2017-01-11 14:56:09.000000000","message":"msg seems only used in LOG.error, so you may want to just pass 2 arguments to it","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":259,"context_line":"            msg \u003d (_(\"The number of volumes defined for node %(node)s \""},{"line_number":260,"context_line":"                     \"does not match the number attached volumes. \""},{"line_number":261,"context_line":"                     \"Attempting detach and aborting operation.\") %"},{"line_number":262,"context_line":"                   {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_511323b8","line":259,"in_reply_to":"ba5201f7_86df1e39","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        data \u003d {}"},{"line_number":364,"context_line":"        valid \u003d False"},{"line_number":365,"context_line":"        for connector in task.volume_connectors:"},{"line_number":366,"context_line":"            if (\u0027iqn\u0027 in connector.type and \u0027initiator\u0027 not in data):"},{"line_number":367,"context_line":"                data[\u0027initiator\u0027] \u003d connector.connector_id"},{"line_number":368,"context_line":"                valid \u003d True"},{"line_number":369,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_a6e8a2e3","line":366,"updated":"2017-01-11 14:56:09.000000000","message":"nit: redundant brackets here and below","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                         \u0027type\u0027: connector.type})"},{"line_number":393,"context_line":"        if not valid:"},{"line_number":394,"context_line":"            msg \u003d (_(\u0027Insufficent or incompatible volume connection \u0027"},{"line_number":395,"context_line":"                     \u0027records for node %s.\u0027), task.node.uuid)"},{"line_number":396,"context_line":"            LOG.error(msg)"},{"line_number":397,"context_line":"            raise exception.StorageError(msg)"},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_c6e5a609","line":395,"updated":"2017-01-11 14:56:09.000000000","message":"I wonder if we could provide a more detailed message..","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                         \u0027type\u0027: connector.type})"},{"line_number":393,"context_line":"        if not valid:"},{"line_number":394,"context_line":"            msg \u003d (_(\u0027Insufficent or incompatible volume connection \u0027"},{"line_number":395,"context_line":"                     \u0027records for node %s.\u0027), task.node.uuid)"},{"line_number":396,"context_line":"            LOG.error(msg)"},{"line_number":397,"context_line":"            raise exception.StorageError(msg)"},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_ec38c0d5","line":395,"in_reply_to":"ba5201f7_c6e5a609","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        return {}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _fail_validate(self, task, reason):"},{"line_number":52,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for \""},{"line_number":53,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":54,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_ff759997","line":51,"updated":"2017-01-17 16:53:01.000000000","message":"nit: s/validate/validation/","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    connector.connector_id is not None):"},{"line_number":82,"context_line":"                if iscsi_found:"},{"line_number":83,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":84,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":85,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":86,"context_line":"                iscsi_found \u003d True"},{"line_number":87,"context_line":"                if not ipxe_enabled:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_1f7b458d","line":84,"updated":"2017-01-17 16:53:01.000000000","message":"maybe worth logging which exactly is going to be used? also I wonder if it should be even a warning. how dangerous is this situation?","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    connector.connector_id is not None):"},{"line_number":82,"context_line":"                if iscsi_found:"},{"line_number":83,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":84,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":85,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":86,"context_line":"                iscsi_found \u003d True"},{"line_number":87,"context_line":"                if not ipxe_enabled:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_cd59fc8f","line":84,"in_reply_to":"7a3c09a3_1f7b458d","updated":"2017-01-23 21:59:51.000000000","message":"I\u0027m not really sure there is value to log the connection details. Danger wise, this is not really dangerous.  think of it as two scsi cards in a server connected to the same drive.  Only one of those cards will be able to speak to the drive at any given time, the drive will honor the lock of whatever controller won.  The information will still get passed, if memory serves, to cinder so the mapping information can be stored SAN side.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                             \" volume for node %(node)s\") %"},{"line_number":91,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":92,"context_line":"                    LOG.error(msg)"},{"line_number":93,"context_line":"                    raise exception.InvalidParameterValue(msg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":96,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_3f6c81cf","line":93,"updated":"2017-01-17 16:53:01.000000000","message":"nit: why not use _fail_validate call here?","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                             \" volume for node %(node)s\") %"},{"line_number":91,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":92,"context_line":"                    LOG.error(msg)"},{"line_number":93,"context_line":"                    raise exception.InvalidParameterValue(msg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":96,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_8d661428","line":93,"in_reply_to":"7a3c09a3_3f6c81cf","updated":"2017-01-23 21:59:51.000000000","message":"no reason :)  Fixing.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            # likely need to match the driver_volume_type field to"},{"line_number":137,"context_line":"            # our generic volume_type field. NB The LVM driver appears"},{"line_number":138,"context_line":"            # to not use that convention in cinder, as it is freeform."},{"line_number":139,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":140,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_5f714da7","line":139,"updated":"2017-01-17 16:53:01.000000000","message":"I\u0027m still confused, sorry. volume_type is a string(64). does it look like e.g. \"fibre_channel,iscsu\"? If so, I suggest we split it before using \"in\" operator. Otherwise we should probably still use \"\u003d\". WDYT?","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            # likely need to match the driver_volume_type field to"},{"line_number":137,"context_line":"            # our generic volume_type field. NB The LVM driver appears"},{"line_number":138,"context_line":"            # to not use that convention in cinder, as it is freeform."},{"line_number":139,"context_line":"            if \u0027fibre_channel\u0027 in volume.volume_type:"},{"line_number":140,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_8d1b7480","line":139,"in_reply_to":"7a3c09a3_5f714da7","updated":"2017-01-23 21:59:51.000000000","message":"I like using in since the substring matching behavior, but I\u0027ll change it to \u003d\u003d since volume connection defines specific example types based upon the types offered by cinder.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        found_types \u003d self._validate_connectors(task)"},{"line_number":199,"context_line":"        node \u003d task.node"},{"line_number":200,"context_line":"        iscsi_boot \u003d utils.get_node_capability(node, \u0027iscsi_boot\u0027)"},{"line_number":201,"context_line":"        fc_boot \u003d utils.get_node_capability(node, \u0027fibre_channel_boot\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":204,"context_line":"        # such that we raise errors for missing connectors if the"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_7f6a89b4","line":201,"updated":"2017-01-17 16:53:01.000000000","message":"get_node_capability returns a string, not boolean. so if you do \"if fc_boot\", it will pass even if fc_boot equals string \"false\". it may be surprising, so I wonder if we want to convert it to boolean first.\n\nalso I remeber on the summit Deva was objecting to changing behavior based on capabilities. I don\u0027t quite remember how it ended up though.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        found_types \u003d self._validate_connectors(task)"},{"line_number":199,"context_line":"        node \u003d task.node"},{"line_number":200,"context_line":"        iscsi_boot \u003d utils.get_node_capability(node, \u0027iscsi_boot\u0027)"},{"line_number":201,"context_line":"        fc_boot \u003d utils.get_node_capability(node, \u0027fibre_channel_boot\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":204,"context_line":"        # such that we raise errors for missing connectors if the"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_481a5a18","line":201,"in_reply_to":"7a3c09a3_7f6a89b4","updated":"2017-01-23 21:59:51.000000000","message":"Good catch!\n\nI spoke with deva at the summit regarding capability changes on use of it for determining driver behavior based on known capabilities of the hardware.  His desire was to change user driven behavior of the driver by not using capabilities since largely our uses should be from instance_info/capabilities to govern driver behavior since things were selected by user.  The difference here being more of a \"Is this hardware actually capable of the configuration we have.  What added to this is that he found some cases where things were creating new properties/capabilities entries based upon other settings after the fact which could lead to operator confusion.\n\nAs for the behavior changes, I doubt some of those behavior changes will ever land in the v1 api.  Some of the examples proposed in the spec are actually breaking to stand-alone usage since the driver can write a field in instance_info, but so can an API client.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":253,"context_line":"                        LOG.error(_LE(\"Error aborting volume detach for node \""},{"line_number":254,"context_line":"                                      \"%(node)s: %(err)s.\"),"},{"line_number":255,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":258,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_9f6735e8","line":255,"updated":"2017-01-17 16:53:01.000000000","message":"let\u0027s split this internal \"try\" block into a separate function, it seems to be used at least twice here and is overly nested","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":253,"context_line":"                        LOG.error(_LE(\"Error aborting volume detach for node \""},{"line_number":254,"context_line":"                                      \"%(node)s: %(err)s.\"),"},{"line_number":255,"context_line":"                                  {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":258,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_484edac1","line":255,"in_reply_to":"7a3c09a3_9f6735e8","updated":"2017-01-23 21:59:51.000000000","message":"Agreed, I\u0027ll do it in the next revision since there are some answers to questions that will likely result in changes.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":258,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":259,"context_line":"                          \"does not match the number attached volumes. \""},{"line_number":260,"context_line":"                          \"Attempting detach and aborting operation.\"),"},{"line_number":261,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_bf6071d0","line":259,"updated":"2017-01-17 16:53:01.000000000","message":"do you think we can report mismatching UUIDs?","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":258,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":259,"context_line":"                          \"does not match the number attached volumes. \""},{"line_number":260,"context_line":"                          \"Attempting detach and aborting operation.\"),"},{"line_number":261,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_689ab66f","line":259,"in_reply_to":"7a3c09a3_bf6071d0","updated":"2017-01-23 21:59:51.000000000","message":"I _guess_ we could with a list comprehension.  Do you see value in having that in logs?  I kind of worry it would be noise that would complicate the indexes of anything recording the logs.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                    LOG.error(_(\"Error aborting volume detach for node \""},{"line_number":268,"context_line":"                                \"%(node)s: %(err)s.\"),"},{"line_number":269,"context_line":"                              {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        for target in task.volume_targets:"},{"line_number":272,"context_line":"            for volume in connected:"},{"line_number":273,"context_line":"                # TODO(TheJulia): At some point the target should likely be"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_df5d3d16","line":270,"updated":"2017-01-17 16:53:01.000000000","message":"I think you need to raise something at this point, otherwise we continue even after failing the condition on line 257.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                    LOG.error(_(\"Error aborting volume detach for node \""},{"line_number":268,"context_line":"                                \"%(node)s: %(err)s.\"),"},{"line_number":269,"context_line":"                              {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        for target in task.volume_targets:"},{"line_number":272,"context_line":"            for volume in connected:"},{"line_number":273,"context_line":"                # TODO(TheJulia): At some point the target should likely be"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_e885c6ce","line":270,"in_reply_to":"7a3c09a3_df5d3d16","updated":"2017-01-23 21:59:51.000000000","message":"Good catch.","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"da5268b430a391987c5418ff9360da5672d47d10","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        except exception.StorageError as e:"},{"line_number":307,"context_line":"            LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":308,"context_line":"                          \"%(err)s. Re-attempting detachment. \""},{"line_number":309,"context_line":"                          \"ACTIVE nodes will be permitted to fail.\"),"},{"line_number":310,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":311,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":312,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a3c09a3_ff9cb9c1","line":309,"updated":"2017-01-17 16:53:01.000000000","message":"I\u0027d just have 2 different log messages on 2 branches. \"ACTIVE nodes will be permitted to fail\" sounds overly scary to me :)","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0f6ccb918c77d83e67e1fb2c86f47b9f0a59219","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        except exception.StorageError as e:"},{"line_number":307,"context_line":"            LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":308,"context_line":"                          \"%(err)s. Re-attempting detachment. \""},{"line_number":309,"context_line":"                          \"ACTIVE nodes will be permitted to fail.\"),"},{"line_number":310,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":311,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":312,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a3905b3_2876eed6","line":309,"in_reply_to":"7a3c09a3_ff9cb9c1","updated":"2017-01-23 21:59:51.000000000","message":"So if I\u0027m powering off, it makes sense to permit active nodes to fail, since what if cinder and/or the entire storage fabric is down.  From an operator perspective, it is best to take the machines down since they can\u0027t talk to the storage anyhow.\n\nIs your thought to break the note about active nodes out completely as a separate line? (Checking to make sure)","commit_id":"98c8ec61d29eb345972563b243f9e251913b830a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"67ab8667a27893cb8307d9e437ef32d5c53b4db1","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                          {\u0027node\u0027: node.uuid,"},{"line_number":250,"context_line":"                           \u0027err\u0027: e})"},{"line_number":251,"context_line":"                # TODO(TheJulia) Break the try block for detachments"},{"line_number":252,"context_line":"                # into it\u0027s own method since we\u0027re similar logic a"},{"line_number":253,"context_line":"                # few times."},{"line_number":254,"context_line":"                try:"},{"line_number":255,"context_line":"                    cinder.detach_volumes(task, targets, connector)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa31d9ce_74f1f800","line":252,"updated":"2017-02-13 22:43:09.000000000","message":"done","commit_id":"c0ba371f1a45b62470eaa63991a0c57b7d81436f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"67ab8667a27893cb8307d9e437ef32d5c53b4db1","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        try:"},{"line_number":316,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":317,"context_line":"        except exception.StorageError as e:"},{"line_number":318,"context_line":"            # TODO(TheJulia): Break logging here into seprate lines for"},{"line_number":319,"context_line":"            # the failure case of active nodes, based upon review feedback."},{"line_number":320,"context_line":"            LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":321,"context_line":"                          \"%(err)s. Re-attempting detachment. \""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa31d9ce_809c6a5e","line":318,"updated":"2017-02-13 22:43:09.000000000","message":"done.","commit_id":"c0ba371f1a45b62470eaa63991a0c57b7d81436f"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"3df0967cefe47d2c7baf33c272f680b1394e3ab7","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":53,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for \""},{"line_number":54,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":55,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":56,"context_line":"        LOG.error(msg)"},{"line_number":57,"context_line":"        raise exception.InvalidParameterValue(msg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_aab464d4","line":54,"range":{"start_line":54,"start_character":26,"end_line":54,"end_character":27},"updated":"2017-02-16 12:56:52.000000000","message":"Can we rephrase the message, adding \"due to %(reason)s\"?","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"23249a719381a32bec35cfb5ee945d7b5350f69f","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":53,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for \""},{"line_number":54,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":55,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":56,"context_line":"        LOG.error(msg)"},{"line_number":57,"context_line":"        raise exception.InvalidParameterValue(msg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_db07ac7f","line":54,"range":{"start_line":54,"start_character":26,"end_line":54,"end_character":27},"in_reply_to":"fa31d9ce_aab464d4","updated":"2017-02-16 13:38:07.000000000","message":"I feel like the code represents how these sorts of messages are generated in ironic given that we\u0027re assembling error upon error into a sentence.","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"3df0967cefe47d2c7baf33c272f680b1394e3ab7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                if not ipxe_enabled:"},{"line_number":89,"context_line":"                    msg \u003d (_(\"The [pxe]ipxe_enabled option must be set to \""},{"line_number":90,"context_line":"                             \"True to support network booting to an iSCSI \""},{"line_number":91,"context_line":"                             \" volume for node %(node)s\") %"},{"line_number":92,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":93,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_8aeec0b2","line":91,"range":{"start_line":91,"start_character":30,"end_line":91,"end_character":31},"updated":"2017-02-16 12:56:52.000000000","message":"nit: remove extra space","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"3df0967cefe47d2c7baf33c272f680b1394e3ab7","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":271,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":272,"context_line":"                          \"does not match the number attached volumes. \""},{"line_number":273,"context_line":"                          \"Attempting detach and aborting operation.\"),"},{"line_number":274,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":275,"context_line":"            self._abort_attach_volume_detach(task, connector)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_a53015ea","line":272,"updated":"2017-02-16 12:56:52.000000000","message":"\u0027of\u0027 is missing","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"3df0967cefe47d2c7baf33c272f680b1394e3ab7","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        \"\"\""},{"line_number":380,"context_line":"        data \u003d {}"},{"line_number":381,"context_line":"        valid \u003d False"},{"line_number":382,"context_line":"        for connector in task.volume_connectors:"},{"line_number":383,"context_line":"            if \u0027iqn\u0027 in connector.type and \u0027initiator\u0027 not in data:"},{"line_number":384,"context_line":"                data[\u0027initiator\u0027] \u003d connector.connector_id"},{"line_number":385,"context_line":"                valid \u003d True"},{"line_number":386,"context_line":"                continue"},{"line_number":387,"context_line":"            if \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":388,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":389,"context_line":"                valid \u003d True"},{"line_number":390,"context_line":"                continue"},{"line_number":391,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":392,"context_line":"            if \u0027wwpn\u0027 in connector.type:"},{"line_number":393,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":394,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":395,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":396,"context_line":"                valid \u003d True"},{"line_number":397,"context_line":"                continue"},{"line_number":398,"context_line":"            if \u0027wwnn\u0027 in connector.type:"},{"line_number":399,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":400,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":401,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":402,"context_line":"                valid \u003d True"},{"line_number":403,"context_line":"                continue"},{"line_number":404,"context_line":"            LOG.warning(_LW(\u0027Node %(node)s has a volume_connector \u0027"},{"line_number":405,"context_line":"                            \u0027(%(uuid)s) defined with an unsupported type: \u0027"},{"line_number":406,"context_line":"                            \u0027%(type)s.\u0027),"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_c5db4920","line":403,"range":{"start_line":382,"start_character":8,"end_line":403,"end_character":24},"updated":"2017-02-16 12:56:52.000000000","message":"I think we can refactor the code as below:\n\u003ccode\u003e\nfields \u003d [\u0027iqn\u0027, \u0027ip\u0027, ..., \u0027wwnns\u0027]\nfor connector in task.volume_connectors:\n    for field in fields:\n        if field in connector.type:\n            if field not in data:\n                ....\n\u003c/code\u003e\n\nWDYT?","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"23249a719381a32bec35cfb5ee945d7b5350f69f","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        \"\"\""},{"line_number":380,"context_line":"        data \u003d {}"},{"line_number":381,"context_line":"        valid \u003d False"},{"line_number":382,"context_line":"        for connector in task.volume_connectors:"},{"line_number":383,"context_line":"            if \u0027iqn\u0027 in connector.type and \u0027initiator\u0027 not in data:"},{"line_number":384,"context_line":"                data[\u0027initiator\u0027] \u003d connector.connector_id"},{"line_number":385,"context_line":"                valid \u003d True"},{"line_number":386,"context_line":"                continue"},{"line_number":387,"context_line":"            if \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":388,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":389,"context_line":"                valid \u003d True"},{"line_number":390,"context_line":"                continue"},{"line_number":391,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":392,"context_line":"            if \u0027wwpn\u0027 in connector.type:"},{"line_number":393,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":394,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":395,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":396,"context_line":"                valid \u003d True"},{"line_number":397,"context_line":"                continue"},{"line_number":398,"context_line":"            if \u0027wwnn\u0027 in connector.type:"},{"line_number":399,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":400,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":401,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":402,"context_line":"                valid \u003d True"},{"line_number":403,"context_line":"                continue"},{"line_number":404,"context_line":"            LOG.warning(_LW(\u0027Node %(node)s has a volume_connector \u0027"},{"line_number":405,"context_line":"                            \u0027(%(uuid)s) defined with an unsupported type: \u0027"},{"line_number":406,"context_line":"                            \u0027%(type)s.\u0027),"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa31d9ce_9ba9b47e","line":403,"range":{"start_line":382,"start_character":8,"end_line":403,"end_character":24},"in_reply_to":"fa31d9ce_c5db4920","updated":"2017-02-16 13:38:07.000000000","message":"The iSCSI checks are a little different from the FC checks, and I feel like the way it is laid out presently reads a bit more clearly as to what were doing.","commit_id":"895496a34990c18a22e96c20497f15c820492f40"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        Enumerates through all connector objects, and identifies if"},{"line_number":63,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"},{"line_number":64,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":65,"context_line":"        is not enabled."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param task: The task object"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_2a99406f","line":64,"updated":"2017-02-20 10:09:51.000000000","message":"It does not raise StorageError, but only InvalidParameterValue @ L93","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        Enumerates through all connector objects, and identifies if"},{"line_number":63,"context_line":"        iSCSI or FibreChannel connectors are present. This helper will"},{"line_number":64,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":65,"context_line":"        is not enabled."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param task: The task object"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_7b0083ab","line":64,"in_reply_to":"da36d5c6_2a99406f","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":82,"context_line":"                    connector.connector_id is not None):"},{"line_number":83,"context_line":"                if iscsi_found:"},{"line_number":84,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":85,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":86,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":87,"context_line":"                iscsi_found \u003d True"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_ea73a8b2","line":84,"updated":"2017-02-20 10:09:51.000000000","message":"should this message be of level \u0027info\u0027 or \u0027warning\u0027 so that the operator gets aware of it?","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":82,"context_line":"                    connector.connector_id is not None):"},{"line_number":83,"context_line":"                if iscsi_found:"},{"line_number":84,"context_line":"                    LOG.debug(\"Detected multiple iscsi connector iqn records \""},{"line_number":85,"context_line":"                              \"for node %(node)s. Only one will be used.\","},{"line_number":86,"context_line":"                              {\u0027node\u0027: node.uuid})"},{"line_number":87,"context_line":"                iscsi_found \u003d True"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_1b206f49","line":84,"in_reply_to":"da36d5c6_ea73a8b2","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                if not ipxe_enabled:"},{"line_number":89,"context_line":"                    msg \u003d (_(\"The [pxe]ipxe_enabled option must be set to \""},{"line_number":90,"context_line":"                             \"True to support network booting to an iSCSI \""},{"line_number":91,"context_line":"                             \"volume for node %(node)s\") %"},{"line_number":92,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":93,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_eae80819","line":91,"updated":"2017-02-20 10:09:51.000000000","message":"Node uuid is not required as method _fail_validation() adds node information to the message being logged.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                if not ipxe_enabled:"},{"line_number":89,"context_line":"                    msg \u003d (_(\"The [pxe]ipxe_enabled option must be set to \""},{"line_number":90,"context_line":"                             \"True to support network booting to an iSCSI \""},{"line_number":91,"context_line":"                             \"volume for node %(node)s\") %"},{"line_number":92,"context_line":"                           {\u0027node\u0027: node.uuid})"},{"line_number":93,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_bbcbdb1d","line":91,"in_reply_to":"da36d5c6_eae80819","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                           are available."},{"line_number":117,"context_line":"        :param fc_boot: Boolean value indicating if FibreChanel boot"},{"line_number":118,"context_line":"                        operations are available."},{"line_number":119,"context_line":"        :raises: StorageError"},{"line_number":120,"context_line":"        \"\"\""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_8aa06c92","line":119,"updated":"2017-02-20 10:09:51.000000000","message":"It does not raise StorageError. It only raises  InvalidParameterValue","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                           are available."},{"line_number":117,"context_line":"        :param fc_boot: Boolean value indicating if FibreChanel boot"},{"line_number":118,"context_line":"                        operations are available."},{"line_number":119,"context_line":"        :raises: StorageError"},{"line_number":120,"context_line":"        \"\"\""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        node \u003d task.node"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_7b55e31b","line":119,"in_reply_to":"da36d5c6_8aa06c92","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            if volume.volume_type \u003d\u003d \u0027fibre_channel\u0027:"},{"line_number":140,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":143,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":144,"context_line":"                             \"node %(node)s.\") %"},{"line_number":145,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_0ad8fc52","line":142,"updated":"2017-02-20 10:09:51.000000000","message":"s/ fibre_channel / \u0027fibre_channel\u0027/","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            if volume.volume_type \u003d\u003d \u0027fibre_channel\u0027:"},{"line_number":140,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":143,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":144,"context_line":"                             \"node %(node)s.\") %"},{"line_number":145,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_fb163354","line":142,"in_reply_to":"da36d5c6_0ad8fc52","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":143,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":144,"context_line":"                             \"node %(node)s.\") %"},{"line_number":145,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":146,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":147,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_aae7f03e","line":144,"updated":"2017-02-20 10:09:51.000000000","message":"Node uuid  is not required as method _fail_validation() adds node information to the message being logged.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":142,"context_line":"                             \"configured for fibre_channel, however the \""},{"line_number":143,"context_line":"                             \"capability fibre_channel_boot is not set on \""},{"line_number":144,"context_line":"                             \"node %(node)s.\") %"},{"line_number":145,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":146,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":147,"context_line":"                if not found_types[\u0027fc_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_5b066721","line":144,"in_reply_to":"da36d5c6_aae7f03e","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":147,"context_line":"                if not found_types[\u0027fc_found\u0027]:"},{"line_number":148,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":149,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":150,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":151,"context_line":"                             \"the node %(node)s volume connectors.\") %"},{"line_number":152,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_aa1a9015","line":149,"updated":"2017-02-20 10:09:51.000000000","message":"s/ fibre_channel / \u0027fibre_channel\u0027/","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":147,"context_line":"                if not found_types[\u0027fc_found\u0027]:"},{"line_number":148,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":149,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":150,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":151,"context_line":"                             \"the node %(node)s volume connectors.\") %"},{"line_number":152,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_8d48a25d","line":149,"in_reply_to":"da36d5c6_aa1a9015","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":149,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":150,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":151,"context_line":"                             \"the node %(node)s volume connectors.\") %"},{"line_number":152,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":153,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_ea3648b3","line":151,"updated":"2017-02-20 10:09:51.000000000","message":"ditto","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":149,"context_line":"                             \"configured for fibre_channel, however no \""},{"line_number":150,"context_line":"                             \"fibre channel WWPNs are configured for \""},{"line_number":151,"context_line":"                             \"the node %(node)s volume connectors.\") %"},{"line_number":152,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":153,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_cda53ab6","line":151,"in_reply_to":"da36d5c6_ea3648b3","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            elif volume.volume_type \u003d\u003d \u0027iscsi\u0027:"},{"line_number":156,"context_line":"                if not iscsi_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_0abf1cd1","line":158,"updated":"2017-02-20 10:09:51.000000000","message":"s/ iscsi/ \u0027iscsi\u0027/","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            elif volume.volume_type \u003d\u003d \u0027iscsi\u0027:"},{"line_number":156,"context_line":"                if not iscsi_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_8d9c226b","line":158,"in_reply_to":"da36d5c6_0abf1cd1","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                if not iscsi_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_6aced884","line":159,"updated":"2017-02-20 10:09:51.000000000","message":"s/ iscsi_boot/ \u0027iscsi_boot\u0027","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                if not iscsi_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_cd8c5a38","line":159,"in_reply_to":"da36d5c6_6aced884","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":163,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_4a14b4f4","line":160,"updated":"2017-02-20 10:09:51.000000000","message":"ditto","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":158,"context_line":"                             \"configured for iscsi, however the \""},{"line_number":159,"context_line":"                             \"capability iscsi_boot is not set for \""},{"line_number":160,"context_line":"                             \"node %(node)s.\") %"},{"line_number":161,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":163,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_4d794a2f","line":160,"in_reply_to":"da36d5c6_4a14b4f4","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":163,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"},{"line_number":164,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":165,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":166,"context_line":"                             \"iscsi connectors are configured for \""},{"line_number":167,"context_line":"                             \"node %(node)s.\") %"},{"line_number":168,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_aac8d075","line":165,"updated":"2017-02-20 10:09:51.000000000","message":"s/ iscsi/ \u0027iscsi\u0027","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":163,"context_line":"                if not found_types[\u0027iscsi_found\u0027]:"},{"line_number":164,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":165,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":166,"context_line":"                             \"iscsi connectors are configured for \""},{"line_number":167,"context_line":"                             \"node %(node)s.\") %"},{"line_number":168,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_6dad2688","line":165,"in_reply_to":"da36d5c6_aac8d075","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":165,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":166,"context_line":"                             \"iscsi connectors are configured for \""},{"line_number":167,"context_line":"                             \"node %(node)s.\") %"},{"line_number":168,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":169,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":170,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_ca00a4ad","line":167,"updated":"2017-02-20 10:09:51.000000000","message":"ditto","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is \""},{"line_number":165,"context_line":"                             \"configured for iscsi, however no \""},{"line_number":166,"context_line":"                             \"iscsi connectors are configured for \""},{"line_number":167,"context_line":"                             \"node %(node)s.\") %"},{"line_number":168,"context_line":"                           {\u0027id\u0027: volume.uuid, \u0027node\u0027: node.uuid})"},{"line_number":169,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":170,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_cdba9ac0","line":167,"in_reply_to":"da36d5c6_ca00a4ad","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            else:"},{"line_number":171,"context_line":"                # NOTE(TheJulia); The note below needs to be updated"},{"line_number":172,"context_line":"                # whenever support for additional volume types are added."},{"line_number":173,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":174,"context_line":"                         \"\u0027%(type)s\u0027. Supported types: \u0027iscsi\u0027 or \""},{"line_number":175,"context_line":"                         \"\u0027fibre_channel\u0027\") %"},{"line_number":176,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_6a95f83e","line":173,"updated":"2017-02-20 10:09:51.000000000","message":"s/ %(id)s / \u0027%(id)s\u0027 /","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ac388e88fd6cde36ef37a199817bffccfba1c0c6","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            else:"},{"line_number":171,"context_line":"                # NOTE(TheJulia); The note below needs to be updated"},{"line_number":172,"context_line":"                # whenever support for additional volume types are added."},{"line_number":173,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":174,"context_line":"                         \"\u0027%(type)s\u0027. Supported types: \u0027iscsi\u0027 or \""},{"line_number":175,"context_line":"                         \"\u0027fibre_channel\u0027\") %"},{"line_number":176,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_4550e45d","line":173,"in_reply_to":"7a25e98e_6d49a6d0","updated":"2017-03-16 15:09:46.000000000","message":"Seems un-necessary, to be honest, since we\u0027re not quoting things like uuid..","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            else:"},{"line_number":171,"context_line":"                # NOTE(TheJulia); The note below needs to be updated"},{"line_number":172,"context_line":"                # whenever support for additional volume types are added."},{"line_number":173,"context_line":"                msg \u003d (_(\"Volume target %(id)s is of an unknown type \""},{"line_number":174,"context_line":"                         \"\u0027%(type)s\u0027. Supported types: \u0027iscsi\u0027 or \""},{"line_number":175,"context_line":"                         \"\u0027fibre_channel\u0027\") %"},{"line_number":176,"context_line":"                       {\u0027id\u0027: volume.uuid, \u0027type\u0027: volume.volume_type})"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_6d49a6d0","line":173,"in_reply_to":"da36d5c6_6a95f83e","updated":"2017-03-14 20:38:23.000000000","message":"Are you sure? This does not seem a common way of  how IDs are logged?","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":209,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":210,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capability for \""},{"line_number":211,"context_line":"                     \"node %(id)s, an associated volume_connector type \""},{"line_number":212,"context_line":"                     \"must be valid for iSCSI (%(options)s).\") %"},{"line_number":213,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"},{"line_number":214,"context_line":"            self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_4aecb4c7","line":211,"updated":"2017-02-20 10:09:51.000000000","message":"Node uuid is not required in the message as its filled by _fail_validation()","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":209,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":210,"context_line":"            msg \u003d (_(\"In order to enable the iscsi_boot capability for \""},{"line_number":211,"context_line":"                     \"node %(id)s, an associated volume_connector type \""},{"line_number":212,"context_line":"                     \"must be valid for iSCSI (%(options)s).\") %"},{"line_number":213,"context_line":"                   {\u0027id\u0027: node.uuid, \u0027options\u0027: valid_types})"},{"line_number":214,"context_line":"            self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_4dff8a34","line":211,"in_reply_to":"da36d5c6_4aecb4c7","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8758e6652ed3f616cd716eda372911233987c036","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        targets \u003d task.volume_targets"},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":238,"context_line":"        except exception.StorageError as e:"},{"line_number":239,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":240,"context_line":"                LOG.error(_LE(\"Error aborting volume detach for node \""}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_9848e18c","line":237,"range":{"start_line":237,"start_character":40,"end_line":237,"end_character":47},"updated":"2017-02-27 16:49:06.000000000","message":"We need to pass a list of volume_id of targets.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        targets \u003d task.volume_targets"},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":238,"context_line":"        except exception.StorageError as e:"},{"line_number":239,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":240,"context_line":"                LOG.error(_LE(\"Error aborting volume detach for node \""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_302545c2","line":237,"range":{"start_line":237,"start_character":40,"end_line":237,"end_character":47},"in_reply_to":"da36d5c6_9848e18c","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"b736553532d28b882274e3a03d9feba6e407999b","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        try:"},{"line_number":261,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":262,"context_line":"        except exception.StorageError as e:"},{"line_number":263,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":264,"context_line":"                LOG.error(_LE(\"Error attaching volumes for node %(node)s: \""}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_6eb427f2","line":261,"range":{"start_line":261,"start_character":52,"end_line":261,"end_character":59},"updated":"2017-02-20 15:27:36.000000000","message":"We need to pass a list of volume_id of targets.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        try:"},{"line_number":261,"context_line":"            connected \u003d cinder.attach_volumes(task, targets, connector)"},{"line_number":262,"context_line":"        except exception.StorageError as e:"},{"line_number":263,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":264,"context_line":"                LOG.error(_LE(\"Error attaching volumes for node %(node)s: \""}],"source_content_type":"text/x-python","patch_set":25,"id":"7a25e98e_5022c1ba","line":261,"range":{"start_line":261,"start_character":52,"end_line":261,"end_character":59},"in_reply_to":"da36d5c6_6eb427f2","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"b736553532d28b882274e3a03d9feba6e407999b","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                           \u0027err\u0027: e})"},{"line_number":268,"context_line":"                self._abort_attach_volume_detach(task, connector)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":271,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":272,"context_line":"                          \"does not match the number of attached volumes. \""},{"line_number":273,"context_line":"                          \"Attempting detach and aborting operation.\"),"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_9a40b558","line":270,"updated":"2017-02-20 15:27:36.000000000","message":"Volume connector and target API is designed for the case Nova calls Cinder to attach a volume to a node before asking Ironic to spawn the node[1]. In this case, the volume is already attached. It causes an error here.\n\nWe need to consider this case.\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/volume-connection-information.html#problem-description","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                           \u0027err\u0027: e})"},{"line_number":268,"context_line":"                self._abort_attach_volume_detach(task, connector)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":271,"context_line":"            LOG.error(_LE(\"The number of volumes defined for node %(node)s \""},{"line_number":272,"context_line":"                          \"does not match the number of attached volumes. \""},{"line_number":273,"context_line":"                          \"Attempting detach and aborting operation.\"),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_90a7d14e","line":270,"in_reply_to":"da36d5c6_9a40b558","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"b736553532d28b882274e3a03d9feba6e407999b","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        try:"},{"line_number":317,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":318,"context_line":"        except exception.StorageError as e:"},{"line_number":319,"context_line":"            # TODO(TheJulia): Break logging here into seprate lines for"},{"line_number":320,"context_line":"            # the failure case of active nodes, based upon review feedback."}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_cecb5371","line":317,"range":{"start_line":317,"start_character":40,"end_line":317,"end_character":47},"updated":"2017-02-20 15:27:36.000000000","message":"We need to pass a list of volume_id of targets.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        connector \u003d self._generate_connector(task)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        try:"},{"line_number":317,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":318,"context_line":"        except exception.StorageError as e:"},{"line_number":319,"context_line":"            # TODO(TheJulia): Break logging here into seprate lines for"},{"line_number":320,"context_line":"            # the failure case of active nodes, based upon review feedback."}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_5009d930","line":317,"range":{"start_line":317,"start_character":40,"end_line":317,"end_character":47},"in_reply_to":"da36d5c6_cecb5371","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"0679bb61cce871c8ef40066efdd7b1e1748eb76d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            # the failure case of active nodes, based upon review feedback."},{"line_number":321,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":322,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":323,"context_line":"                # tollerate failures detaching as the node is likely being"},{"line_number":324,"context_line":"                # powered down to cause a detachment event."},{"line_number":325,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":326,"context_line":"                              \"%(err)s. Gracefully retrying detachment as \""}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_2a5a2084","line":323,"updated":"2017-02-20 10:09:51.000000000","message":"nit: s/ tollerate/ tolerate/","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            # the failure case of active nodes, based upon review feedback."},{"line_number":321,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":322,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":323,"context_line":"                # tollerate failures detaching as the node is likely being"},{"line_number":324,"context_line":"                # powered down to cause a detachment event."},{"line_number":325,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":326,"context_line":"                              \"%(err)s. Gracefully retrying detachment as \""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_7006d521","line":323,"in_reply_to":"da36d5c6_2a5a2084","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8758e6652ed3f616cd716eda372911233987c036","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                              \"attachments.\"),"},{"line_number":329,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":330,"context_line":"                cinder.detach_volumes("},{"line_number":331,"context_line":"                    task, targets, connector, allow_errors\u003dTrue)"},{"line_number":332,"context_line":"            else:"},{"line_number":333,"context_line":"                # NOTE(TheJulia): In the event that the node is not in"},{"line_number":334,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_f8b9dd7a","line":331,"range":{"start_line":331,"start_character":26,"end_line":331,"end_character":33},"updated":"2017-02-27 16:49:06.000000000","message":"A list of volume_id of targets is required.","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                              \"attachments.\"),"},{"line_number":329,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":330,"context_line":"                cinder.detach_volumes("},{"line_number":331,"context_line":"                    task, targets, connector, allow_errors\u003dTrue)"},{"line_number":332,"context_line":"            else:"},{"line_number":333,"context_line":"                # NOTE(TheJulia): In the event that the node is not in"},{"line_number":334,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_9003510f","line":331,"range":{"start_line":331,"start_character":26,"end_line":331,"end_character":33},"in_reply_to":"da36d5c6_f8b9dd7a","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"8758e6652ed3f616cd716eda372911233987c036","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":337,"context_line":"                              \"%(err)s. Re-attempting detachment.\"),"},{"line_number":338,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":339,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def should_write_image(self, task):"},{"line_number":342,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_38ac5535","line":339,"range":{"start_line":339,"start_character":44,"end_line":339,"end_character":51},"updated":"2017-02-27 16:49:06.000000000","message":"ditto","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"3342901469d57c47a10b01a897981fde7a8e39fe","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":337,"context_line":"                              \"%(err)s. Re-attempting detachment.\"),"},{"line_number":338,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":339,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    def should_write_image(self, task):"},{"line_number":342,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_d6fea204","line":339,"range":{"start_line":339,"start_character":44,"end_line":339,"end_character":51},"in_reply_to":"da36d5c6_38ac5535","updated":"2017-03-14 20:38:23.000000000","message":"Done","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"866a74701fba2ffacb47afaf0fdc9fbea72a151a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from ironic.common import cinder"},{"line_number":21,"context_line":"from ironic.common import exception"},{"line_number":22,"context_line":"from ironic.common import states"},{"line_number":23,"context_line":"from ironic.common.i18n import _LE, _LW"},{"line_number":24,"context_line":"from ironic.drivers import base"},{"line_number":25,"context_line":"from ironic.drivers import utils"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"5a22e58a_eba3c54d","line":23,"updated":"2017-03-14 08:49:53.000000000","message":"We also need to import _.","commit_id":"497157c4b95d1187ae61256f7af3b796d1b5c2c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8cc462c1f19e00fdf97b31ce02cf0847274967e1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":82,"context_line":"                    connector.connector_id is not None):"},{"line_number":83,"context_line":"                if iscsi_found:"},{"line_number":84,"context_line":"                    LOG.info(\"Detected multiple iSCSI connector IQN records \""},{"line_number":85,"context_line":"                             \"for node %(node)s. Only one will be used.\","},{"line_number":86,"context_line":"                             {\u0027node\u0027: node.uuid})"},{"line_number":87,"context_line":"                iscsi_found \u003d True"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_17f2cdd2","line":84,"updated":"2017-03-15 16:30:06.000000000","message":"Missing _LI translation. And this message will be logged n-1 times for n connectors.","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"acb1b029e31d0b5b0f19c99b5b91981a78f80dfb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":82,"context_line":"                    connector.connector_id is not None):"},{"line_number":83,"context_line":"                if iscsi_found:"},{"line_number":84,"context_line":"                    LOG.info(\"Detected multiple iSCSI connector IQN records \""},{"line_number":85,"context_line":"                             \"for node %(node)s. Only one will be used.\","},{"line_number":86,"context_line":"                             {\u0027node\u0027: node.uuid})"},{"line_number":87,"context_line":"                iscsi_found \u003d True"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_eb48ec2f","line":84,"in_reply_to":"3a1ff146_17f2cdd2","updated":"2017-03-15 18:04:41.000000000","message":"Done","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8cc462c1f19e00fdf97b31ce02cf0847274967e1","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def _abort_attach_volume_detach(self, task, connector):"},{"line_number":221,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        :param task: The Task object"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_77c141e4","line":220,"updated":"2017-03-15 16:30:06.000000000","message":"Maybe simple name _abort_attach_volume()?","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"acb1b029e31d0b5b0f19c99b5b91981a78f80dfb","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def _abort_attach_volume_detach(self, task, connector):"},{"line_number":221,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        :param task: The Task object"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_ab5d14eb","line":220,"in_reply_to":"3a1ff146_77c141e4","updated":"2017-03-15 18:04:41.000000000","message":"Done","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8cc462c1f19e00fdf97b31ce02cf0847274967e1","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                          \"Attempting detach and aborting operation.\"),"},{"line_number":266,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":267,"context_line":"            self._abort_attach_volume_detach(task, connector)"},{"line_number":268,"context_line":"            raise exception.StorageError(\"Mismatch between the number of \""},{"line_number":269,"context_line":"                                         \"configured volume targets for node \""},{"line_number":270,"context_line":"                                         \"%(uuid)s and the number of \""},{"line_number":271,"context_line":"                                         \"completed attachments.\" %"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_b772d9e3","line":268,"updated":"2017-03-15 16:30:06.000000000","message":"Missing translation with _().","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"acb1b029e31d0b5b0f19c99b5b91981a78f80dfb","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                          \"Attempting detach and aborting operation.\"),"},{"line_number":266,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":267,"context_line":"            self._abort_attach_volume_detach(task, connector)"},{"line_number":268,"context_line":"            raise exception.StorageError(\"Mismatch between the number of \""},{"line_number":269,"context_line":"                                         \"configured volume targets for node \""},{"line_number":270,"context_line":"                                         \"%(uuid)s and the number of \""},{"line_number":271,"context_line":"                                         \"completed attachments.\" %"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_2b0124af","line":268,"in_reply_to":"3a1ff146_b772d9e3","updated":"2017-03-15 18:04:41.000000000","message":"Done","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8cc462c1f19e00fdf97b31ce02cf0847274967e1","unresolved":false,"context_lines":[{"line_number":378,"context_line":"                data[\u0027initiator\u0027] \u003d connector.connector_id"},{"line_number":379,"context_line":"                valid \u003d True"},{"line_number":380,"context_line":"                continue"},{"line_number":381,"context_line":"            if \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":382,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":383,"context_line":"                valid \u003d True"},{"line_number":384,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_9a41840e","line":381,"updated":"2017-03-15 16:30:06.000000000","message":"Looks like you can use \"elif\" here and below w/o \"continue\".","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"acb1b029e31d0b5b0f19c99b5b91981a78f80dfb","unresolved":false,"context_lines":[{"line_number":378,"context_line":"                data[\u0027initiator\u0027] \u003d connector.connector_id"},{"line_number":379,"context_line":"                valid \u003d True"},{"line_number":380,"context_line":"                continue"},{"line_number":381,"context_line":"            if \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":382,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":383,"context_line":"                valid \u003d True"},{"line_number":384,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a1ff146_cbca504f","line":381,"in_reply_to":"3a1ff146_9a41840e","updated":"2017-03-15 18:04:41.000000000","message":"Done","commit_id":"ec160930599dc8919fe083b1737bb76f2dbfa725"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"78672b2be1f90554411fb61807684af9b5684bfa","unresolved":false,"context_lines":[{"line_number":35,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027, \u0027wwnn\u0027)"},{"line_number":36,"context_line":"# NOTE(TheJulia) Most Cinder drivers support/utilize WWPN, however"},{"line_number":37,"context_line":"# there are some references to WWNNs also being available, and as such"},{"line_number":38,"context_line":"# we should consider it valid for a driver to pass, although milage"},{"line_number":39,"context_line":"# will vary."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"1a1ced50_770098ab","line":38,"range":{"start_line":38,"start_character":61,"end_line":38,"end_character":67},"updated":"2017-03-16 17:40:14.000000000","message":"The word \u0027milage\u0027 doesn\u0027t make sense here","commit_id":"731205c46e31f72cb5948780c565627f8a6c9ec6"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"78672b2be1f90554411fb61807684af9b5684bfa","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            # to not use that convention in cinder, as it is freeform."},{"line_number":136,"context_line":"            if volume.volume_type \u003d\u003d \u0027fibre_channel\u0027:"},{"line_number":137,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":138,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is configured for\""},{"line_number":139,"context_line":"                             \"\u0027fibre_channel\u0027, however the capability\""},{"line_number":140,"context_line":"                             \"\u0027fibre_channel_boot\u0027 is not set on node.\") %"},{"line_number":141,"context_line":"                           {\u0027id\u0027: volume.uuid})"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a1ced50_6c7e0fb0","line":138,"range":{"start_line":138,"start_character":65,"end_line":138,"end_character":68},"updated":"2017-03-16 17:40:14.000000000","message":"Missing whitespace. \"s/for/for \"","commit_id":"731205c46e31f72cb5948780c565627f8a6c9ec6"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"78672b2be1f90554411fb61807684af9b5684bfa","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            if volume.volume_type \u003d\u003d \u0027fibre_channel\u0027:"},{"line_number":137,"context_line":"                if not fc_boot and volume.boot_index \u003d\u003d 0:"},{"line_number":138,"context_line":"                    msg \u003d (_(\"Volume target %(id)s is configured for\""},{"line_number":139,"context_line":"                             \"\u0027fibre_channel\u0027, however the capability\""},{"line_number":140,"context_line":"                             \"\u0027fibre_channel_boot\u0027 is not set on node.\") %"},{"line_number":141,"context_line":"                           {\u0027id\u0027: volume.uuid})"},{"line_number":142,"context_line":"                    self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a1ced50_6c036f10","line":139,"range":{"start_line":139,"start_character":59,"end_line":139,"end_character":69},"updated":"2017-03-16 17:40:14.000000000","message":"Missing whitespace. \"s/capability/capability \"","commit_id":"731205c46e31f72cb5948780c565627f8a6c9ec6"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"8f9c00318949f45bd27062a1f65e16663b4f4375","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP."},{"line_number":2,"context_line":"# Copyright 2016 IBM Corp"},{"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":33,"id":"1a1ced50_9d2453b3","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2017-03-23 17:01:06.000000000","message":"2017","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"8f9c00318949f45bd27062a1f65e16663b4f4375","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from ironic.common import cinder"},{"line_number":21,"context_line":"from ironic.common import exception"},{"line_number":22,"context_line":"from ironic.common import states"},{"line_number":23,"context_line":"from ironic.common.i18n import _, _LI, _LW, _LE"},{"line_number":24,"context_line":"from ironic.drivers import base"},{"line_number":25,"context_line":"from ironic.drivers import utils"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_7d3077e9","line":23,"range":{"start_line":23,"start_character":34,"end_line":23,"end_character":47},"updated":"2017-03-23 17:01:06.000000000","message":"Should we remove these log translations?","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from ironic.common import cinder"},{"line_number":21,"context_line":"from ironic.common import exception"},{"line_number":22,"context_line":"from ironic.common import states"},{"line_number":23,"context_line":"from ironic.common.i18n import _, _LI, _LW, _LE"},{"line_number":24,"context_line":"from ironic.drivers import base"},{"line_number":25,"context_line":"from ironic.drivers import utils"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_38e36d07","line":23,"range":{"start_line":23,"start_character":34,"end_line":23,"end_character":47},"in_reply_to":"1a1ced50_7d3077e9","updated":"2017-03-27 23:24:54.000000000","message":"Done","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3a18160c80e491ad13c6de8c83f5528accdd3901","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return {}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":52,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for \""},{"line_number":53,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":54,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":55,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_5a91aa51","line":52,"range":{"start_line":52,"start_character":65,"end_line":52,"end_character":66},"updated":"2017-03-20 14:03:30.000000000","message":"nit - for node %(node)s","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return {}"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":52,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for \""},{"line_number":53,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":54,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":55,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_f8b715f3","line":52,"range":{"start_line":52,"start_character":65,"end_line":52,"end_character":66},"in_reply_to":"1a1ced50_5a91aa51","updated":"2017-03-27 23:24:54.000000000","message":"Done","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"d8d83dca039a37accb511e6ba6ee251491fdee8e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                         \"for node %(node)s. Only one will be used.\"),"},{"line_number":97,"context_line":"                     {\u0027node\u0027: node.uuid})"},{"line_number":98,"context_line":"        return {"},{"line_number":99,"context_line":"            \u0027fc_found\u0027: fc_found,"},{"line_number":100,"context_line":"            \u0027iscsi_found\u0027: iscsi_found}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":103,"context_line":"        \"\"\"Validate target information helper."}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_27b7973a","line":100,"range":{"start_line":99,"start_character":12,"end_line":100,"end_character":39},"updated":"2017-03-18 13:57:20.000000000","message":"they are integer values, if return boolean as func doc, we need to convert.","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                         \"for node %(node)s. Only one will be used.\"),"},{"line_number":97,"context_line":"                     {\u0027node\u0027: node.uuid})"},{"line_number":98,"context_line":"        return {"},{"line_number":99,"context_line":"            \u0027fc_found\u0027: fc_found,"},{"line_number":100,"context_line":"            \u0027iscsi_found\u0027: iscsi_found}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _validate_targets(self, task, found_types, iscsi_boot, fc_boot):"},{"line_number":103,"context_line":"        \"\"\"Validate target information helper."}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d8a97992","line":100,"range":{"start_line":99,"start_character":12,"end_line":100,"end_character":39},"in_reply_to":"1a1ced50_27b7973a","updated":"2017-03-27 23:24:54.000000000","message":"Done","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3a18160c80e491ad13c6de8c83f5528accdd3901","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":227,"context_line":"        except exception.StorageError as e:"},{"line_number":228,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":229,"context_line":"                LOG.error(_LE(\"Error aborting volume detach for node \""},{"line_number":230,"context_line":"                              \"%(node)s: %(err)s.\"),"},{"line_number":231,"context_line":"                          {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_b5b631da","line":229,"range":{"start_line":229,"start_character":53,"end_line":229,"end_character":59},"updated":"2017-03-20 14:03:30.000000000","message":"attach?","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":227,"context_line":"        except exception.StorageError as e:"},{"line_number":228,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":229,"context_line":"                LOG.error(_LE(\"Error aborting volume detach for node \""},{"line_number":230,"context_line":"                              \"%(node)s: %(err)s.\"),"},{"line_number":231,"context_line":"                          {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_b8e03dce","line":229,"range":{"start_line":229,"start_character":53,"end_line":229,"end_character":59},"in_reply_to":"1a1ced50_b5b631da","updated":"2017-03-27 23:24:54.000000000","message":"Done","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3a18160c80e491ad13c6de8c83f5528accdd3901","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":311,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":312,"context_line":"                # tolerate failures detaching as the node is likely being"},{"line_number":313,"context_line":"                # powered down to cause a detachment event."},{"line_number":314,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":315,"context_line":"                              \"%(err)s. Gracefully retrying detachment as \""},{"line_number":316,"context_line":"                              \"ACTIVE nodes can be power cycled to re-apply \""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d002db08","line":313,"updated":"2017-03-20 14:03:30.000000000","message":"Do you mean it happens only for powered off nodes?","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2b59eed32dabb9682b5dc5310c20963fa6419420","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":311,"context_line":"                # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":312,"context_line":"                # tolerate failures detaching as the node is likely being"},{"line_number":313,"context_line":"                # powered down to cause a detachment event."},{"line_number":314,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":315,"context_line":"                              \"%(err)s. Gracefully retrying detachment as \""},{"line_number":316,"context_line":"                              \"ACTIVE nodes can be power cycled to re-apply \""}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_699b6173","line":313,"in_reply_to":"1a1ced50_d002db08","updated":"2017-03-23 15:58:28.000000000","message":"That is more a question for the wiring in patch.","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3a18160c80e491ad13c6de8c83f5528accdd3901","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":326,"context_line":"                              \"%(err)s. Re-attempting detachment.\"),"},{"line_number":327,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":328,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def should_write_image(self, task):"},{"line_number":331,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d0a49bba","line":328,"updated":"2017-03-20 14:03:30.000000000","message":"Why do we re-run it instead of just doing raise? If we really need this, maybe do a proper configurable retry here?","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dbec4df1ff6347bd8fd57e9fbccd6e012eefb0d9","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":326,"context_line":"                              \"%(err)s. Re-attempting detachment.\"),"},{"line_number":327,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":328,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def should_write_image(self, task):"},{"line_number":331,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":33,"id":"ffe62b97_eda060a8","line":328,"in_reply_to":"1a1ced50_d0a49bba","updated":"2017-03-24 10:12:01.000000000","message":"One of the ways to do this is http://paste.openstack.org/show/604022/","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                LOG.error(_LE(\"Error detaching volumes for node %(node)s: \""},{"line_number":326,"context_line":"                              \"%(err)s. Re-attempting detachment.\"),"},{"line_number":327,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":328,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def should_write_image(self, task):"},{"line_number":331,"context_line":"        \"\"\"Determines if deploy should perform the image write-out."}],"source_content_type":"text/x-python","patch_set":33,"id":"ffe62b97_ec347795","line":328,"in_reply_to":"ffe62b97_eda060a8","updated":"2017-03-27 23:24:54.000000000","message":"Done","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"3a18160c80e491ad13c6de8c83f5528accdd3901","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":388,"context_line":"                valid \u003d True"},{"line_number":389,"context_line":"            else:"},{"line_number":390,"context_line":"                LOG.warning(_LW(\u0027Node %(node)s has a volume_connector \u0027"},{"line_number":391,"context_line":"                                \u0027(%(uuid)s) defined with an unsupported type: \u0027"},{"line_number":392,"context_line":"                                \u0027%(type)s.\u0027),"},{"line_number":393,"context_line":"                            {\u0027node\u0027: task.node.uuid,"},{"line_number":394,"context_line":"                             \u0027uuid\u0027: connector.uuid,"},{"line_number":395,"context_line":"                             \u0027type\u0027: connector.type})"},{"line_number":396,"context_line":"        if not valid:"},{"line_number":397,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_FC_TYPES + VALID_ISCSI_TYPES)"},{"line_number":398,"context_line":"            msg \u003d (_(\u0027Insufficient or incompatible volume connection \u0027"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_b0955fe5","line":395,"range":{"start_line":390,"start_character":16,"end_line":395,"end_character":53},"updated":"2017-03-20 14:03:30.000000000","message":"What happens if all the connectors have \n\n \u0027iqn\u0027 in connector.type and \u0027initiator\u0027 in data\n\nor a similar condition for ip? This function fails?","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"bf60961d667098de81583480c85b1939555376d4","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":388,"context_line":"                valid \u003d True"},{"line_number":389,"context_line":"            else:"},{"line_number":390,"context_line":"                LOG.warning(_LW(\u0027Node %(node)s has a volume_connector \u0027"},{"line_number":391,"context_line":"                                \u0027(%(uuid)s) defined with an unsupported type: \u0027"},{"line_number":392,"context_line":"                                \u0027%(type)s.\u0027),"},{"line_number":393,"context_line":"                            {\u0027node\u0027: task.node.uuid,"},{"line_number":394,"context_line":"                             \u0027uuid\u0027: connector.uuid,"},{"line_number":395,"context_line":"                             \u0027type\u0027: connector.type})"},{"line_number":396,"context_line":"        if not valid:"},{"line_number":397,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_FC_TYPES + VALID_ISCSI_TYPES)"},{"line_number":398,"context_line":"            msg \u003d (_(\u0027Insufficient or incompatible volume connection \u0027"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_6c4a8a57","line":395,"range":{"start_line":390,"start_character":16,"end_line":395,"end_character":53},"in_reply_to":"1a1ced50_b0955fe5","updated":"2017-03-27 23:24:54.000000000","message":"yes. In such case valid is never set to True, so it remains False, and therefore hits lines 396-403 resulting in StorageError.","commit_id":"2e5a2cdda969aa1016a5b1145b194b0e5a9e7730"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4b12d8ba9a08e50f51618bc2e0d148988296de8b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":94,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":95,"context_line":"                fc_found +\u003d 1"},{"line_number":96,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":97,"context_line":"            LOG.info(\"Detected multiple iSCSI connector IQN records for node \""},{"line_number":98,"context_line":"                     \"%(node)s. Only one will be used.\", {\u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_82a116fb","line":96,"updated":"2017-03-28 14:40:18.000000000","message":"One connector has both ip and iqn. This case doesn\u0027t mean multiple iqn records.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"fd84053f06fc3ca3dce93963f6d0accb28cbf04d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":94,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":95,"context_line":"                fc_found +\u003d 1"},{"line_number":96,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":97,"context_line":"            LOG.info(\"Detected multiple iSCSI connector IQN records for node \""},{"line_number":98,"context_line":"                     \"%(node)s. Only one will be used.\", {\u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_e88515ae","line":96,"in_reply_to":"ffe62b97_5c428e10","updated":"2017-03-30 00:19:11.000000000","message":"I discussed this with Joanna and we think the current behavior is actually correct.  We could have multiple IP addresses and a single IQN.  It would be a valid configuration, but we could only use the first entries of either found due cinder\u0027s data model. (At least, as I remember it.)\n\nAlternatively, we don\u0027t necessarily need an IQN with iPXE, it has a default burned in, and ultimately the initiator\u0027s IQN usage would really depend on the back-end storage driver supporting cinder. (At least, as far as I remember, it doesn\u0027t validate this, it just passes the connector along to the driver, but I may be wrong or it has changed since I last looked at it.)\n\nPerhaps, the answer is to revise the log message to state \"Multiple possible configuration details found for iSCSI. Only the first available entries will be utilized.\"?   Alternatively, we could count IQN and IP addresses separately and log separately for each type?","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4b0f34df251344c0d986bc165a4e6c1397c97145","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":94,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":95,"context_line":"                fc_found +\u003d 1"},{"line_number":96,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":97,"context_line":"            LOG.info(\"Detected multiple iSCSI connector IQN records for node \""},{"line_number":98,"context_line":"                     \"%(node)s. Only one will be used.\", {\u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_5c428e10","line":96,"in_reply_to":"ffe62b97_82a116fb","updated":"2017-03-29 19:45:00.000000000","message":"I guess in that case they are one in the same.  I didn\u0027t think of it that way when I was writing the code.  Any thoughts on handling in terms of counting the number of possible connectors?","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"66d9c5471573516defdc39196506ae6cca1f7e14","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":94,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":95,"context_line":"                fc_found +\u003d 1"},{"line_number":96,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":97,"context_line":"            LOG.info(\"Detected multiple iSCSI connector IQN records for node \""},{"line_number":98,"context_line":"                     \"%(node)s. Only one will be used.\", {\u0027node\u0027: node.uuid})"},{"line_number":99,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":34,"id":"dfeb2761_8aa0afa7","line":96,"in_reply_to":"ffe62b97_e88515ae","updated":"2017-03-30 20:49:52.000000000","message":"I\u0027ll change to new proposed message.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4b12d8ba9a08e50f51618bc2e0d148988296de8b","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        try:"},{"line_number":225,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":226,"context_line":"        except exception.StorageError as e:"},{"line_number":227,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":228,"context_line":"                LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":229,"context_line":"                          \"aborting volume attach: %(err)s.\","},{"line_number":230,"context_line":"                          {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_68b5d37d","line":227,"range":{"start_line":227,"start_character":12,"end_line":227,"end_character":55},"updated":"2017-03-28 14:40:18.000000000","message":"I don\u0027t think it is necessary to raise an error in this method. Another error which causes to abort attaching is a root cause to be raised to a caller.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"66d9c5471573516defdc39196506ae6cca1f7e14","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        try:"},{"line_number":225,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":226,"context_line":"        except exception.StorageError as e:"},{"line_number":227,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":228,"context_line":"                LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":229,"context_line":"                          \"aborting volume attach: %(err)s.\","},{"line_number":230,"context_line":"                          {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_12f74d8d","line":227,"range":{"start_line":227,"start_character":12,"end_line":227,"end_character":55},"in_reply_to":"ffe62b97_1c952687","updated":"2017-03-30 20:49:52.000000000","message":"I think retrying with allow_errors\u003dTrue is the best idea for handling this exception.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4b0f34df251344c0d986bc165a4e6c1397c97145","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        try:"},{"line_number":225,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":226,"context_line":"        except exception.StorageError as e:"},{"line_number":227,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":228,"context_line":"                LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":229,"context_line":"                          \"aborting volume attach: %(err)s.\","},{"line_number":230,"context_line":"                          {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_1c952687","line":227,"range":{"start_line":227,"start_character":12,"end_line":227,"end_character":55},"in_reply_to":"ffe62b97_68b5d37d","updated":"2017-03-29 19:45:00.000000000","message":"I think I\u0027m okay removing the exception from being raised upon failure handling, (since it is actually likely unless we hit something like a storage controller running out of possible mappings), as long as we document the resulting behavior.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4b12d8ba9a08e50f51618bc2e0d148988296de8b","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":388,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":389,"context_line":"                valid \u003d True"},{"line_number":390,"context_line":"            else:"},{"line_number":391,"context_line":"                LOG.warning(\u0027Node %(node)s has a volume_connector (%(uuid)s) \u0027"},{"line_number":392,"context_line":"                            \u0027defined with an unsupported type: %(type)s.\u0027,"},{"line_number":393,"context_line":"                            {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_3554c3fd","line":390,"updated":"2017-03-28 14:40:18.000000000","message":"\u0027mac\u0027 is allowed in API spec[1]. It would be better to ignore it or convert it to ip.\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/volume-connection-information.html","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4b0f34df251344c0d986bc165a4e6c1397c97145","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":388,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":389,"context_line":"                valid \u003d True"},{"line_number":390,"context_line":"            else:"},{"line_number":391,"context_line":"                LOG.warning(\u0027Node %(node)s has a volume_connector (%(uuid)s) \u0027"},{"line_number":392,"context_line":"                            \u0027defined with an unsupported type: %(type)s.\u0027,"},{"line_number":393,"context_line":"                            {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_e12779c6","line":390,"in_reply_to":"ffe62b97_3554c3fd","updated":"2017-03-29 19:45:00.000000000","message":"Lets put an in-line todo and try to take care of that in a follow-up revision since that is going to require a call out to the network common code, to possibly perform a vif lookup in reverse.  I think it is totally doable, but one extra step and code in ironic\u0027s network interface that would be cleanly delineated in a follow-up.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"66d9c5471573516defdc39196506ae6cca1f7e14","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":388,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":389,"context_line":"                valid \u003d True"},{"line_number":390,"context_line":"            else:"},{"line_number":391,"context_line":"                LOG.warning(\u0027Node %(node)s has a volume_connector (%(uuid)s) \u0027"},{"line_number":392,"context_line":"                            \u0027defined with an unsupported type: %(type)s.\u0027,"},{"line_number":393,"context_line":"                            {\u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_884fa969","line":390,"in_reply_to":"ffe62b97_e12779c6","updated":"2017-03-30 20:49:52.000000000","message":"++","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4b12d8ba9a08e50f51618bc2e0d148988296de8b","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        # in cinder drivers, however that may not always be true, and"},{"line_number":407,"context_line":"        # may need to change over time."},{"line_number":408,"context_line":"        data[\u0027host\u0027] \u003d task.node.uuid"},{"line_number":409,"context_line":"        if len(task.volume_connectors) \u003e 1:"},{"line_number":410,"context_line":"            data[\u0027multipath\u0027] \u003d True"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_b58e9376","line":409,"updated":"2017-03-28 14:40:18.000000000","message":"Multiple volume connectors doesn\u0027t mean multipath in case ip and iqn for one interface are registered.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4b0f34df251344c0d986bc165a4e6c1397c97145","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        # in cinder drivers, however that may not always be true, and"},{"line_number":407,"context_line":"        # may need to change over time."},{"line_number":408,"context_line":"        data[\u0027host\u0027] \u003d task.node.uuid"},{"line_number":409,"context_line":"        if len(task.volume_connectors) \u003e 1:"},{"line_number":410,"context_line":"            data[\u0027multipath\u0027] \u003d True"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_bc2aba7b","line":409,"in_reply_to":"ffe62b97_b58e9376","updated":"2017-03-29 19:45:00.000000000","message":"Would this not actually depend upon the running driver to handle?  If the node has multiple storage interfaces/connectors, why possibly set multipath to false when it is perfectly possible to have volumes accessible via FC and iSCSI.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f1dbb41b1e442ab67d6b58b0a597a04d52f00462","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    connector.connector_id is not None):"},{"line_number":84,"context_line":"                iscsi_found +\u003d 1"},{"line_number":85,"context_line":"                if not ipxe_enabled:"},{"line_number":86,"context_line":"                    msg \u003d _(\"The [pxe]ipxe_enabled option must be set to True \""},{"line_number":87,"context_line":"                            \"to support network booting to an iSCSI volume.\")"},{"line_number":88,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"bff0334d_0813c467","line":86,"updated":"2017-04-11 19:23:46.000000000","message":"nit: I think we usually reference config options like this:\n\n[pxe]/ipxe_enabled","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    connector.connector_id is not None):"},{"line_number":84,"context_line":"                iscsi_found +\u003d 1"},{"line_number":85,"context_line":"                if not ipxe_enabled:"},{"line_number":86,"context_line":"                    msg \u003d _(\"The [pxe]ipxe_enabled option must be set to True \""},{"line_number":87,"context_line":"                            \"to support network booting to an iSCSI volume.\")"},{"line_number":88,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_453caa92","line":86,"in_reply_to":"bff0334d_0813c467","updated":"2017-04-25 17:59:55.000000000","message":"Done","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":217,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_70929f4d","line":216,"updated":"2017-04-18 16:23:30.000000000","message":"Why don\u0027t we use the detach_volumes instead of this? It seem to indicate that it can be called in several states, for example it has special handling of ACTIVE state. Don\u0027t we need this handling here too? Can we reuse the detach_volumes? As this function is basically identical.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":217,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_c80c03ee","line":216,"in_reply_to":"7ffa3b31_70929f4d","updated":"2017-04-25 17:59:55.000000000","message":"Will bring this up at tomorrow\u0027s Boot From Volume meeting. I agree that detach_volumes should be sufficient, but want to make sure I\u0027m not missing anything. Also will move comment to next patchset.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        try:"},{"line_number":227,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":228,"context_line":"        except exception.StorageError as e:"},{"line_number":229,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":230,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":231,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":232,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_5509d529","line":231,"range":{"start_line":229,"start_character":12,"end_line":231,"end_character":69},"updated":"2017-04-18 16:23:30.000000000","message":"I don\u0027t really see the reason of doing this, why not just go with allow_errors\u003dTrue right from the start if we don\u0027t care much? Just to print the log message?","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        try:"},{"line_number":227,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":228,"context_line":"        except exception.StorageError as e:"},{"line_number":229,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":230,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":231,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":232,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_0830ab9e","line":231,"range":{"start_line":229,"start_character":12,"end_line":231,"end_character":69},"in_reply_to":"7ffa3b31_5509d529","updated":"2017-04-25 17:59:55.000000000","message":"++ If we wind up keeping this function, will address this.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f1dbb41b1e442ab67d6b58b0a597a04d52f00462","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for target in task.volume_targets:"},{"line_number":269,"context_line":"            for volume in connected:"},{"line_number":270,"context_line":"                # TODO(TheJulia): At some point the target should likely be"},{"line_number":271,"context_line":"                # able to be looked up by it\u0027s volume_id. This removes our"},{"line_number":272,"context_line":"                # need to hint at the record uuid in the DB since we are"},{"line_number":273,"context_line":"                # attempting to batch all of the volume requests under the"}],"source_content_type":"text/x-python","patch_set":38,"id":"bff0334d_defc7271","line":270,"updated":"2017-04-11 19:23:46.000000000","message":"This TODO can either be implemented or removed, right? It looks like the volume id is already in the DB: https://github.com/openstack/ironic/blob/6ba5abbf62d16dd655b79e55acd88c6fbe7f0a3d/ironic/db/sqlalchemy/models.py#L275","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for target in task.volume_targets:"},{"line_number":269,"context_line":"            for volume in connected:"},{"line_number":270,"context_line":"                # TODO(TheJulia): At some point the target should likely be"},{"line_number":271,"context_line":"                # able to be looked up by it\u0027s volume_id. This removes our"},{"line_number":272,"context_line":"                # need to hint at the record uuid in the DB since we are"},{"line_number":273,"context_line":"                # attempting to batch all of the volume requests under the"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_fd4e636d","line":270,"in_reply_to":"7ffa3b31_10c6bb9b","updated":"2017-04-25 17:59:55.000000000","message":"Leaving for now and proposing a follow up patch for implementing this.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for target in task.volume_targets:"},{"line_number":269,"context_line":"            for volume in connected:"},{"line_number":270,"context_line":"                # TODO(TheJulia): At some point the target should likely be"},{"line_number":271,"context_line":"                # able to be looked up by it\u0027s volume_id. This removes our"},{"line_number":272,"context_line":"                # need to hint at the record uuid in the DB since we are"},{"line_number":273,"context_line":"                # attempting to batch all of the volume requests under the"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_10c6bb9b","line":270,"in_reply_to":"bff0334d_defc7271","updated":"2017-04-18 16:23:30.000000000","message":"Yup, I guess what is meant here is that we need something like get_volume_targets_by_volume_id implemented on the dbapi level.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                        not volume.get(\u0027already_attached\u0027)):"},{"line_number":281,"context_line":"                    target.properties \u003d volume[\u0027data\u0027]"},{"line_number":282,"context_line":"                    break"},{"line_number":283,"context_line":"            target.save()"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def detach_volumes(self, task):"},{"line_number":286,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_b0682787","line":283,"range":{"start_line":283,"start_character":12,"end_line":283,"end_character":25},"updated":"2017-04-18 16:23:30.000000000","message":"Please move this under the if where we actually do change the target.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                        not volume.get(\u0027already_attached\u0027)):"},{"line_number":281,"context_line":"                    target.properties \u003d volume[\u0027data\u0027]"},{"line_number":282,"context_line":"                    break"},{"line_number":283,"context_line":"            target.save()"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def detach_volumes(self, task):"},{"line_number":286,"context_line":"        \"\"\"Informs the storage subsystem to detach all volumes for the node."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_5dad57e7","line":283,"range":{"start_line":283,"start_character":12,"end_line":283,"end_character":25},"in_reply_to":"7ffa3b31_b0682787","updated":"2017-04-25 17:59:55.000000000","message":"Done","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f1dbb41b1e442ab67d6b58b0a597a04d52f00462","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            try:"},{"line_number":311,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":312,"context_line":"            except exception.StorageError as e:"},{"line_number":313,"context_line":"                if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":314,"context_line":"                    # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":315,"context_line":"                    # tolerate failures detaching as the node is likely being"},{"line_number":316,"context_line":"                    # powered down to cause a detachment event."}],"source_content_type":"text/x-python","patch_set":38,"id":"bff0334d_de06b252","line":313,"updated":"2017-04-11 19:23:46.000000000","message":"Why not just check this on L310 (before the first call to cinder) and set allow_errors\u003dTrue there? That way we can keep the re-attempt message on L327 if further retries happen in the active case.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            try:"},{"line_number":311,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":312,"context_line":"            except exception.StorageError as e:"},{"line_number":313,"context_line":"                if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":314,"context_line":"                    # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":315,"context_line":"                    # tolerate failures detaching as the node is likely being"},{"line_number":316,"context_line":"                    # powered down to cause a detachment event."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_a82417b0","line":313,"in_reply_to":"7ffa3b31_d00293b4","updated":"2017-04-25 17:59:55.000000000","message":"Done","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            try:"},{"line_number":311,"context_line":"                cinder.detach_volumes(task, targets, connector)"},{"line_number":312,"context_line":"            except exception.StorageError as e:"},{"line_number":313,"context_line":"                if task.node.provision_state \u003d\u003d states.ACTIVE:"},{"line_number":314,"context_line":"                    # NOTE(TheJulia): If the node is in ACTIVE state, we can"},{"line_number":315,"context_line":"                    # tolerate failures detaching as the node is likely being"},{"line_number":316,"context_line":"                    # powered down to cause a detachment event."}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_d00293b4","line":313,"in_reply_to":"bff0334d_de06b252","updated":"2017-04-18 16:23:30.000000000","message":"++","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                    LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":328,"context_line":"                              \"%(err)s. Re-attempting detachment.\","},{"line_number":329,"context_line":"                              {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":330,"context_line":"                    raise e"},{"line_number":331,"context_line":"        detach_volumes()"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def should_write_image(self, task):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_90a1abac","line":330,"range":{"start_line":330,"start_character":20,"end_line":330,"end_character":27},"updated":"2017-04-18 16:23:30.000000000","message":"just raise please","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                    LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":328,"context_line":"                              \"%(err)s. Re-attempting detachment.\","},{"line_number":329,"context_line":"                              {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":330,"context_line":"                    raise e"},{"line_number":331,"context_line":"        detach_volumes()"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def should_write_image(self, task):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_2816c7f2","line":330,"range":{"start_line":330,"start_character":20,"end_line":330,"end_character":27},"in_reply_to":"7ffa3b31_90a1abac","updated":"2017-04-25 17:59:55.000000000","message":"Done","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f1dbb41b1e442ab67d6b58b0a597a04d52f00462","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            elif \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":379,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":380,"context_line":"                valid \u003d True"},{"line_number":381,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":382,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":383,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":384,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"bff0334d_1e13fa67","line":381,"updated":"2017-04-11 19:23:46.000000000","message":"couple questions:\n\n1. Is this something Cinder can do for us?\n2. Is this something that\u0027s needed for proper functionality?\n3. If it\u0027s needed, should we be checking for it in _validate_connectors?","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1c12b631cecebe297a74fda7b0092b4b6e5aba14","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            elif \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":379,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":380,"context_line":"                valid \u003d True"},{"line_number":381,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":382,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":383,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":384,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_a8df7738","line":381,"in_reply_to":"bff0334d_1e13fa67","updated":"2017-04-25 17:59:55.000000000","message":"I will bring these up at tomorrow\u0027s Boot From Volume meeting and move this comment to next patchset.","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"33421d5ea9d1ae0ba556702756cb1f56a3401fa8","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        # in cinder drivers, however that may not always be true, and"},{"line_number":411,"context_line":"        # may need to change over time."},{"line_number":412,"context_line":"        data[\u0027host\u0027] \u003d task.node.uuid"},{"line_number":413,"context_line":"        if len(task.volume_connectors) \u003e 1:"},{"line_number":414,"context_line":"            data[\u0027multipath\u0027] \u003d True"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_f5c0e17e","line":414,"range":{"start_line":413,"start_character":8,"end_line":414,"end_character":36},"updated":"2017-04-18 16:23:30.000000000","message":"But what if only one of them is valid? Maybe we should be checking len(data) here?","commit_id":"10cffa48661712f4ac2ad23b162df0a35c4eb464"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"01d7694220e8abf0c235e07c5ffabb27b5f8017e","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":218,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":39,"id":"7ffa3b31_03076ccc","line":217,"updated":"2017-04-19 17:31:51.000000000","message":"vdrok: Why don\u0027t we use the detach_volumes instead of this? It seem to indicate that it can be called in several states, for example it has special handling of ACTIVE state. Don\u0027t we need this handling here too? Can we reuse the detach_volumes? As this function is basically identical.","commit_id":"e6d574ef376bceebd346c898fcb3ad4b6cc42791"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"01d7694220e8abf0c235e07c5ffabb27b5f8017e","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        except exception.StorageError as e:"},{"line_number":230,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":231,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":232,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":233,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":39,"id":"7ffa3b31_83fa5cba","line":232,"updated":"2017-04-19 17:31:51.000000000","message":"vdrok: I don\u0027t really see the reason of doing this, why not just go with allow_errors\u003dTrue right from the start if we don\u0027t care much? Just to print the log message?","commit_id":"e6d574ef376bceebd346c898fcb3ad4b6cc42791"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"1a094eb292d823c868e50560f039ff057d5987e7","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        except exception.StorageError as e:"},{"line_number":230,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":231,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":232,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":233,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":39,"id":"5ff73747_8db9a4ea","line":232,"in_reply_to":"7ffa3b31_83fa5cba","updated":"2017-04-25 16:16:40.000000000","message":"@vdrok - We discussed this at last week\u0027s Ironic BFV meeting. \n\nYes it is to just print the log message. We believe this is important information to log as a deployer would probably want to know if errors were being ignored.\n\nThe alternative could be to always allow errors and print the log message each time.","commit_id":"e6d574ef376bceebd346c898fcb3ad4b6cc42791"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"01d7694220e8abf0c235e07c5ffabb27b5f8017e","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            elif \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":374,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":375,"context_line":"                valid \u003d True"},{"line_number":376,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":377,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":378,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":379,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":39,"id":"7ffa3b31_4300d4ab","line":376,"updated":"2017-04-19 17:31:51.000000000","message":"mariojv: couple questions:\n1. Is this something Cinder can do for us?\n2. Is this something that\u0027s needed for proper functionality?\n3. If it\u0027s needed, should we be checking for it in _validate_connectors?","commit_id":"e6d574ef376bceebd346c898fcb3ad4b6cc42791"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"01d7694220e8abf0c235e07c5ffabb27b5f8017e","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        # may need to change over time."},{"line_number":407,"context_line":"        data[\u0027host\u0027] \u003d task.node.uuid"},{"line_number":408,"context_line":"        if len(task.volume_connectors) \u003e 1:"},{"line_number":409,"context_line":"            data[\u0027multipath\u0027] \u003d True"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":39,"id":"7ffa3b31_03308c9e","line":409,"updated":"2017-04-19 17:31:51.000000000","message":"vdrok: But what if only one of them is valid? Maybe we should be checking len(data) here?","commit_id":"e6d574ef376bceebd346c898fcb3ad4b6cc42791"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"ddf2ee5030aa2adeda21e9978d5e8cadd03673cc","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        for connector in task.volume_connectors:"},{"line_number":82,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":83,"context_line":"                    connector.connector_id is not None):"},{"line_number":84,"context_line":"                iscsi_found +\u003d 1"},{"line_number":85,"context_line":"                if not ipxe_enabled:"},{"line_number":86,"context_line":"                    msg \u003d _(\"The [pxe]/ipxe_enabled option must \""},{"line_number":87,"context_line":"                            \"be set to True to support network \""}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_49c9fe23","line":84,"updated":"2017-04-27 16:00:12.000000000","message":"Cinder iSCSI driver requires iqn[1]. IP might be optional.\n\n[1] https://github.com/openstack/cinder/blob/c3d293dcd98d9bd4604dae6768dc956acc0bd13e/cinder/volume/driver.py#L2815","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"3a0102b9d106165487c1d398d71e9696393f55ed","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        for connector in task.volume_connectors:"},{"line_number":82,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":83,"context_line":"                    connector.connector_id is not None):"},{"line_number":84,"context_line":"                iscsi_found +\u003d 1"},{"line_number":85,"context_line":"                if not ipxe_enabled:"},{"line_number":86,"context_line":"                    msg \u003d _(\"The [pxe]/ipxe_enabled option must \""},{"line_number":87,"context_line":"                            \"be set to True to support network \""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_66e466ad","line":84,"in_reply_to":"3f044301_faec8cf4","updated":"2017-05-04 17:21:16.000000000","message":"I don\u0027t think converting ip to iqn is necessary. Volume connector is designed to pass both iqn and ip to cinder because a connector could have both. I think we have to see if an iqn is registered here because only iqn is essential for iSCSI. If there is an ip, we can pass it directly to cinder.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"7aebb3ff53d55a3bba8a9eb4b46dd162bee3920b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        for connector in task.volume_connectors:"},{"line_number":82,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":83,"context_line":"                    connector.connector_id is not None):"},{"line_number":84,"context_line":"                iscsi_found +\u003d 1"},{"line_number":85,"context_line":"                if not ipxe_enabled:"},{"line_number":86,"context_line":"                    msg \u003d _(\"The [pxe]/ipxe_enabled option must \""},{"line_number":87,"context_line":"                            \"be set to True to support network \""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_faec8cf4","line":84,"in_reply_to":"5ff73747_49c9fe23","updated":"2017-05-04 15:29:25.000000000","message":"If I\u0027m understanding properly, I think handling TheJulia\u0027s todo of generating an iqn would handle this.\n\nBasically we\u0027ll either have an IQN, or we\u0027ll generate one. Still need to figure out the best way to do this.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"ddf2ee5030aa2adeda21e9978d5e8cadd03673cc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # NOTE(TheJulia): Unlike iSCSI with cinder, we have no need"},{"line_number":94,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":95,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":96,"context_line":"                fc_found +\u003d 1"},{"line_number":97,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":98,"context_line":"            LOG.info(\"Multiple possible configuration details found for iSCSI \""},{"line_number":99,"context_line":"                     \"for node %(node)s. Only the first available entry \""}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_49be9ed5","line":96,"updated":"2017-04-27 16:00:12.000000000","message":"Cinder FC driver requires both wwpn and wwnn in a connector[1]. Setting only ether one is not enough. We need to validate if both information is registered.\n\n[1] https://github.com/openstack/cinder/blob/c3d293dcd98d9bd4604dae6768dc956acc0bd13e/cinder/volume/driver.py#L2961","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6f863e26b8fdd8ca4b72a9ba6ddd584bf036b808","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                # NOTE(TheJulia): Unlike iSCSI with cinder, we have no need"},{"line_number":94,"context_line":"                # to warn about multiple IQN entries, since we are able to"},{"line_number":95,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":96,"context_line":"                fc_found +\u003d 1"},{"line_number":97,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":98,"context_line":"            LOG.info(\"Multiple possible configuration details found for iSCSI \""},{"line_number":99,"context_line":"                     \"for node %(node)s. Only the first available entry \""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_6b943845","line":96,"in_reply_to":"5ff73747_49be9ed5","updated":"2017-05-04 15:22:11.000000000","message":"Good find. I think I have a solution for this.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":96,"context_line":"                fc_found +\u003d 1"},{"line_number":97,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":98,"context_line":"            LOG.info(\"Multiple possible configuration details found for iSCSI \""},{"line_number":99,"context_line":"                     \"for node %(node)s. Only the first available entry \""},{"line_number":100,"context_line":"                     \"will be utilized.\", {\u0027node\u0027: node.uuid})"},{"line_number":101,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_11596c59","line":98,"updated":"2017-05-04 09:12:04.000000000","message":"s/info/warning/ maybe? It looks potentially dangerous.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6f863e26b8fdd8ca4b72a9ba6ddd584bf036b808","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # submit multiple fibre channel WWPN entries."},{"line_number":96,"context_line":"                fc_found +\u003d 1"},{"line_number":97,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":98,"context_line":"            LOG.info(\"Multiple possible configuration details found for iSCSI \""},{"line_number":99,"context_line":"                     \"for node %(node)s. Only the first available entry \""},{"line_number":100,"context_line":"                     \"will be utilized.\", {\u0027node\u0027: node.uuid})"},{"line_number":101,"context_line":"        return {\u0027fc_found\u0027: fc_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_ab6fe0c3","line":98,"in_reply_to":"3f044301_11596c59","updated":"2017-05-04 15:22:11.000000000","message":"Agreed. Switching to warning.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"107467102b4020eca3b4adc3cd8e480c355dd7d3","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                self._fail_validation(task, msg)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # NOTE(TheJulia): We should likely consider incorporation"},{"line_number":127,"context_line":"            # of if the volume boot_index field, however it may not be"},{"line_number":128,"context_line":"            # relevant to the checks we perform here as in the end a"},{"line_number":129,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":130,"context_line":"            # as well."}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_82de8a3b","line":127,"range":{"start_line":127,"start_character":17,"end_line":127,"end_character":19},"updated":"2017-04-29 02:06:39.000000000","message":"nit:s/if//","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6f863e26b8fdd8ca4b72a9ba6ddd584bf036b808","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                self._fail_validation(task, msg)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"            # NOTE(TheJulia): We should likely consider incorporation"},{"line_number":127,"context_line":"            # of if the volume boot_index field, however it may not be"},{"line_number":128,"context_line":"            # relevant to the checks we perform here as in the end a"},{"line_number":129,"context_line":"            # FC volume \"attached\" to a node is a valid configuration"},{"line_number":130,"context_line":"            # as well."}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_eb4cc877","line":127,"range":{"start_line":127,"start_character":17,"end_line":127,"end_character":19},"in_reply_to":"5ff73747_82de8a3b","updated":"2017-05-04 15:22:11.000000000","message":"Done","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"107467102b4020eca3b4adc3cd8e480c355dd7d3","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":218,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_02983a72","line":217,"range":{"start_line":217,"start_character":9,"end_line":217,"end_character":28},"updated":"2017-04-29 02:06:39.000000000","message":"missing raises StorageError in doc string, as it can raised on cinder.detach_volumes()","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"3a0102b9d106165487c1d398d71e9696393f55ed","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":218,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_89f545ce","line":217,"range":{"start_line":217,"start_character":9,"end_line":217,"end_character":28},"in_reply_to":"3f044301_2b3510db","updated":"2017-05-04 17:21:16.000000000","message":"This method doesn\u0027t raise a StorageError. The error is caught and not re-raised. After the error is caught, cinder.detach_volume() doesn\u0027t raise an error because allow_errors is True.\n\n\nFYI: According to guidelines for exceptions[1], we can list exceptions not raised directly by the method.\n\n[1] https://wiki.openstack.org/wiki/Ironic/Developer_guidelines#Exceptions","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":218,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_3df0a4c9","line":217,"range":{"start_line":217,"start_character":9,"end_line":217,"end_character":28},"in_reply_to":"3f044301_89f545ce","updated":"2017-05-04 22:14:40.000000000","message":"Oh yes, it is getting caught. Michael, as Hironori pointed we can list the exception not directly raised.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6f863e26b8fdd8ca4b72a9ba6ddd584bf036b808","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self._validate_targets(task, found_types, iscsi_boot, fc_boot)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _abort_attach_volume(self, task, connector):"},{"line_number":218,"context_line":"        \"\"\"Detach volumes as a result of failed attachment."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        If detachment fails, it will be retried with allow_errors\u003dTrue."}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_2b3510db","line":217,"range":{"start_line":217,"start_character":9,"end_line":217,"end_character":28},"in_reply_to":"5ff73747_02983a72","updated":"2017-05-04 15:22:11.000000000","message":"I\u0027m pretty sure raises doc strings should only be included if the function directly raises the exception. Please let me know if I\u0027m wrong about this. Leaving for now.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        except exception.StorageError as e:"},{"line_number":230,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":231,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":232,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":233,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_f155e01e","line":232,"updated":"2017-05-04 09:12:04.000000000","message":"why not use action_retries here?","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        except exception.StorageError as e:"},{"line_number":230,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":231,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":232,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":233,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def attach_volumes(self, task):"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_cd5e4775","line":232,"in_reply_to":"3f044301_f155e01e","updated":"2017-05-10 21:45:42.000000000","message":"I don\u0027t have a good answer to this. Will bring up during next IRC meeting.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"107467102b4020eca3b4adc3cd8e480c355dd7d3","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":254,"context_line":"                LOG.error(\"Error attaching volumes for node %(node)s: \""},{"line_number":255,"context_line":"                          \"%(err)s\", {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":256,"context_line":"                self._abort_attach_volume(task, connector)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":259,"context_line":"            LOG.error(\"The number of volumes defined for node %(node)s does \""}],"source_content_type":"text/x-python","patch_set":40,"id":"5ff73747_e2be6ed3","line":256,"range":{"start_line":256,"start_character":21,"end_line":256,"end_character":41},"updated":"2017-04-29 02:06:39.000000000","message":"will it be good to call detach_volumes() directly from here, or is _abort_attach_volumes() defined separately so that in case detaching fails allow_errors can be passed true later?","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":254,"context_line":"                LOG.error(\"Error attaching volumes for node %(node)s: \""},{"line_number":255,"context_line":"                          \"%(err)s\", {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":256,"context_line":"                self._abort_attach_volume(task, connector)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":259,"context_line":"            LOG.error(\"The number of volumes defined for node %(node)s does \""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_bdaa7482","line":256,"range":{"start_line":256,"start_character":21,"end_line":256,"end_character":41},"in_reply_to":"3f044301_4b0f3c2e","updated":"2017-05-04 22:14:40.000000000","message":"Ah okay.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"6f863e26b8fdd8ca4b72a9ba6ddd584bf036b808","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":254,"context_line":"                LOG.error(\"Error attaching volumes for node %(node)s: \""},{"line_number":255,"context_line":"                          \"%(err)s\", {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":256,"context_line":"                self._abort_attach_volume(task, connector)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if len(targets) !\u003d len(connected):"},{"line_number":259,"context_line":"            LOG.error(\"The number of volumes defined for node %(node)s does \""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_4b0f3c2e","line":256,"range":{"start_line":256,"start_character":21,"end_line":256,"end_character":41},"in_reply_to":"5ff73747_e2be6ed3","updated":"2017-05-04 15:22:11.000000000","message":"We were toying with this idea in patchset 38 (getting rid of abort_attach_volume and just having the detach_volume function). The consensus seemed to be that we should continue to use this function as the error handling is a bit different.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                # NOTE(TheJulia): In the event that the node is not in"},{"line_number":320,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"},{"line_number":321,"context_line":"                # all attachments are removed."},{"line_number":322,"context_line":"                LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":323,"context_line":"                          \"%(err)s. Re-attempting detachment.\","},{"line_number":324,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":325,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_d130a40a","line":322,"updated":"2017-05-04 09:12:04.000000000","message":"I have a gut feeling that if we don\u0027t fail, it should be a warning","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                # NOTE(TheJulia): In the event that the node is not in"},{"line_number":320,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"},{"line_number":321,"context_line":"                # all attachments are removed."},{"line_number":322,"context_line":"                LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":323,"context_line":"                          \"%(err)s. Re-attempting detachment.\","},{"line_number":324,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":325,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_8dceff7f","line":322,"in_reply_to":"3f044301_d130a40a","updated":"2017-05-10 21:45:42.000000000","message":"Good point. I\u0027ll do LOG.warning unless it\u0027s the last try.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"},{"line_number":321,"context_line":"                # all attachments are removed."},{"line_number":322,"context_line":"                LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":323,"context_line":"                          \"%(err)s. Re-attempting detachment.\","},{"line_number":324,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":325,"context_line":"                raise"},{"line_number":326,"context_line":"        detach_volumes()"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_b13518fa","line":323,"updated":"2017-05-04 09:12:04.000000000","message":"this code will log \"Re-attempting detachment\" even on the last attempt.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                # ACTIVE state, we need to fail hard as we need to ensure"},{"line_number":321,"context_line":"                # all attachments are removed."},{"line_number":322,"context_line":"                LOG.error(\"Error detaching volumes for node %(node)s: \""},{"line_number":323,"context_line":"                          \"%(err)s. Re-attempting detachment.\","},{"line_number":324,"context_line":"                          {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":325,"context_line":"                raise"},{"line_number":326,"context_line":"        detach_volumes()"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_2dbecbd4","line":323,"in_reply_to":"3f044301_b13518fa","updated":"2017-05-10 21:45:42.000000000","message":"Done. But in a relatively hack-y way... Let me know what you think.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        possibly how we can connect."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        Supports passing iSCSI information in the form of IP and IQN records,"},{"line_number":349,"context_line":"        as well as FiberChannel information in the form of WWPN addresses."},{"line_number":350,"context_line":"        FiberChannel WWNN addresses are also sent, however at present in-tree"},{"line_number":351,"context_line":"        Cinder drivers do not utilize WWNN addresses."},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_3b9b0c73","line":349,"range":{"start_line":349,"start_character":19,"end_line":349,"end_character":31},"updated":"2017-05-04 22:14:40.000000000","message":"nit:s/FiberChannel/Fiber Channel","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        If multiple connectors exist, the request will be filed with"},{"line_number":354,"context_line":"        MultiPath IO being enabled."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        A warning is logged If an unsupported volume type is encountered."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        :params task: The task object."},{"line_number":359,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_60cc4389","line":356,"range":{"start_line":356,"start_character":28,"end_line":356,"end_character":29},"updated":"2017-05-04 22:14:40.000000000","message":"nit:s/If/if","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"3c621c4c0871013a57f0a2ad31a3acc76a5f8e1e","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# NOTE(TheJulia): Sets containing known valid types that align with"},{"line_number":34,"context_line":"# _generate_connector() and the volume connection information spec."},{"line_number":35,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027, \u0027ip\u0027)"},{"line_number":36,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":37,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027, \u0027wwnn\u0027)"},{"line_number":38,"context_line":"# NOTE(TheJulia) Most Cinder drivers support/utilize WWPN, however"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_c93fcdd4","line":35,"updated":"2017-05-04 17:33:29.000000000","message":"I think we should count only iqn, which is an essential parameter for iSCSI.","commit_id":"23db7c9e50ee35d51e0f4c17abf3233c614050df"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"8c87076b60b7f7d5a5923ac1bd29a980c828dd9b","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# NOTE(TheJulia): Sets containing known valid types that align with"},{"line_number":34,"context_line":"# _generate_connector() and the volume connection information spec."},{"line_number":35,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027, \u0027ip\u0027)"},{"line_number":36,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":37,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027, \u0027wwnn\u0027)"},{"line_number":38,"context_line":"# NOTE(TheJulia) Most Cinder drivers support/utilize WWPN, however"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_cddf6738","line":35,"in_reply_to":"3f044301_c93fcdd4","updated":"2017-05-10 21:48:37.000000000","message":"Agreed. Removing \u0027ip\u0027 (at least for now).","commit_id":"23db7c9e50ee35d51e0f4c17abf3233c614050df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"3c621c4c0871013a57f0a2ad31a3acc76a5f8e1e","unresolved":false,"context_lines":[{"line_number":383,"context_line":"                valid \u003d True"},{"line_number":384,"context_line":"            elif \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":385,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":386,"context_line":"                valid \u003d True"},{"line_number":387,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":388,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":389,"context_line":"                if \u0027wwpns\u0027 not in data:"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_b46974bf","line":386,"updated":"2017-05-04 17:33:29.000000000","message":"Because IP is optional for iSCSI, we shouldn\u0027t set valid to True here. I don\u0027t think we need to translate it to IQN. All we have to do is passing IP to cinder as a member of a connector.","commit_id":"23db7c9e50ee35d51e0f4c17abf3233c614050df"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"8c87076b60b7f7d5a5923ac1bd29a980c828dd9b","unresolved":false,"context_lines":[{"line_number":383,"context_line":"                valid \u003d True"},{"line_number":384,"context_line":"            elif \u0027ip\u0027 in connector.type and \u0027ip\u0027 not in data:"},{"line_number":385,"context_line":"                data[\u0027ip\u0027] \u003d connector.connector_id"},{"line_number":386,"context_line":"                valid \u003d True"},{"line_number":387,"context_line":"            # TODO(TheJulia): Translate to, or generate an IQN."},{"line_number":388,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":389,"context_line":"                if \u0027wwpns\u0027 not in data:"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_ade89be1","line":386,"in_reply_to":"3f044301_b46974bf","updated":"2017-05-10 21:48:37.000000000","message":"Done.","commit_id":"23db7c9e50ee35d51e0f4c17abf3233c614050df"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":36,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027,)"},{"line_number":37,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":38,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027, \u0027wwnn\u0027)"},{"line_number":39,"context_line":"# NOTE(TheJulia) Most Cinder drivers support/utilize WWPN, however"},{"line_number":40,"context_line":"# there are some references to WWNNs also being available, and as such"},{"line_number":41,"context_line":"# we should consider it valid for a driver to pass."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class CinderStorage(base.StorageInterface):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_4c8514ad","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":51},"updated":"2017-05-15 10:42:26.000000000","message":"As the code now requires setting both, I guess this comment should be removed now.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":36,"context_line":"VALID_ISCSI_TYPES \u003d (\u0027iqn\u0027,)"},{"line_number":37,"context_line":"# TODO(TheJulia): FCoE?"},{"line_number":38,"context_line":"VALID_FC_TYPES \u003d (\u0027wwpn\u0027, \u0027wwnn\u0027)"},{"line_number":39,"context_line":"# NOTE(TheJulia) Most Cinder drivers support/utilize WWPN, however"},{"line_number":40,"context_line":"# there are some references to WWNNs also being available, and as such"},{"line_number":41,"context_line":"# we should consider it valid for a driver to pass."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class CinderStorage(base.StorageInterface):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_ae736380","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":51},"in_reply_to":"1f013ff3_4c8514ad","updated":"2017-05-16 00:44:44.000000000","message":"Done","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return {}"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":55,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for node \""},{"line_number":56,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":57,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":58,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_acb7f886","line":55,"range":{"start_line":55,"start_character":44,"end_line":55,"end_character":61},"updated":"2017-05-15 10:42:26.000000000","message":"storage interface?","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return {}"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _fail_validation(self, task, reason):"},{"line_number":55,"context_line":"        msg \u003d (_(\"Failed to validate cinder storage_interface for node \""},{"line_number":56,"context_line":"                 \"%(node)s. %(reason)s\") %"},{"line_number":57,"context_line":"               {\u0027node\u0027: task.node.uuid, \u0027reason\u0027: reason})"},{"line_number":58,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_8e70a774","line":55,"range":{"start_line":55,"start_character":44,"end_line":55,"end_character":61},"in_reply_to":"1f013ff3_acb7f886","updated":"2017-05-16 00:44:44.000000000","message":"Done","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc9218e66cf27be7d57cc490295f62b59013d68a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Validate connector information helper."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        Enumerates through all connector objects, and identifies if"},{"line_number":65,"context_line":"        iSCSI or Fibre Channel connectors are present. This helper will"},{"line_number":66,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":67,"context_line":"        is not enabled."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :param task: The task object."},{"line_number":70,"context_line":"        :raises: InvalidParameterValue"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_aaf23805","line":67,"range":{"start_line":65,"start_character":55,"end_line":67,"end_character":22},"updated":"2017-05-15 11:52:34.000000000","message":"This sentence misinforms.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"\"\"Validate connector information helper."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        Enumerates through all connector objects, and identifies if"},{"line_number":65,"context_line":"        iSCSI or Fibre Channel connectors are present. This helper will"},{"line_number":66,"context_line":"        raise a StorageError exception if iSCSI is identified and iPXE"},{"line_number":67,"context_line":"        is not enabled."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :param task: The task object."},{"line_number":70,"context_line":"        :raises: InvalidParameterValue"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_ce9d8f5a","line":67,"range":{"start_line":65,"start_character":55,"end_line":67,"end_character":22},"in_reply_to":"1f013ff3_aaf23805","updated":"2017-05-16 00:44:44.000000000","message":"Done","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"17486dc7c27b6a8009e41f61c915e9521841f502","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":85,"context_line":"                    connector.connector_id is not None):"},{"line_number":86,"context_line":"                iscsi_found +\u003d 1"},{"line_number":87,"context_line":"                if not ipxe_enabled:"},{"line_number":88,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":89,"context_line":"                           \"be set to True to support network \""},{"line_number":90,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":91,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":94,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_61f7c0f7","line":91,"range":{"start_line":87,"start_character":16,"end_line":91,"end_character":52},"updated":"2017-05-15 05:15:20.000000000","message":"It would be better to handle the ipxe related condition in the pxe boot interface so that these storage methods can be used generically by other iscsi implementations.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":85,"context_line":"                    connector.connector_id is not None):"},{"line_number":86,"context_line":"                iscsi_found +\u003d 1"},{"line_number":87,"context_line":"                if not ipxe_enabled:"},{"line_number":88,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":89,"context_line":"                           \"be set to True to support network \""},{"line_number":90,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":91,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":94,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_ef61723b","line":91,"range":{"start_line":87,"start_character":16,"end_line":91,"end_character":52},"in_reply_to":"1f013ff3_61f7c0f7","updated":"2017-05-15 10:42:26.000000000","message":"I\u0027d actually prefer not to call other interfaces from inside of an interface, only conductor should be calling the interfaces, if I understand correctly what you mean here.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":85,"context_line":"                    connector.connector_id is not None):"},{"line_number":86,"context_line":"                iscsi_found +\u003d 1"},{"line_number":87,"context_line":"                if not ipxe_enabled:"},{"line_number":88,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":89,"context_line":"                           \"be set to True to support network \""},{"line_number":90,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":91,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":94,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_11e26e04","line":91,"range":{"start_line":87,"start_character":16,"end_line":91,"end_character":52},"in_reply_to":"1f013ff3_8569aa26","updated":"2017-05-16 00:44:44.000000000","message":"Yeah good points. I\u0027m going to stick with leaving it here because we\u0027re only checking a config option (rather than looping through the connectors in two different interfaces).\n\nBut I definitely see why it would logically belong in the pxe module.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"8193f60eadae5eda5366f7b079da376d1e85da57","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":85,"context_line":"                    connector.connector_id is not None):"},{"line_number":86,"context_line":"                iscsi_found +\u003d 1"},{"line_number":87,"context_line":"                if not ipxe_enabled:"},{"line_number":88,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":89,"context_line":"                           \"be set to True to support network \""},{"line_number":90,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":91,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":94,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_fb725011","line":91,"range":{"start_line":87,"start_character":16,"end_line":91,"end_character":52},"in_reply_to":"1f013ff3_ef61723b","updated":"2017-05-15 14:55:10.000000000","message":"Yes. I think this check should be part of PXEBoot.validate()","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ab6e435013ea7a593fe21d049acdb2a9bcd620ce","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            if (connector.type in VALID_ISCSI_TYPES and"},{"line_number":85,"context_line":"                    connector.connector_id is not None):"},{"line_number":86,"context_line":"                iscsi_found +\u003d 1"},{"line_number":87,"context_line":"                if not ipxe_enabled:"},{"line_number":88,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":89,"context_line":"                           \"be set to True to support network \""},{"line_number":90,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":91,"context_line":"                    self._fail_validation(task, msg)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            if (connector.type in VALID_FC_TYPES and"},{"line_number":94,"context_line":"                    connector.connector_id is not None):"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_8569aa26","line":91,"range":{"start_line":87,"start_character":16,"end_line":91,"end_character":52},"in_reply_to":"1f013ff3_fb725011","updated":"2017-05-15 15:18:17.000000000","message":"But then, PXEBoot will be going through volume connectors? So in either case, there is kind of an overlap. I\u0027m fine with both ways I think.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc9218e66cf27be7d57cc490295f62b59013d68a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    wwnn_found +\u003d 1"},{"line_number":102,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":103,"context_line":"            LOG.warning(\"Multiple possible configuration details found\""},{"line_number":104,"context_line":"                        \"for iSCSI for node %(node)s. Only the first \""},{"line_number":105,"context_line":"                        \"available entry will be utilized.\","},{"line_number":106,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":107,"context_line":"        if wwpn_found !\u003d wwnn_found:"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_ea3600b5","line":104,"range":{"start_line":104,"start_character":63,"end_line":104,"end_character":68},"updated":"2017-05-15 11:52:34.000000000","message":"Please mention it\u0027s uuid here if possible, the order is not guaranteed.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                        \"for iSCSI for node %(node)s. Only the first \""},{"line_number":105,"context_line":"                        \"available entry will be utilized.\","},{"line_number":106,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":107,"context_line":"        if wwpn_found !\u003d wwnn_found:"},{"line_number":108,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""},{"line_number":109,"context_line":"                   \"connections. There must be a wwpn entry for every wwnn \""},{"line_number":110,"context_line":"                   \"entry. There are %(wwpn)d wwpn entries and %(wwnn)s wwnn \""}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_8c71dce3","line":107,"updated":"2017-05-15 10:42:26.000000000","message":"I\u0027m not sure how FC works on cinder side, hopefully this is a correct assumption :)","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                        \"for iSCSI for node %(node)s. Only the first \""},{"line_number":105,"context_line":"                        \"available entry will be utilized.\","},{"line_number":106,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":107,"context_line":"        if wwpn_found !\u003d wwnn_found:"},{"line_number":108,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""},{"line_number":109,"context_line":"                   \"connections. There must be a wwpn entry for every wwnn \""},{"line_number":110,"context_line":"                   \"entry. There are %(wwpn)d wwpn entries and %(wwnn)s wwnn \""}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_31b68afc","line":107,"in_reply_to":"1f013ff3_8c71dce3","updated":"2017-05-16 00:44:44.000000000","message":"I brought this up at the last ironic-bfv meeting. I\u0027m going to keep looking into it but I\u0027m pretty sure this is sufficient :)","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        try:"},{"line_number":240,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":241,"context_line":"        except exception.StorageError as e:"},{"line_number":242,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":243,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":244,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":245,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_6f40c236","line":242,"range":{"start_line":242,"start_character":16,"end_line":242,"end_character":21},"updated":"2017-05-15 10:42:26.000000000","message":"Isn\u0027t it a warning?","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        try:"},{"line_number":240,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":241,"context_line":"        except exception.StorageError as e:"},{"line_number":242,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":243,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":244,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":245,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_b3b18c92","line":242,"range":{"start_line":242,"start_character":16,"end_line":242,"end_character":21},"in_reply_to":"1f013ff3_6f40c236","updated":"2017-05-16 00:44:44.000000000","message":"We want to log an error as the detachment did fail. We\u0027re retrying with errors, but want the operator to treat it more seriously than a warning.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ef64ef36d21e5f0248afd59c7ae47c3c8654169","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":394,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":395,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":396,"context_line":"                valid \u003d True"},{"line_number":397,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":398,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":399,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_2fbf5afc","line":396,"range":{"start_line":396,"start_character":16,"end_line":396,"end_character":28},"updated":"2017-05-15 10:42:26.000000000","message":"Shouldn\u0027t we do the same thing here, say that data is valid only if number of wwpn and wwnn is equal? Or maybe we should not, if all the attachment happens under lock.","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"d34309e627cc5de3846ddf664410aa82831c1f81","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":394,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":395,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":396,"context_line":"                valid \u003d True"},{"line_number":397,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":398,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":399,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":44,"id":"1f013ff3_d19f664e","line":396,"range":{"start_line":396,"start_character":16,"end_line":396,"end_character":28},"in_reply_to":"1f013ff3_2fbf5afc","updated":"2017-05-16 00:44:44.000000000","message":"Might be redundant as it should be caught in validation. Though I\u0027m not sure that validate is guaranteed to run before this. Maybe we should run validate_connectors here as well?","commit_id":"c30abfb5d072f1313a19445480236f22cb062411"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    connector.connector_id is not None):"},{"line_number":85,"context_line":"                iscsi_found +\u003d 1"},{"line_number":86,"context_line":"                if not ipxe_enabled:"},{"line_number":87,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":88,"context_line":"                           \"be set to True to support network \""},{"line_number":89,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":90,"context_line":"                    self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_72ae3999","line":87,"updated":"2017-05-16 17:14:27.000000000","message":"this is a user-visible string, and has to be wrapped in _()","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    connector.connector_id is not None):"},{"line_number":85,"context_line":"                iscsi_found +\u003d 1"},{"line_number":86,"context_line":"                if not ipxe_enabled:"},{"line_number":87,"context_line":"                    msg \u003d (\"The [pxe]/ipxe_enabled option must \""},{"line_number":88,"context_line":"                           \"be set to True to support network \""},{"line_number":89,"context_line":"                           \"booting to an iSCSI volume.\")"},{"line_number":90,"context_line":"                    self._fail_validation(task, msg)"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_004a4a26","line":87,"in_reply_to":"1f013ff3_72ae3999","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":102,"context_line":"            LOG.warning(\"Multiple possible configuration details found\""},{"line_number":103,"context_line":"                        \"for iSCSI for node %(node)s. Only the first \""},{"line_number":104,"context_line":"                        \"available entry will be utilized.\","},{"line_number":105,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":106,"context_line":"        if wwpn_found !\u003d wwnn_found:"},{"line_number":107,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_52957d3f","line":104,"updated":"2017-05-16 17:14:27.000000000","message":"I\u0027d prefer we log all connector UUIDs here, and which one we\u0027re going to use.","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        if iscsi_found \u003e 1:"},{"line_number":102,"context_line":"            LOG.warning(\"Multiple possible configuration details found\""},{"line_number":103,"context_line":"                        \"for iSCSI for node %(node)s. Only the first \""},{"line_number":104,"context_line":"                        \"available entry will be utilized.\","},{"line_number":105,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":106,"context_line":"        if wwpn_found !\u003d wwnn_found:"},{"line_number":107,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_20eb0eb1","line":104,"in_reply_to":"1f013ff3_52957d3f","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""},{"line_number":108,"context_line":"                   \"connections. There must be a wwpn entry for every wwnn \""},{"line_number":109,"context_line":"                   \"entry. There are %(wwpn)d wwpn entries and %(wwnn)s wwnn \""},{"line_number":110,"context_line":"                   \"entries.\") % {\u0027wwpn\u0027: wwpn_found, \u0027wwnn\u0027: wwnn_found}"},{"line_number":111,"context_line":"            self._fail_validation(task, msg, exception.StorageError)"},{"line_number":112,"context_line":"        return {\u0027fc_found\u0027: wwpn_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_3290b14e","line":110,"updated":"2017-05-16 17:14:27.000000000","message":"ditto about _()","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            msg \u003d (\"Cinder requires both wwnn and wwpn entries for FCoE \""},{"line_number":108,"context_line":"                   \"connections. There must be a wwpn entry for every wwnn \""},{"line_number":109,"context_line":"                   \"entry. There are %(wwpn)d wwpn entries and %(wwnn)s wwnn \""},{"line_number":110,"context_line":"                   \"entries.\") % {\u0027wwpn\u0027: wwpn_found, \u0027wwnn\u0027: wwnn_found}"},{"line_number":111,"context_line":"            self._fail_validation(task, msg, exception.StorageError)"},{"line_number":112,"context_line":"        return {\u0027fc_found\u0027: wwpn_found \u003e\u003d 1, \u0027iscsi_found\u0027: iscsi_found \u003e\u003d 1}"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_80053a7d","line":110,"in_reply_to":"1f013ff3_3290b14e","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":208,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":209,"context_line":"        # boot capability is defined."},{"line_number":210,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":211,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":212,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":213,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_129ff55f","line":210,"updated":"2017-05-16 17:14:27.000000000","message":"This means that if I have a node with storage_interface\u003dcinder and iscsi_boot capability, I won\u0027t be able to use it for regular (non-BFV) deployment. Is it correct? Or do we only call storage.validate when we actually have connectors?","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":208,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":209,"context_line":"        # boot capability is defined."},{"line_number":210,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":211,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":212,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":213,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_9ad24234","line":210,"in_reply_to":"1f013ff3_129ff55f","updated":"2017-05-17 21:04:41.000000000","message":"As far as I can tell, no such check is done.\n\nhttps://github.com/openstack/ironic/blob/98dc0ddb14fa3ad423736a29ed45e59dbd4e13a1/ironic/conductor/manager.py#L1546\n\nI\u0027ll bring this up at the next BFV meeting.","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        try:"},{"line_number":239,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":240,"context_line":"        except exception.StorageError as e:"},{"line_number":241,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":242,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":243,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":244,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_f2992979","line":241,"updated":"2017-05-16 17:14:27.000000000","message":"if it\u0027s not fatal, it should be a warning IMO","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        try:"},{"line_number":239,"context_line":"            cinder.detach_volumes(task, targets, connector)"},{"line_number":240,"context_line":"        except exception.StorageError as e:"},{"line_number":241,"context_line":"            LOG.error(\"Error detaching volume for node %(node)s on \""},{"line_number":242,"context_line":"                      \"aborting volume attach: %(err)s. Retrying with errors \""},{"line_number":243,"context_line":"                      \"allowed.\", {\u0027node\u0027: task.node.uuid, \u0027err\u0027: e})"},{"line_number":244,"context_line":"            cinder.detach_volumes(task, targets, connector, allow_errors\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_e0687622","line":241,"in_reply_to":"1f013ff3_f2992979","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"814fffb574dbfa4ef858f139f783ae7f4a987b68","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                         {\u0027uuid\u0027: node.uuid})"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        for volume in connected:"},{"line_number":281,"context_line":"            volume_uuid \u003d volume[\u0027data\u0027][\u0027ironic_volume_uuid\u0027]"},{"line_number":282,"context_line":"            targets \u003d objects.VolumeTarget.list_by_volume_id(task.context,"},{"line_number":283,"context_line":"                                                             volume_uuid)"},{"line_number":284,"context_line":"            for target in targets:"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_87e057ce","line":281,"updated":"2017-05-17 06:41:01.000000000","message":"We need to see if the volume has \u0027already_connected\u0027 flag as PS42. In the case the volume attachment is skipped, the information for connection such as target_iqn is deleted here by overwriting properties with this revision.","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"55eeed21881681ba95c5657701097b4cc48dfde2","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                         {\u0027uuid\u0027: node.uuid})"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        for volume in connected:"},{"line_number":281,"context_line":"            volume_uuid \u003d volume[\u0027data\u0027][\u0027ironic_volume_uuid\u0027]"},{"line_number":282,"context_line":"            targets \u003d objects.VolumeTarget.list_by_volume_id(task.context,"},{"line_number":283,"context_line":"                                                             volume_uuid)"},{"line_number":284,"context_line":"            for target in targets:"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_20742e99","line":281,"in_reply_to":"1f013ff3_87e057ce","updated":"2017-05-17 12:05:01.000000000","message":"Whoops! Sorry for the oversight. Fixing.","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":392,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":393,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":394,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":395,"context_line":"                valid \u003d True"},{"line_number":396,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":397,"context_line":"                if \u0027wwnns\u0027 not in data:"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_d28aad19","line":394,"updated":"2017-05-16 17:14:27.000000000","message":"can be shortened to\n\n data.setdefault(\u0027wwpns\u0027, []).append(connector.connector_id)","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            elif \u0027wwpn\u0027 in connector.type:"},{"line_number":392,"context_line":"                if \u0027wwpns\u0027 not in data:"},{"line_number":393,"context_line":"                    data[\u0027wwpns\u0027] \u003d []"},{"line_number":394,"context_line":"                data[\u0027wwpns\u0027].append(connector.connector_id)"},{"line_number":395,"context_line":"                valid \u003d True"},{"line_number":396,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":397,"context_line":"                if \u0027wwnns\u0027 not in data:"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_c3c8dc75","line":394,"in_reply_to":"1f013ff3_d28aad19","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":397,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":398,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":399,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":400,"context_line":"                valid \u003d True"},{"line_number":401,"context_line":"            else:"},{"line_number":402,"context_line":"                # TODO(jtaryma): Add handling of type \u0027mac\u0027 with MAC to IP"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_b28de132","line":399,"updated":"2017-05-16 17:14:27.000000000","message":"ditto","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            elif \u0027wwnn\u0027 in connector.type:"},{"line_number":397,"context_line":"                if \u0027wwnns\u0027 not in data:"},{"line_number":398,"context_line":"                    data[\u0027wwnns\u0027] \u003d []"},{"line_number":399,"context_line":"                data[\u0027wwnns\u0027].append(connector.connector_id)"},{"line_number":400,"context_line":"                valid \u003d True"},{"line_number":401,"context_line":"            else:"},{"line_number":402,"context_line":"                # TODO(jtaryma): Add handling of type \u0027mac\u0027 with MAC to IP"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_a3c5e85d","line":399,"in_reply_to":"1f013ff3_b28de132","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"878762ab791ce1b9d10057052a46191ecf290330","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                    wwnn_found +\u003d 1"},{"line_number":101,"context_line":"        if len(iscsi_uuids_found) \u003e 1:"},{"line_number":102,"context_line":"            LOG.warning(\"Multiple possible iSCSI connectors, \""},{"line_number":103,"context_line":"                        \"%(iscsi_uuids_found) found, for node %(node)s. \""},{"line_number":104,"context_line":"                        \"Only the first iSCSI connector, %(iscsi_uuid)s, \""},{"line_number":105,"context_line":"                        \"will be utilized.\","},{"line_number":106,"context_line":"                        {\u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_47638ddd","line":103,"updated":"2017-05-18 14:21:03.000000000","message":"missing s (format specification) after %(iscsi_uuids_found)","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ece6dc623d30b7fe9a4e693ed95ac1a6bf3ec266","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                    wwnn_found +\u003d 1"},{"line_number":101,"context_line":"        if len(iscsi_uuids_found) \u003e 1:"},{"line_number":102,"context_line":"            LOG.warning(\"Multiple possible iSCSI connectors, \""},{"line_number":103,"context_line":"                        \"%(iscsi_uuids_found) found, for node %(node)s. \""},{"line_number":104,"context_line":"                        \"Only the first iSCSI connector, %(iscsi_uuid)s, \""},{"line_number":105,"context_line":"                        \"will be utilized.\","},{"line_number":106,"context_line":"                        {\u0027node\u0027: node.uuid,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_93a8abdb","line":103,"in_reply_to":"ff0f0b1f_47638ddd","updated":"2017-05-19 11:13:44.000000000","message":"Awesome catch!","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b54aedba86f73173d1e89fde3ea6644addc2135c","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":212,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":213,"context_line":"        # boot capability is defined."},{"line_number":214,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":215,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":216,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":217,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_88e1ca01","line":214,"range":{"start_line":214,"start_character":11,"end_line":214,"end_character":21},"updated":"2017-05-18 02:59:38.000000000","message":"\"is not None\" here please","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ece6dc623d30b7fe9a4e693ed95ac1a6bf3ec266","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":212,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":213,"context_line":"        # boot capability is defined."},{"line_number":214,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":215,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":216,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":217,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_d30863da","line":214,"range":{"start_line":214,"start_character":8,"end_line":214,"end_character":57},"updated":"2017-05-19 11:13:44.000000000","message":"IIRC a question was raised regarding this conditional.\n\nThe purpose is to cause a failure upon attempting to deploy, IF the node is labeled with a capability of supporting iscsi boot, the cinder driver is configured, but we have no connector information.  This DOES mean that any deploy, including a deploy attempt, if nova validates that storage interface is happy, which it presently does not but will need to, fails.  The nova patch should check validate to force rescheduling in the event that the hardware is misconfigured.\n\nTo summarize, this check is to catch misconfigurations of the node. We _may_ want to add if a target is found, but then  we only fail when attempting to deploy something with a volume, and not fail when misconfigured. I\u0027m fine either way, the only conundrum  will be re-working this entire validate because with the collection and checks for connector and targets in the same method tripped the complexity check.","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"878762ab791ce1b9d10057052a46191ecf290330","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":212,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":213,"context_line":"        # boot capability is defined."},{"line_number":214,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":215,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":216,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":217,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_276099ce","line":214,"updated":"2017-05-18 14:21:03.000000000","message":"neither iscsi_boot not found_types[..] can be done IIUC","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"abf1451cd319c934eb8403664131fccbcd706d1d","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # Validate capability configuration against configured volumes"},{"line_number":212,"context_line":"        # such that we raise errors for missing connectors if the"},{"line_number":213,"context_line":"        # boot capability is defined."},{"line_number":214,"context_line":"        if iscsi_boot and not found_types[\u0027iscsi_found\u0027]:"},{"line_number":215,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_ISCSI_TYPES)"},{"line_number":216,"context_line":"            msg \u003d (_(\"In order to enable the \u0027iscsi_boot\u0027 capability for \""},{"line_number":217,"context_line":"                     \"the node, an associated volume_connector type \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_5e3ecc29","line":214,"range":{"start_line":214,"start_character":11,"end_line":214,"end_character":21},"in_reply_to":"ff0f0b1f_88e1ca01","updated":"2017-05-18 05:03:00.000000000","message":"We shouldn\u0027t use \"is not None\". \u0027iscsi_boot\u0027 is always boolean. It is set above with bool_from_string().","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":22255,"name":"Tuan","email":"tuanla@vn.fujitsu.com","username":"Tuan"},"change_message_id":"b54aedba86f73173d1e89fde3ea6644addc2135c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                   {\u0027options\u0027: valid_types})"},{"line_number":220,"context_line":"            self._fail_validation(task, msg)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if fc_boot and not found_types[\u0027fc_found\u0027]:"},{"line_number":223,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_FC_TYPES)"},{"line_number":224,"context_line":"            msg \u003d (_(\"In order to enable the \u0027fibre_channel_boot\u0027 capability \""},{"line_number":225,"context_line":"                     \"for the node, an associated volume_connector type must \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_68e67619","line":222,"range":{"start_line":222,"start_character":11,"end_line":222,"end_character":18},"updated":"2017-05-18 02:59:38.000000000","message":"\"is not None\" here please","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"abf1451cd319c934eb8403664131fccbcd706d1d","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                   {\u0027options\u0027: valid_types})"},{"line_number":220,"context_line":"            self._fail_validation(task, msg)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if fc_boot and not found_types[\u0027fc_found\u0027]:"},{"line_number":223,"context_line":"            valid_types \u003d \u0027, \u0027.join(VALID_FC_TYPES)"},{"line_number":224,"context_line":"            msg \u003d (_(\"In order to enable the \u0027fibre_channel_boot\u0027 capability \""},{"line_number":225,"context_line":"                     \"for the node, an associated volume_connector type must \""}],"source_content_type":"text/x-python","patch_set":46,"id":"ff0f0b1f_3e3b1839","line":222,"range":{"start_line":222,"start_character":11,"end_line":222,"end_character":18},"in_reply_to":"ff0f0b1f_68e67619","updated":"2017-05-18 05:03:00.000000000","message":"ditto","commit_id":"bd789e7471ca7e2d10f77787917010f77eb845ba"}],"ironic/tests/unit/drivers/modules/storage/test_cinder.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":98,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":99,"context_line":"        self.assertDictEqual(expected, return_value)"},{"line_number":100,"context_line":"        self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":103,"context_line":"    def test__generate_connector_unknown_raises_excption(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_260672ce","line":100,"updated":"2017-01-11 14:56:09.000000000","message":"assertTrue(mock_log.warning.called). actually, newer mock version even have something like mock_log.warning.assert_called()","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":98,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":99,"context_line":"        self.assertDictEqual(expected, return_value)"},{"line_number":100,"context_line":"        self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":103,"context_line":"    def test__generate_connector_unknown_raises_excption(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_ac7078a5","line":100,"in_reply_to":"ba5201f7_260672ce","updated":"2017-01-11 19:19:11.000000000","message":"But called can be multiple times, this is explicitly counting.","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":183,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        valid_types \u003d list(cinder.VALID_ISCSI_TYPES).join(\u0027, \u0027)"},{"line_number":186,"context_line":"        expected_msg \u003d (\"In order to enable the iscsi_boot capabilitiy for \""},{"line_number":187,"context_line":"                        \"%(node)s, a volume_connector type must be valid for \""},{"line_number":188,"context_line":"                        \"iSCSI. Available connector types: %(options)s.\" %"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_460b76d6","line":185,"updated":"2017-01-11 14:56:09.000000000","message":"lists do not have join, it\u0027s the other way around. I suspect this test \"passes\" because the method (and a few other in this file) do not have test_ prefix ;)","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":183,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        valid_types \u003d list(cinder.VALID_ISCSI_TYPES).join(\u0027, \u0027)"},{"line_number":186,"context_line":"        expected_msg \u003d (\"In order to enable the iscsi_boot capabilitiy for \""},{"line_number":187,"context_line":"                        \"%(node)s, a volume_connector type must be valid for \""},{"line_number":188,"context_line":"                        \"iSCSI. Available connector types: %(options)s.\" %"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0c498460","line":185,"in_reply_to":"ba5201f7_460b76d6","updated":"2017-01-11 19:19:11.000000000","message":"That would do it :(","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        mock_log.assert_called_once_with(expected_msg)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":198,"context_line":"    def validate_failure_if_fc_boot_no_connectors(self, mock_log):"},{"line_number":199,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":200,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":201,"context_line":"        valid_types \u003d list(cinder.VALID_FC_TYPES).join(\u0027, \u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_660cfaec","line":198,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        mock_log.assert_called_once_with(expected_msg)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":198,"context_line":"    def validate_failure_if_fc_boot_no_connectors(self, mock_log):"},{"line_number":199,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":200,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":201,"context_line":"        valid_types \u003d list(cinder.VALID_FC_TYPES).join(\u0027, \u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_ecc28084","line":198,"in_reply_to":"ba5201f7_660cfaec","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":228,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":229,"context_line":"        mock_log.reset_mock()"},{"line_number":230,"context_line":"        mock_fail.reset_mock()"},{"line_number":231,"context_line":"        # Adding a FC connection should not cause any issues"},{"line_number":232,"context_line":"        object_utils.create_test_volume_connector("},{"line_number":233,"context_line":"            self.context, node_id\u003dself.node.id, type\u003d\u0027wwpn\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_8611de06","line":230,"updated":"2017-01-11 14:56:09.000000000","message":"nit: you don\u0027t have to reset mocks here, and they were not called anyway","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":228,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":229,"context_line":"        mock_log.reset_mock()"},{"line_number":230,"context_line":"        mock_fail.reset_mock()"},{"line_number":231,"context_line":"        # Adding a FC connection should not cause any issues"},{"line_number":232,"context_line":"        object_utils.create_test_volume_connector("},{"line_number":233,"context_line":"            self.context, node_id\u003dself.node.id, type\u003d\u0027wwpn\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0cefc4e9","line":230,"in_reply_to":"ba5201f7_8611de06","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":238,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    @mock.patch.object(cinder.CinderStorage, \u0027_fail_validate\u0027)"},{"line_number":241,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":242,"context_line":"    def test_validate_success_connectors_and_boot(self, mock_log, mock_fail):"},{"line_number":243,"context_line":"        \"\"\"Perform validate with volume connectors and boot capabilities\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_a6fa62bb","line":240,"updated":"2017-01-11 14:56:09.000000000","message":"please add autospec\u003dTrue","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":259,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    @mock.patch.object(cinder.CinderStorage, \u0027_fail_validate\u0027)"},{"line_number":262,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":263,"context_line":"    def test_validate_success_iscsi_targets(self, mock_log, mock_fail):"},{"line_number":264,"context_line":"        \"\"\"Validate success with full iscsi scenario.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_c6f766d1","line":261,"updated":"2017-01-11 14:56:09.000000000","message":"autospec\u003dTrue","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":277,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    @mock.patch.object(cinder.CinderStorage, \u0027_fail_validate\u0027)"},{"line_number":280,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":281,"context_line":"    def test_validate_success_fc_targets(self, mock_log, mock_fail):"},{"line_number":282,"context_line":"        \"\"\"Validate success with full fc scenario.\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_e600eaad","line":279,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        self.assertTrue(mock_log.error.called)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":375,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":376,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":377,"context_line":"    def test_attach_detach_volumes_no_volumes(self, mock_log,"},{"line_number":378,"context_line":"                                              mock_attach, mock_detach):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_06fecead","line":375,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        self.assertTrue(mock_log.error.called)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":375,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":376,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":377,"context_line":"    def test_attach_detach_volumes_no_volumes(self, mock_log,"},{"line_number":378,"context_line":"                                              mock_attach, mock_detach):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0c7504f9","line":375,"in_reply_to":"ba5201f7_06fecead","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":390,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":391,"context_line":"    def test_attach_detach_volumes_fails_without_connectors(self,"},{"line_number":392,"context_line":"                                                            mock_attach,"},{"line_number":393,"context_line":"                                                            mock_detach):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_262d9246","line":390,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":390,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":391,"context_line":"    def test_attach_detach_volumes_fails_without_connectors(self,"},{"line_number":392,"context_line":"                                                            mock_attach,"},{"line_number":393,"context_line":"                                                            mock_detach):"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_4c61cc38","line":390,"in_reply_to":"ba5201f7_262d9246","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            self.assertFalse(mock_detach.called)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":410,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":411,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":412,"context_line":"    def test_attach_detach_called_with_target_and_connector(self, mock_log,"},{"line_number":413,"context_line":"                                                            mock_attach,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_463296a8","line":410,"updated":"2017-01-11 14:56:09.000000000","message":"ditto","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            self.assertFalse(mock_detach.called)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":410,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":411,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":412,"context_line":"    def test_attach_detach_called_with_target_and_connector(self, mock_log,"},{"line_number":413,"context_line":"                                                            mock_attach,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_6c669052","line":410,"in_reply_to":"ba5201f7_463296a8","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            task.volume_targets[0].refresh()"},{"line_number":438,"context_line":"            self.assertEqual(expected_target_properties,"},{"line_number":439,"context_line":"                             task.volume_targets[0][\u0027properties\u0027])"},{"line_number":440,"context_line":"            mock_log.reset_mock()"},{"line_number":441,"context_line":"            self.interface.detach_volumes(task)"},{"line_number":442,"context_line":"            self.assertFalse(mock_log.called)"},{"line_number":443,"context_line":"            self.assertTrue(mock_detach.called)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_66231a59","line":440,"updated":"2017-01-11 14:56:09.000000000","message":"this seems not needed, as log was not called","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            task.volume_targets[0].refresh()"},{"line_number":438,"context_line":"            self.assertEqual(expected_target_properties,"},{"line_number":439,"context_line":"                             task.volume_targets[0][\u0027properties\u0027])"},{"line_number":440,"context_line":"            mock_log.reset_mock()"},{"line_number":441,"context_line":"            self.interface.detach_volumes(task)"},{"line_number":442,"context_line":"            self.assertFalse(mock_log.called)"},{"line_number":443,"context_line":"            self.assertTrue(mock_detach.called)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0c4c24c7","line":440,"in_reply_to":"ba5201f7_66231a59","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            self.assertTrue(mock_detach.called)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":446,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":447,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":448,"context_line":"    def test_attach_volumes_failure(self, mock_log, mock_attach, mock_detach):"},{"line_number":449,"context_line":"        \"\"\"Verify detach is called upon attachment"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_8628fe34","line":446,"updated":"2017-01-11 14:56:09.000000000","message":"autospec\u003dTrue","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            self.assertTrue(mock_detach.called)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027)"},{"line_number":446,"context_line":"    @mock.patch.object(cinder_common, \u0027attach_volumes\u0027)"},{"line_number":447,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"},{"line_number":448,"context_line":"    def test_attach_volumes_failure(self, mock_log, mock_attach, mock_detach):"},{"line_number":449,"context_line":"        \"\"\"Verify detach is called upon attachment"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_acd318d4","line":446,"in_reply_to":"ba5201f7_8628fe34","updated":"2017-01-11 19:19:11.000000000","message":"Done","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        class single_attachment(object):"},{"line_number":469,"context_line":"            def __init__(self, *args):"},{"line_number":470,"context_line":"                dict(data\u003ddict("},{"line_number":471,"context_line":"                    volume_id\u003d\u00271234\u0027,"},{"line_number":472,"context_line":"                    ironic_volume_uuid\u003d\u0027bar\u0027,"},{"line_number":473,"context_line":"                    new_property\u003d\u0027foo\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_a621824f","line":470,"updated":"2017-01-11 14:56:09.000000000","message":"this value seems unused..","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        # excpetion."},{"line_number":487,"context_line":"        mock_attach.reset_mock()"},{"line_number":488,"context_line":"        mock_detach.reset_mock()"},{"line_number":489,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":490,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":491,"context_line":"            self.assertRaises(exception.StorageError,"},{"line_number":492,"context_line":"                              self.interface.attach_volumes, task)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_c61e860b","line":489,"updated":"2017-01-11 14:56:09.000000000","message":"I don\u0027t quite understand why you can\u0027t return [None] here or something like that.. class single_attachment does not seem meaningful (and you\u0027re passing the *class* here, not its instance)","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        # excpetion."},{"line_number":487,"context_line":"        mock_attach.reset_mock()"},{"line_number":488,"context_line":"        mock_detach.reset_mock()"},{"line_number":489,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":490,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":491,"context_line":"            self.assertRaises(exception.StorageError,"},{"line_number":492,"context_line":"                              self.interface.attach_volumes, task)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_d222b2a2","line":489,"in_reply_to":"ba5201f7_c61e860b","updated":"2017-01-11 19:19:11.000000000","message":"The underlying code counts the number of attachments, and we need to use mock to return that only one attachment actually completed.  Easiest path seems to be to configure two targets in the db, and have the mock return data once called.  It might be overly complex now with the class since previously I created the class with an iterator and the items then had to be callable objects.","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            connector_id\u003d\u0027iqn.address\u0027)"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        class success(object):"},{"line_number":509,"context_line":"            True"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":512,"context_line":"            # The first attempt should exit without any issues, as success."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_e6170aec","line":509,"updated":"2017-01-11 14:56:09.000000000","message":"nit: s/True/pass/","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cc606244118034e68cb50f627522c20af28d69ae","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            connector_id\u003d\u0027iqn.address\u0027)"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        class success(object):"},{"line_number":509,"context_line":"            True"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":512,"context_line":"            # The first attempt should exit without any issues, as success."}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0c56e429","line":509,"in_reply_to":"ba5201f7_e6170aec","updated":"2017-01-11 19:19:11.000000000","message":"It should be pass, Thanks!","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"944443071b82b77c320b7b21aeff810016a35e53","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            # The second attempt, should log errors but not raise an exception."},{"line_number":521,"context_line":"            mock_detach.side_effect \u003d ["},{"line_number":522,"context_line":"                exception.StorageError(\u0027bar\u0027),"},{"line_number":523,"context_line":"                success]"},{"line_number":524,"context_line":"            self.interface.detach_volumes(task)"},{"line_number":525,"context_line":"            self.assertEqual(2, mock_detach.call_count)"},{"line_number":526,"context_line":"            self.assertTrue(mock_log.error.called)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba5201f7_0615eee3","line":523,"updated":"2017-01-11 14:56:09.000000000","message":"s/success/None/ ?","commit_id":"94854b1720a6e85920ed9510ba6710b9b921ef83"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"7a04fab92019c9711acd055f4e8125786744a385","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def test__fail_validation(self, mock_log):"},{"line_number":41,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":42,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":43,"context_line":"        \"\"\"Ensure the validate helper logs and rasies exceptions.\"\"\""},{"line_number":44,"context_line":"        fake_error \u003d \u0027a error!\u0027"},{"line_number":45,"context_line":"        expected \u003d (\"Failed to validate cinder storage_interface for \""},{"line_number":46,"context_line":"                    \"%s. a error!\" % self.node.uuid)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_17f3d60b","line":43,"range":{"start_line":43,"start_character":47,"end_line":43,"end_character":53},"updated":"2017-02-19 06:05:33.000000000","message":"raises","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"7a04fab92019c9711acd055f4e8125786744a385","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            self.assertTrue(mock_attach.called)"},{"line_number":489,"context_line":"            self.assertTrue(mock_detach.called)"},{"line_number":490,"context_line":"        # Replacing the mock to not return an error, should still raise an"},{"line_number":491,"context_line":"        # excpetion."},{"line_number":492,"context_line":"        mock_attach.reset_mock()"},{"line_number":493,"context_line":"        mock_detach.reset_mock()"},{"line_number":494,"context_line":"        mock_attach.return_value \u003d single_attachment"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_77da527a","line":491,"range":{"start_line":491,"start_character":10,"end_line":491,"end_character":19},"updated":"2017-02-19 06:05:33.000000000","message":"exception","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"7a04fab92019c9711acd055f4e8125786744a385","unresolved":false,"context_lines":[{"line_number":553,"context_line":"                              self.interface.detach_volumes,"},{"line_number":554,"context_line":"                              task)"},{"line_number":555,"context_line":"            self.assertTrue(mock_log.error.called)"},{"line_number":556,"context_line":"            self.assertEqual(2, mock_detach.call_count)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_f7ed6226","line":556,"updated":"2017-02-19 06:05:33.000000000","message":"Like I mentioned in the other patch, we can consider using ddt to cover all these test scenarios as part of the same test. Documentation for ddt is here: http://ddt.readthedocs.io/en/latest/example.html","commit_id":"e5975a4a7c19138d8a46001da6ec905f6e2e4ded"},{"author":{"_account_id":11878,"name":"Rushil Chugh","email":"rushil.chugh@gmail.com","username":"rushil"},"change_message_id":"7f9d304b291a030f8ebd9827c1842f9c1971bbfd","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.tests.unit.conductor import mgr_utils"},{"line_number":24,"context_line":"from ironic.tests.unit.db import base as db_base"},{"line_number":25,"context_line":"from ironic.tests.unit.objects import utils as object_utils"},{"line_number":26,"context_line":"from oslo_utils import uuidutils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class CinderInterfaceTestCase(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_a81bdb7e","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":32},"updated":"2017-03-28 14:11:53.000000000","message":"import statements are in the wrong order. from oslo_utils should be before ironic.tests.unit.objects. That is why pep8 is failing.","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"43ff5bd12af252c94c1077d67e3b0ef27ff3bc29","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.tests.unit.conductor import mgr_utils"},{"line_number":24,"context_line":"from ironic.tests.unit.db import base as db_base"},{"line_number":25,"context_line":"from ironic.tests.unit.objects import utils as object_utils"},{"line_number":26,"context_line":"from oslo_utils import uuidutils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class CinderInterfaceTestCase(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_5d0de5e5","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":32},"in_reply_to":"ffe62b97_a81bdb7e","updated":"2017-03-29 22:56:42.000000000","message":"This worked for me:\n\n diff --git a/ironic/tests/unit/drivers/modules/storage/test_cinder.py b/ironic/tests/unit/drivers/modules/storage/test_cinder.py\n index 4ce35de..01d66bc 100644\n --- a/ironic/tests/unit/drivers/modules/storage/test_cinder.py\n +++ b/ironic/tests/unit/drivers/modules/storage/test_cinder.py\n @@ -13,6 +13,7 @@\n  # under the License.\n\n  import mock\n +from oslo_utils import uuidutils\n\n  from ironic.common import cinder as cinder_common\n  from ironic.common import exception\n @@ -23,7 +24,6 @@ from ironic.drivers import utils as driver_utils\n  from ironic.tests.unit.conductor import mgr_utils\n  from ironic.tests.unit.db import base as db_base\n  from ironic.tests.unit.objects import utils as object_utils\n -from oslo_utils import uuidutils\n\n\n  class CinderInterfaceTestCase(db_base.DbTestCase):","commit_id":"a2b0e8243054283f614973255754fd6ffda416f0"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":102,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":103,"context_line":"        self.assertDictEqual(expected, return_value)"},{"line_number":104,"context_line":"        self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":107,"context_line":"    def test__generate_connector_unknown_raises_excption(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_db7d486f","line":104,"range":{"start_line":104,"start_character":8,"end_line":104,"end_character":56},"updated":"2017-05-04 22:14:40.000000000","message":"May be check the exact warning message with assertRaisesRegex()? as user gets to know what is unsupported, wdyt? Also I think a there should be a check for StorageError in case of unsupported type is passed","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":102,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":103,"context_line":"        self.assertDictEqual(expected, return_value)"},{"line_number":104,"context_line":"        self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":107,"context_line":"    def test__generate_connector_unknown_raises_excption(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_b8cd7767","line":104,"range":{"start_line":104,"start_character":8,"end_line":104,"end_character":56},"in_reply_to":"3f044301_db7d486f","updated":"2017-05-10 21:45:42.000000000","message":"Not sure I agree with the Regex. It\u0027s the only warning in the function. We just want to assure that the warning was done. Let me know what you think.\n\nI may be misunderstanding, but a StorageError should not be raised here. We only raise a StorageError if no valid connectors are provided. In this test, we have a valid one (iSCSI).","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            \u0027host\u0027: self.node.uuid}"},{"line_number":129,"context_line":"        object_utils.create_test_volume_connector("},{"line_number":130,"context_line":"            self.context, node_id\u003dself.node.id, type\u003d\u0027iqn\u0027,"},{"line_number":131,"context_line":"            connector_id\u003d\u0027iqn.address\u0027, uuid\u003duuidutils.generate_uuid())"},{"line_number":132,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":133,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":134,"context_line":"        self.assertDictEqual(expected, return_value)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_bbd03c52","line":131,"range":{"start_line":131,"start_character":40,"end_line":131,"end_character":70},"updated":"2017-05-04 22:14:40.000000000","message":"is this required? We can use the default one, right?","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            \u0027host\u0027: self.node.uuid}"},{"line_number":129,"context_line":"        object_utils.create_test_volume_connector("},{"line_number":130,"context_line":"            self.context, node_id\u003dself.node.id, type\u003d\u0027iqn\u0027,"},{"line_number":131,"context_line":"            connector_id\u003d\u0027iqn.address\u0027, uuid\u003duuidutils.generate_uuid())"},{"line_number":132,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":133,"context_line":"            return_value \u003d self.interface._generate_connector(task)"},{"line_number":134,"context_line":"        self.assertDictEqual(expected, return_value)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_789c8f69","line":131,"range":{"start_line":131,"start_character":40,"end_line":131,"end_character":70},"in_reply_to":"3f044301_bbd03c52","updated":"2017-05-10 21:45:42.000000000","message":"Good catch, it\u0027s not required in this case. Removed","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":19593,"name":"Anup Navare","email":"anup.d.navare@intel.com","username":"anup"},"change_message_id":"c4a13ff1b0e60e044bdf7ee9cead862c2aebc4fd","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":184,"context_line":"    def test_validate_failure_if_iscsi_boot_no_connectors(self, mock_log):"},{"line_number":185,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":186,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_dbb1c8e3","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":58},"updated":"2017-05-04 22:14:40.000000000","message":"Please add a check if ipxe is not enabled.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"e5a225f350e1370dfcf0e3e0820dd4e02caf7794","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027, autospec\u003dTrue)"},{"line_number":184,"context_line":"    def test_validate_failure_if_iscsi_boot_no_connectors(self, mock_log):"},{"line_number":185,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"},{"line_number":186,"context_line":"                                                  storage_interface\u003d\u0027cinder\u0027)"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3f044301_f832df5d","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":58},"in_reply_to":"3f044301_dbb1c8e3","updated":"2017-05-10 21:45:42.000000000","message":"This test exists already:\n\ntest_validate_fails_with_ipxe_not_enabled\n\nLet me know if this doesn\u0027t meet the need.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            self.interface.validate(task)"},{"line_number":235,"context_line":"        self.assertFalse(mock_log.called)"},{"line_number":236,"context_line":"        self.assertFalse(mock_fail.called)"},{"line_number":237,"context_line":"        # Adding a FC connection should not cause any issues"},{"line_number":238,"context_line":"        object_utils.create_test_volume_connector("},{"line_number":239,"context_line":"            self.context, node_id\u003dself.node.id, type\u003d\u0027wwpn\u0027,"},{"line_number":240,"context_line":"            connector_id\u003d\u0027wwpn.address\u0027, uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_92b665fa","line":237,"updated":"2017-05-16 17:14:27.000000000","message":"this looks like two independent tests","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        Volume attachment attempts detachment if the attachment fails"},{"line_number":469,"context_line":"        or if the number of attachments completed does not match the"},{"line_number":470,"context_line":"        number of configured targets."},{"line_number":471,"context_line":"        \"\"\""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_72b999e7","line":470,"updated":"2017-05-16 17:14:27.000000000","message":"this has to be 2 tests, not one","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        Volume attachment attempts detachment if the attachment fails"},{"line_number":469,"context_line":"        or if the number of attachments completed does not match the"},{"line_number":470,"context_line":"        number of configured targets."},{"line_number":471,"context_line":"        \"\"\""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        self.node \u003d object_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_b18e442c","line":470,"in_reply_to":"1f013ff3_72b999e7","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":487,"context_line":"                dict(data\u003ddict("},{"line_number":488,"context_line":"                    volume_id\u003d\u00271234\u0027,"},{"line_number":489,"context_line":"                    ironic_volume_uuid\u003d\u0027bar\u0027,"},{"line_number":490,"context_line":"                    new_property\u003d\u0027foo\u0027))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"            def __len__(self):"},{"line_number":493,"context_line":"                return 1"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_52d0dd1f","line":490,"updated":"2017-05-16 17:14:27.000000000","message":"this value is not used anywhere","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":487,"context_line":"                dict(data\u003ddict("},{"line_number":488,"context_line":"                    volume_id\u003d\u00271234\u0027,"},{"line_number":489,"context_line":"                    ironic_volume_uuid\u003d\u0027bar\u0027,"},{"line_number":490,"context_line":"                    new_property\u003d\u0027foo\u0027))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"            def __len__(self):"},{"line_number":493,"context_line":"                return 1"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_119e1063","line":490,"in_reply_to":"1f013ff3_52d0dd1f","updated":"2017-05-17 21:04:41.000000000","message":"I dropped this single_attachment class since it\u0027s not needed after your comment below.","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        # Replacing the mock to not return an error, should still raise an"},{"line_number":503,"context_line":"        # exception."},{"line_number":504,"context_line":"        mock_attach.reset_mock()"},{"line_number":505,"context_line":"        mock_detach.reset_mock()"},{"line_number":506,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":507,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":508,"context_line":"            self.assertRaises(exception.StorageError,"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_32cb1173","line":505,"updated":"2017-05-16 17:14:27.000000000","message":"... in 90% of cases when you have to you reset_mock, you should split the test instead","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        # Replacing the mock to not return an error, should still raise an"},{"line_number":503,"context_line":"        # exception."},{"line_number":504,"context_line":"        mock_attach.reset_mock()"},{"line_number":505,"context_line":"        mock_detach.reset_mock()"},{"line_number":506,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":507,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":508,"context_line":"            self.assertRaises(exception.StorageError,"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_91aa2083","line":505,"in_reply_to":"1f013ff3_32cb1173","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        # exception."},{"line_number":504,"context_line":"        mock_attach.reset_mock()"},{"line_number":505,"context_line":"        mock_detach.reset_mock()"},{"line_number":506,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":507,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":508,"context_line":"            self.assertRaises(exception.StorageError,"},{"line_number":509,"context_line":"                              self.interface.attach_volumes, task)"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_12ca556c","line":506,"updated":"2017-05-16 17:14:27.000000000","message":"why not use a list with one item?","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        # exception."},{"line_number":504,"context_line":"        mock_attach.reset_mock()"},{"line_number":505,"context_line":"        mock_detach.reset_mock()"},{"line_number":506,"context_line":"        mock_attach.return_value \u003d single_attachment"},{"line_number":507,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":508,"context_line":"            self.assertRaises(exception.StorageError,"},{"line_number":509,"context_line":"                              self.interface.attach_volumes, task)"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_51c5a88d","line":506,"in_reply_to":"1f013ff3_12ca556c","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            connector_id\u003d\u0027iqn.address\u0027)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        class success(object):"},{"line_number":526,"context_line":"            pass"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":529,"context_line":"            # The first attempt should exit without any issues, as success."}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_f2c48961","line":526,"updated":"2017-05-16 17:14:27.000000000","message":"this is not needed, just return None","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            connector_id\u003d\u0027iqn.address\u0027)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        class success(object):"},{"line_number":526,"context_line":"            pass"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        with task_manager.acquire(self.context, self.node.id) as task:"},{"line_number":529,"context_line":"            # The first attempt should exit without any issues, as success."}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_dc730f4d","line":526,"in_reply_to":"1f013ff3_f2c48961","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            self.assertEqual(1, mock_detach.call_count)"},{"line_number":533,"context_line":"            mock_detach.reset_mock()"},{"line_number":534,"context_line":"            self.assertFalse(mock_log.called)"},{"line_number":535,"context_line":"            mock_log.reset_mock()"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"            # The third attempt, should log errors but not raise an exception."},{"line_number":538,"context_line":"            mock_detach.side_effect \u003d ["}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_d2a18dab","line":535,"updated":"2017-05-16 17:14:27.000000000","message":"all this is not needed - see below","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            self.assertEqual(1, mock_detach.call_count)"},{"line_number":533,"context_line":"            mock_detach.reset_mock()"},{"line_number":534,"context_line":"            self.assertFalse(mock_log.called)"},{"line_number":535,"context_line":"            mock_log.reset_mock()"},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"            # The third attempt, should log errors but not raise an exception."},{"line_number":538,"context_line":"            mock_detach.side_effect \u003d ["}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_1c7aa723","line":535,"in_reply_to":"1f013ff3_d2a18dab","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            # The third attempt, should log errors but not raise an exception."},{"line_number":538,"context_line":"            mock_detach.side_effect \u003d ["},{"line_number":539,"context_line":"                exception.StorageError(\u0027bar\u0027),"},{"line_number":540,"context_line":"                success]"},{"line_number":541,"context_line":"            task.node.provision_state \u003d states.DELETED"},{"line_number":542,"context_line":"            self.interface.detach_volumes(task)"},{"line_number":543,"context_line":"            self.assertEqual(2, mock_detach.call_count)"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_b2a4c1ba","line":540,"updated":"2017-05-16 17:14:27.000000000","message":"just replace it with [None, exceptions.StorageError(\u0027bar\u0027), None], and you\u0027ll cover the case above (also no need for \"success\")","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            # The third attempt, should log errors but not raise an exception."},{"line_number":538,"context_line":"            mock_detach.side_effect \u003d ["},{"line_number":539,"context_line":"                exception.StorageError(\u0027bar\u0027),"},{"line_number":540,"context_line":"                success]"},{"line_number":541,"context_line":"            task.node.provision_state \u003d states.DELETED"},{"line_number":542,"context_line":"            self.interface.detach_volumes(task)"},{"line_number":543,"context_line":"            self.assertEqual(2, mock_detach.call_count)"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_9c8eb72c","line":540,"in_reply_to":"1f013ff3_b2a4c1ba","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"edffaf123a02ce727d57d478cdd33957dba71dd7","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            self.assertEqual(2, mock_detach.call_count)"},{"line_number":544,"context_line":"            self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":545,"context_line":"            mock_detach.reset_mock()"},{"line_number":546,"context_line":"            mock_log.reset_mock()"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027, autospec\u003dTrue)"},{"line_number":549,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"1f013ff3_92ab0588","line":546,"updated":"2017-05-16 17:14:27.000000000","message":"resets in the ends of the test are essentially noop","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"a57ec261a65a4d057b303ca9e01e3860c43f9fcb","unresolved":false,"context_lines":[{"line_number":543,"context_line":"            self.assertEqual(2, mock_detach.call_count)"},{"line_number":544,"context_line":"            self.assertEqual(1, mock_log.warning.call_count)"},{"line_number":545,"context_line":"            mock_detach.reset_mock()"},{"line_number":546,"context_line":"            mock_log.reset_mock()"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    @mock.patch.object(cinder_common, \u0027detach_volumes\u0027, autospec\u003dTrue)"},{"line_number":549,"context_line":"    @mock.patch.object(cinder, \u0027LOG\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"ff0f0b1f_4ecf457f","line":546,"in_reply_to":"1f013ff3_92ab0588","updated":"2017-05-17 21:04:41.000000000","message":"Done","commit_id":"6fc601d68b1e79975fd47b4818d373ca964da154"}],"setup.cfg":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9733b2e8b1af51a34d09618c010a06ec2a7d9b3f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"ironic.hardware.interfaces.storage \u003d"},{"line_number":133,"context_line":"    fake \u003d ironic.drivers.modules.fake:FakeStorage"},{"line_number":134,"context_line":"    noop \u003d ironic.drivers.modules.storage.noop:NoopStorage"},{"line_number":135,"context_line":"    cinder \u003d ironic.drivers.modules.storage.cinder:CinderStorage"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"ironic.hardware.interfaces.vendor \u003d"},{"line_number":138,"context_line":"    fake \u003d ironic.drivers.modules.fake:FakeVendorB"}],"source_content_type":"text/x-ttcn-cfg","patch_set":40,"id":"3f044301_913a1ce5","line":135,"updated":"2017-05-04 09:12:04.000000000","message":"I don\u0027t even think we need to do this, as the storage interface is still not usable at this point.","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"abc3b1c3cd18f2fbfbd90c1ded38cc345a443813","unresolved":false,"context_lines":[{"line_number":132,"context_line":"ironic.hardware.interfaces.storage \u003d"},{"line_number":133,"context_line":"    fake \u003d ironic.drivers.modules.fake:FakeStorage"},{"line_number":134,"context_line":"    noop \u003d ironic.drivers.modules.storage.noop:NoopStorage"},{"line_number":135,"context_line":"    cinder \u003d ironic.drivers.modules.storage.cinder:CinderStorage"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"ironic.hardware.interfaces.vendor \u003d"},{"line_number":138,"context_line":"    fake \u003d ironic.drivers.modules.fake:FakeVendorB"}],"source_content_type":"text/x-ttcn-cfg","patch_set":40,"id":"3f044301_7d452170","line":135,"in_reply_to":"3f044301_913a1ce5","updated":"2017-05-04 11:14:02.000000000","message":"Needed for unit tests","commit_id":"939ec117e0ad72522437999cbe9c1b2efc3485b3"}]}
