)]}'
{"/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":"87bbcb49d1fd30aa464ad1eb34241a9274dd211e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Co-Authored-By: Hironori Shiina \u003cshiina.hironori@jp.fujitsu.com\u003e"},{"line_number":21,"context_line":"Change-Id: I319779af265684715f0142577a217ab66632bf4f"},{"line_number":22,"context_line":"Implements: blueprint ironic-boot-from-volume"},{"line_number":23,"context_line":"Depends-On: I328a698f2109841e1e122e17fea4b345c4179161"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7a3c09a3_3fd4be45","line":23,"updated":"2017-01-16 16:34:45.000000000","message":"Realistically, the depends-on is incorrect as that is just the API endpoint and updates to the ironic client library will be needed for this for volume connection and target support:  The change-id\u0027s below are also dependent upon the ironic API change which is noted in this revision.\n\nI328a698f2109841e1e122e17fea4b345c4179161 and I485595b081b2c1c9f9bdf55382d06dd275784fad","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"}],"doc/source/support-matrix.ini":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"24bc7dade6530e70ced1075012ea81a66f30a188","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1031,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1033,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_e8394441","line":1030,"range":{"start_line":1030,"start_character":19,"end_line":1030,"end_character":26},"updated":"2017-07-13 14:37:56.000000000","message":"Part of me wonders if we should be marking this partial.  Our framework is built too support it, we just don\u0027t yet have validation and skip logic built around FC, but that will quietly appear in ironic in the future. With OOB storage fabrics, the data and configuration really should be there for it to work, as long as the nodes do not network boot first.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1031,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1033,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_b5456fb6","line":1030,"range":{"start_line":1030,"start_character":19,"end_line":1030,"end_character":26},"in_reply_to":"1f1a1f67_7c346993","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"30fb418fe687a6012c977360cbc4341182102589","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1031,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1033,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_7c346993","line":1030,"range":{"start_line":1030,"start_character":19,"end_line":1030,"end_character":26},"in_reply_to":"1f1a1f67_e8394441","updated":"2017-07-18 00:04:37.000000000","message":"You could set it to \u0027partial\u0027 and then use driver-notes-ironic to specify notes for the specific function in the specific driver, like notes about limitations.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ba55214fd4366b9d1b082610ddeb49c7a84bdb6d","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1075,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1076,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1077,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1078,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1079,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1080,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_68062bd1","line":1077,"range":{"start_line":1077,"start_character":19,"end_line":1077,"end_character":26},"updated":"2017-07-14 14:16:57.000000000","message":"I thought we support some authentication.. or is it non CHAP?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4f4a566342d95f9e0948fa4d4fed1cd6d064813","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1075,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1076,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1077,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1078,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1079,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1080,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_d379702f","line":1077,"range":{"start_line":1077,"start_character":19,"end_line":1077,"end_character":26},"in_reply_to":"1f1a1f67_68062bd1","updated":"2017-07-14 14:48:38.000000000","message":"If memory serves, we do store and pass it along... Truthfully in the most generic sense, it is iPXE\u0027s support of chap until we have a hardware vendor land support for one of their drivers.  Luckily, we already have one in queue :)","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"driver-impl-libvirt-xen\u003dcomplete"},{"line_number":1075,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1076,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1077,"context_line":"driver-impl-ironic\u003dmissing"},{"line_number":1078,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1079,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1080,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":21,"id":"1f1a1f67_7507d783","line":1077,"range":{"start_line":1077,"start_character":19,"end_line":1077,"end_character":26},"in_reply_to":"1f1a1f67_d379702f","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d598653571e8778ecdc625f091e6ad06b4f6e56","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":22,"id":"1f1a1f67_3814aa43","line":1031,"range":{"start_line":1031,"start_character":31,"end_line":1031,"end_character":47},"updated":"2017-07-18 12:11:01.000000000","message":"nit: I would say \"hardware and hardware driver support\"","commit_id":"3d5904f3402590616d7de41c62bfc1939e5b8983"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a92d8f9a1354533aa4ad530a3b4575e37ed532d1","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":23,"id":"1f1a1f67_4b7aedb9","line":1031,"range":{"start_line":1031,"start_character":20,"end_line":1031,"end_character":47},"updated":"2017-07-18 15:26:15.000000000","message":"Is there somewhere someone can find out what the hardware or config requirements are for using this?","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"26494dfa379a69b670cc74b5427eaaf4783fb90f","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":23,"id":"1f1a1f67_7a3c362e","line":1031,"range":{"start_line":1031,"start_character":20,"end_line":1031,"end_character":47},"in_reply_to":"1f1a1f67_174e4237","updated":"2017-07-19 07:34:46.000000000","message":"We can only be sure about in-tree drivers :) But I think you\u0027re right, FC is not supported yet by our drivers, only iSCSI.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f219f4af3304383bd2fad7aedc5a2296577e67de","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":23,"id":"1f1a1f67_b180d0f6","line":1031,"range":{"start_line":1031,"start_character":20,"end_line":1031,"end_character":47},"in_reply_to":"1f1a1f67_4b7aedb9","updated":"2017-07-18 15:43:08.000000000","message":"Not yet, one of the the drivers has proposed a change that would include this functionality, but functionally this blocks that in the grand scheme of things.  Well this patch, we can always go back and amend the matrix later.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"26f67d250c9be61bffabc405fab31d72edf87199","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":23,"id":"1f1a1f67_82b0bbde","line":1031,"range":{"start_line":1031,"start_character":20,"end_line":1031,"end_character":47},"in_reply_to":"1f1a1f67_7a3c362e","updated":"2017-07-19 16:13:17.000000000","message":"Per discussion in #openstack-nova with Matt, I\u0027m removing the FC note.  We can always add it back later once we have support for FC in drivers and everything documented for that.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7ab0d7ce5517ec5b2dfdfde4b2887039d96af006","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"driver-impl-vmware\u003dmissing"},{"line_number":1029,"context_line":"driver-impl-hyperv\u003dcomplete"},{"line_number":1030,"context_line":"driver-impl-ironic\u003dpartial"},{"line_number":1031,"context_line":"driver-notes-ironic\u003ddepends on hardware support"},{"line_number":1032,"context_line":"driver-impl-libvirt-vz-vm\u003dcomplete"},{"line_number":1033,"context_line":"driver-impl-libvirt-vz-ct\u003dmissing"},{"line_number":1034,"context_line":"driver-impl-powervm\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":23,"id":"1f1a1f67_174e4237","line":1031,"range":{"start_line":1031,"start_character":20,"end_line":1031,"end_character":47},"in_reply_to":"1f1a1f67_b180d0f6","updated":"2017-07-19 02:42:53.000000000","message":"\u003e Not yet, one of the the drivers has proposed a change that would include this functionality\n\nWait, so there are no drivers in Ironic today that can actually do this thing?","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"}],"nova/tests/unit/virt/ironic/test_client_wrapper.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"1125a118c9eafede3f0d9da60b094040c8a4636f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        expected \u003d {\u0027session\u0027: \u0027session\u0027,"},{"line_number":73,"context_line":"                    \u0027max_retries\u0027: CONF.ironic.api_max_retries,"},{"line_number":74,"context_line":"                    \u0027retry_interval\u0027: CONF.ironic.api_retry_interval,"},{"line_number":75,"context_line":"                    \u0027os_ironic_api_version\u0027: \u00271.32\u0027,"},{"line_number":76,"context_line":"                    \u0027ironic_url\u0027: None}"},{"line_number":77,"context_line":"        mock_ir_cli.assert_called_once_with(1, **expected)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_0ff0abfd","line":75,"updated":"2017-07-17 14:05:39.000000000","message":"is there a concern that this is going to fail if Ironic is not upgraded first?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"33c30d7585c0fd825000f1e80591eb1f4339b57a","unresolved":false,"context_lines":[{"line_number":1975,"context_line":""},{"line_number":1976,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1977,"context_line":"    def test_get_volume_connector(self, mock_node):"},{"line_number":1978,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1979,"context_line":"        node_props \u003d {\u0027cpu_arch\u0027: \u0027x86_64\u0027}"},{"line_number":1980,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid,"},{"line_number":1981,"context_line":"                                          properties\u003dnode_props)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_69ad4630","line":1978,"updated":"2017-07-10 11:56:59.000000000","message":"I guess this is in keeping with the rest of the file, but a uuidsentinel here would be nice/normal?","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":1975,"context_line":""},{"line_number":1976,"context_line":"    @mock.patch.object(FAKE_CLIENT, \u0027node\u0027)"},{"line_number":1977,"context_line":"    def test_get_volume_connector(self, mock_node):"},{"line_number":1978,"context_line":"        node_uuid \u003d \u0027aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027"},{"line_number":1979,"context_line":"        node_props \u003d {\u0027cpu_arch\u0027: \u0027x86_64\u0027}"},{"line_number":1980,"context_line":"        node \u003d ironic_utils.get_test_node(uuid\u003dnode_uuid,"},{"line_number":1981,"context_line":"                                          properties\u003dnode_props)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_39a9c0dc","line":1978,"in_reply_to":"3f1d235d_69ad4630","updated":"2017-07-11 07:43:37.000000000","message":"Done","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6a7f0abbbc8b568f22180af2b5182f54a5e11f74","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        self._test_remove_instance_info_from_node(mock_update)"},{"line_number":1127,"context_line":""},{"line_number":1128,"context_line":"    def _create_fake_block_device_info(self):"},{"line_number":1129,"context_line":"        bdm_dict \u003d block_device.BlockDeviceDict({"},{"line_number":1130,"context_line":"            \u0027id\u0027: 1, \u0027instance_uuid\u0027: uuids.instance,"},{"line_number":1131,"context_line":"            \u0027device_name\u0027: \u0027/dev/sda\u0027,"},{"line_number":1132,"context_line":"            \u0027source_type\u0027: \u0027volume\u0027,"},{"line_number":1133,"context_line":"            \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":1134,"context_line":"            \u0027connection_info\u0027:"},{"line_number":1135,"context_line":"            \u0027{\"data\":\"fake_data\",\\"},{"line_number":1136,"context_line":"              \"driver_volume_type\":\"fake_type\"}\u0027,"},{"line_number":1137,"context_line":"            \u0027boot_index\u0027: 0,"},{"line_number":1138,"context_line":"            \u0027destination_type\u0027: \u0027volume\u0027"},{"line_number":1139,"context_line":"        })"},{"line_number":1140,"context_line":"        driver_bdm \u003d driver_block_device.DriverVolumeBlockDevice("},{"line_number":1141,"context_line":"            fake_block_device.fake_bdm_object(self.ctx, bdm_dict))"},{"line_number":1142,"context_line":"        return {"},{"line_number":1143,"context_line":"            \u0027block_device_mapping\u0027: [driver_bdm]"},{"line_number":1144,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":30,"id":"ff346bd7_ec3ed927","line":1141,"range":{"start_line":1129,"start_character":8,"end_line":1141,"end_character":66},"updated":"2017-07-25 12:56:59.000000000","message":"nice - you\u0027ve managed to wrangle the bdm turducken","commit_id":"3e1a3c9f82089b6b37605fcf88bb685625f8632f"}],"nova/tests/unit/virt/ironic/utils.py":[{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"0bb01c64a4696855d4f378279697927d30650249","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return type(\u0027volume_target\u0027, (object,),"},{"line_number":95,"context_line":"                {\u0027uuid\u0027: kw.get(\u0027uuid\u0027, \u0027aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\u0027),"},{"line_number":96,"context_line":"                 \u0027node_uuid\u0027: kw.get(\u0027node_uuid\u0027, get_test_node().uuid),"},{"line_number":97,"context_line":"                 \u0027drivert_volume_type\u0027: kw.get(\u0027driver_volume_type\u0027, \u0027iscsi\u0027),"},{"line_number":98,"context_line":"                 \u0027target_properties\u0027: kw.get(\u0027target_properties\u0027, {}),"},{"line_number":99,"context_line":"                 \u0027boot_index\u0027: kw.get(\u0027boot_index\u0027, 0),"},{"line_number":100,"context_line":"                 \u0027extra\u0027: kw.get(\u0027extra\u0027, {}),"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_91ba4409","line":97,"range":{"start_line":97,"start_character":18,"end_line":97,"end_character":25},"updated":"2016-05-24 10:41:06.000000000","message":"(nit) s/drivert/driver/","commit_id":"91ea5d47296c7f3a35dd8d10c6465c919a873580"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"54013a09cd26d93f878932726b0e452c865a94e7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                \u0027deploy\u0027: kw.get(\u0027deploy\u0027, {\u0027result\u0027: True}),"},{"line_number":24,"context_line":"                \u0027console\u0027: kw.get(\u0027console\u0027, True),"},{"line_number":25,"context_line":"                \u0027rescue\u0027: kw.get(\u0027rescue\u0027, True),"},{"line_number":26,"context_line":"                \u0027storage\u0027: kw.get(\u0027storage\u0027, True)})()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def get_test_node(**kw):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_ab211950","line":26,"updated":"2017-04-06 07:51:21.000000000","message":"it should be:  \u0027storage\u0027: kw.get(\u0027storage\u0027, {\u0027result\u0027: True})})()","commit_id":"05064566cc2b62144562fe69346357be4466d469"}],"nova/virt/driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3946a8bd01c3a46c52c44c6688728c2270b00ba7","unresolved":false,"context_lines":[{"line_number":481,"context_line":"    def prepare_networks_before_block_device_mapping(self, network_info):"},{"line_number":482,"context_line":"        \"\"\"Prepare networks before the block devices are mapped to instance."},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        Drivers who need network information for block device prepareaion can"},{"line_number":485,"context_line":"        ensure network async call is done by calling network_info.wait()."},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :param network_info: instance network information"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a629dbe_062484ad","line":484,"updated":"2016-11-13 17:13:54.000000000","message":"s/prepareaion/preparation/","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3946a8bd01c3a46c52c44c6688728c2270b00ba7","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :param network_info: instance network information"},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        pass"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def attach_interface(self, instance, image_meta, vif):"},{"line_number":492,"context_line":"        \"\"\"Use hotplug to add a network interface to a running instance."}],"source_content_type":"text/x-python","patch_set":8,"id":"9a629dbe_863094ea","line":489,"updated":"2016-11-13 17:13:54.000000000","message":"As I think I mentioned in a previous review, I don\u0027t understand why there needs to be a new top-level virt driver API call for this. The Ironic virt driver can simply grab a network_info object and call wait() on it itself. I don\u0027t see a reason to add another only-for-Ironic virt driver call here.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"52404f70fb973e1f77777d853f9543828e905db7","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        :param network_info: instance network information"},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        pass"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def attach_interface(self, instance, image_meta, vif):"},{"line_number":492,"context_line":"        \"\"\"Use hotplug to add a network interface to a running instance."}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_d03bbacf","line":489,"in_reply_to":"9a629dbe_863094ea","updated":"2016-11-17 04:25:05.000000000","message":"Network_info cached in instance doesn\u0027t have wait() method. We need network_info wrapped by NetworkInfoAsyncWrapper, which has wait() method. Then, we passes the network_info via driver API from compute manager.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"c0426ab3325efb45889163e8c0365d56ffab42c6","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        :param nova.network.model.NetworkInfoAsyncWrapper network_info:"},{"line_number":491,"context_line":"            The network information of the given `instance`."},{"line_number":492,"context_line":"        \"\"\""},{"line_number":493,"context_line":"        pass"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def clean_networks_for_block_device_mapping_failure(self, instance,"},{"line_number":496,"context_line":"                                                        network_info):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffe62b97_9850020d","line":493,"range":{"start_line":493,"start_character":8,"end_line":493,"end_character":12},"updated":"2017-03-30 13:13:49.000000000","message":"I think this should instead raise a NotImplementedError","commit_id":"05064566cc2b62144562fe69346357be4466d469"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"2401316dce8323f5f1a4842255a0636158531888","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        :param nova.network.model.NetworkInfoAsyncWrapper network_info:"},{"line_number":491,"context_line":"            The network information of the given `instance`."},{"line_number":492,"context_line":"        \"\"\""},{"line_number":493,"context_line":"        pass"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def clean_networks_for_block_device_mapping_failure(self, instance,"},{"line_number":496,"context_line":"                                                        network_info):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5ff73747_c0a64554","line":493,"range":{"start_line":493,"start_character":8,"end_line":493,"end_character":12},"in_reply_to":"bff0334d_de89c026","updated":"2017-04-26 00:58:15.000000000","message":"Thanks Hironori,\n\nMakes sense. Removing my -1","commit_id":"05064566cc2b62144562fe69346357be4466d469"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"840b795a6029cae15aad0b2123009c13c6a4cb3a","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        :param nova.network.model.NetworkInfoAsyncWrapper network_info:"},{"line_number":491,"context_line":"            The network information of the given `instance`."},{"line_number":492,"context_line":"        \"\"\""},{"line_number":493,"context_line":"        pass"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def clean_networks_for_block_device_mapping_failure(self, instance,"},{"line_number":496,"context_line":"                                                        network_info):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_de89c026","line":493,"range":{"start_line":493,"start_character":8,"end_line":493,"end_character":12},"in_reply_to":"ffe62b97_9850020d","updated":"2017-04-06 03:09:53.000000000","message":"This method is always called in creating an instance. It shouldn\u0027t raise an exception if not implemented. Only a driver which needs preparation should implement it.","commit_id":"05064566cc2b62144562fe69346357be4466d469"},{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"c0426ab3325efb45889163e8c0365d56ffab42c6","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        :param nova.network.model.NetworkInfoAsyncWrapper network_info:"},{"line_number":505,"context_line":"            The network information of the given `instance`."},{"line_number":506,"context_line":"        \"\"\""},{"line_number":507,"context_line":"        pass"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def attach_interface(self, context, instance, image_meta, vif):"},{"line_number":510,"context_line":"        \"\"\"Use hotplug to add a network interface to a running instance."}],"source_content_type":"text/x-python","patch_set":11,"id":"ffe62b97_b84bc65d","line":507,"range":{"start_line":507,"start_character":8,"end_line":507,"end_character":12},"updated":"2017-03-30 13:13:49.000000000","message":"ditto","commit_id":"05064566cc2b62144562fe69346357be4466d469"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"1125a118c9eafede3f0d9da60b094040c8a4636f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# The API version required by the Ironic driver"},{"line_number":33,"context_line":"IRONIC_API_VERSION \u003d (1, 32)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_4fba230a","line":33,"updated":"2017-07-17 14:05:39.000000000","message":"this is a Pike version of Ironic, which means Ironic has to get upgraded first, and Nova stops working with Ironic Ocata. Is that a concern (I think it is). Is it possible to handle both the 29 and 32 cases for Pike, and drop 29 support in Queens?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f625c4e737c3bbcee5b0afddb58016a886eab039","unresolved":false,"context_lines":[{"line_number":30,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# The API version required by the Ironic driver"},{"line_number":33,"context_line":"IRONIC_API_VERSION \u003d (1, 32)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_af4097a6","line":33,"in_reply_to":"1f1a1f67_4fba230a","updated":"2017-07-17 14:14:41.000000000","message":"To be honest, we have done it for quite some time. We even document that ironic upgrade has to go first: https://docs.openstack.org/ironic/latest/admin/upgrade-guide.html#plan-your-upgrade (third point).\n\nAnd I need to admit, we have never dealt well with the API microversion negotiation, so your request may require reworking ironicclient...\n\nWell, may a try..except around creating the client is enough. I\u0027m not sure if we check the version at once, or only on the first request.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"91f141fa556f63622ef6bd46e3cfc6d9ea4c9c61","unresolved":false,"context_lines":[{"line_number":30,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# The API version required by the Ironic driver"},{"line_number":33,"context_line":"IRONIC_API_VERSION \u003d (1, 32)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_f43d3fdd","line":33,"in_reply_to":"1f1a1f67_5ec9b223","updated":"2017-07-17 16:20:56.000000000","message":"So, if so, this also requires upgrade stanza with some very clear wording that \"your system will break if you don\u0027t upgrade ironic first\". This isn\u0027t just new things don\u0027t work, it\u0027s going to send a microversion that generates a 400 on all the calls.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e3fd4f49ff855e0ea9651992ff310b33df8cb749","unresolved":false,"context_lines":[{"line_number":30,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# The API version required by the Ironic driver"},{"line_number":33,"context_line":"IRONIC_API_VERSION \u003d (1, 32)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_5ec9b223","line":33,"in_reply_to":"1f1a1f67_af4097a6","updated":"2017-07-17 15:10:29.000000000","message":"Realistically, a try/except sort of logic would be the only way at this time with the way the client library works. It could be initialized, checked, fallback possibly, although I\u0027m not sure we even raise the usable version to an api user.\n\nAlternatively, we could just let it negotiate latest and put try/except logic around newer features being leveraged and have fall-back code.\n\nI was under the impression that we have had buy-in for a while on upgrading ironic first. Supporting older ironic with newer nova just seems like a headache for any new feature being supported because of the micro-version pin.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"ecbae3cad9cce25add8f5a6763a635b513197e7f","unresolved":false,"context_lines":[{"line_number":721,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":722,"context_line":"            context, instance.uuid)"},{"line_number":723,"context_line":"        target_info \u003d [jsonutils.loads(bdm.connection_info) for bdm in bdms"},{"line_number":724,"context_line":"                       if bdm.get(\u0027volume_id\u0027)] or None"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"        self._add_driver_fields(node, instance, image_meta, flavor,"},{"line_number":727,"context_line":"                                target_info\u003dtarget_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_479f8e03","line":724,"updated":"2015-11-09 09:29:29.000000000","message":"Needs boot_index field.","commit_id":"d2ea296dbf1ba26e972bac30db1759e6aa851481"},{"author":{"_account_id":9066,"name":"Satoru Moriya","email":"satoru.moriya.br@hitachi.com","username":"satoru-moriya-br"},"change_message_id":"cfb606928fe441688d8f6163d101115bf71c733a","unresolved":false,"context_lines":[{"line_number":721,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":722,"context_line":"            context, instance.uuid)"},{"line_number":723,"context_line":"        target_info \u003d [jsonutils.loads(bdm.connection_info) for bdm in bdms"},{"line_number":724,"context_line":"                       if bdm.get(\u0027volume_id\u0027)] or None"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"        self._add_driver_fields(node, instance, image_meta, flavor,"},{"line_number":727,"context_line":"                                target_info\u003dtarget_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da0c15f0_f1ff15ff","line":724,"in_reply_to":"da85f559_479f8e03","updated":"2016-03-28 04:24:47.000000000","message":"I think that boot_index may be None when the node boots from local HDD with cinder volume for data volume.","commit_id":"d2ea296dbf1ba26e972bac30db1759e6aa851481"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e32e9f70f1d4d29beeef8449a3cdd222f2cff68f","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"        if values.get(\u0027wwnn\u0027):"},{"line_number":1222,"context_line":"            props[\u0027wwnns\u0027] \u003d values[\u0027wwnn\u0027]"},{"line_number":1223,"context_line":"        props[\u0027platform\u0027] \u003d properties.get(\u0027cpu_arch\u0027)"},{"line_number":1224,"context_line":"        props[\u0027os_type\u0027] \u003d \u0027baremetal\u0027"},{"line_number":1225,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa80f949_fb92b54a","line":1224,"updated":"2015-11-04 23:26:20.000000000","message":"props[\u0027multipath\u0027] \u003d False\n\nEventually it would be nice to be able to do multipath, but for now, we should at least set the value to False.\n\nhttps://github.com/openstack/os-brick/blob/master/os_brick/initiator/connector.py#L121-L123","commit_id":"d2ea296dbf1ba26e972bac30db1759e6aa851481"},{"author":{"_account_id":9066,"name":"Satoru Moriya","email":"satoru.moriya.br@hitachi.com","username":"satoru-moriya-br"},"change_message_id":"cfb606928fe441688d8f6163d101115bf71c733a","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"        if values.get(\u0027wwnn\u0027):"},{"line_number":1222,"context_line":"            props[\u0027wwnns\u0027] \u003d values[\u0027wwnn\u0027]"},{"line_number":1223,"context_line":"        props[\u0027platform\u0027] \u003d properties.get(\u0027cpu_arch\u0027)"},{"line_number":1224,"context_line":"        props[\u0027os_type\u0027] \u003d \u0027baremetal\u0027"},{"line_number":1225,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":4,"id":"da0c15f0_ee4a9082","line":1224,"in_reply_to":"fa80f949_fb92b54a","updated":"2016-03-28 04:24:47.000000000","message":"Done","commit_id":"d2ea296dbf1ba26e972bac30db1759e6aa851481"},{"author":{"_account_id":12411,"name":"sandhya","email":"sandhya.ganapathy@hp.com","username":"sandhya"},"change_message_id":"7089fd88d521c044e7b44ae290fc5f0748a5c032","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1214,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1215,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1216,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1217,"context_line":"        values \u003d {}"},{"line_number":1218,"context_line":"        for conn in connectors:"},{"line_number":1219,"context_line":"            if not values.get(conn.type):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a18252c_b4cb191e","line":1216,"range":{"start_line":1216,"start_character":70,"end_line":1216,"end_character":71},"updated":"2016-04-12 05:41:29.000000000","message":"is the above call - ironicclient.call with list_volume_connectors implemented? If so, in which patch?\n(The ironic client side changes)\n\nSimilary ironicclient.call(list_volume_targets)","commit_id":"91ea5d47296c7f3a35dd8d10c6465c919a873580"},{"author":{"_account_id":9066,"name":"Satoru Moriya","email":"satoru.moriya.br@hitachi.com","username":"satoru-moriya-br"},"change_message_id":"8b65b22ca277f1cd0e1c9b3b96806249278801c0","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1214,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1215,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1216,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1217,"context_line":"        values \u003d {}"},{"line_number":1218,"context_line":"        for conn in connectors:"},{"line_number":1219,"context_line":"            if not values.get(conn.type):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a18252c_5402853f","line":1216,"range":{"start_line":1216,"start_character":70,"end_line":1216,"end_character":71},"in_reply_to":"5a18252c_b4cb191e","updated":"2016-04-12 05:53:47.000000000","message":"This is implemented in https://review.openstack.org/#/c/214786/\nAs for volume_targets one: https://review.openstack.org/#/c/285233/\n\nI\u0027ll add \"Depends-on\" in the commit message.","commit_id":"91ea5d47296c7f3a35dd8d10c6465c919a873580"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ea678fb80ee2902effa5913b6444a9d494af9265","unresolved":false,"context_lines":[{"line_number":1226,"context_line":"        else:"},{"line_number":1227,"context_line":"            # Set ip based on MAC address."},{"line_number":1228,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1229,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1230,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1231,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1232,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_79e0d396","line":1229,"updated":"2016-08-10 20:20:14.000000000","message":"Instead of adding a new virt driver prepare_networks_before_block_device_mapping() method that is only implemented for Ironic, why not just place the above line at the top of this method and call nw_info.wait() to ensure the communication between Neutron and Nova has completed? That way you don\u0027t have to have any affect on the other virt drivers.","commit_id":"91ea5d47296c7f3a35dd8d10c6465c919a873580"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"267ecf02a6316be44b30caebba3a9caa941ac271","unresolved":false,"context_lines":[{"line_number":1226,"context_line":"        else:"},{"line_number":1227,"context_line":"            # Set ip based on MAC address."},{"line_number":1228,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1229,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1230,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1231,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1232,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_4bdc6ce4","line":1229,"in_reply_to":"9ad45d7e_79e0d396","updated":"2016-10-12 15:07:09.000000000","message":"This nw_info is an instance of NetworkInfo which doesn\u0027t have wait() method. NetworkInfoAsyncWrapper has a wait() method.\nThanks.","commit_id":"91ea5d47296c7f3a35dd8d10c6465c919a873580"},{"author":{"_account_id":8264,"name":"Shunli Zhou","username":"ShunliZhou"},"change_message_id":"6f2b21c7de8e0b0fd27cd63dd106b35fa7d5c0e9","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            try:"},{"line_number":440,"context_line":"                self.ironicclient.call(\u0027volume_target.delete\u0027,"},{"line_number":441,"context_line":"                                       volume_target_id)"},{"line_number":442,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":443,"context_line":"                pass"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def _cleanup_deploy(self, node, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da36d5c6_7c546ffe","line":442,"range":{"start_line":442,"start_character":26,"end_line":442,"end_character":29},"updated":"2017-02-23 06:51:00.000000000","message":"If we want to ignore exception caught here, i think should catch Exception instead of just BadRequest exception. If we want to catch an exception, I think exception message should be logged.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bdc08d7044bdf0079af702d53328bf322adce0fd","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            try:"},{"line_number":440,"context_line":"                self.ironicclient.call(\u0027volume_target.delete\u0027,"},{"line_number":441,"context_line":"                                       volume_target_id)"},{"line_number":442,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":443,"context_line":"                pass"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def _cleanup_deploy(self, node, instance, network_info):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a1ff146_05742c66","line":442,"range":{"start_line":442,"start_character":26,"end_line":442,"end_character":29},"in_reply_to":"da36d5c6_7c546ffe","updated":"2017-03-16 15:02:23.000000000","message":"The storage interface in ironic may remove the volume target info prior to nova getting to it.  BadRequest would be what would be returned in that case (I think).","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"87bbcb49d1fd30aa464ad1eb34241a9274dd211e","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"        # get_volume_connector()."},{"line_number":1456,"context_line":"        network_info.wait(do_raise\u003dTrue)"},{"line_number":1457,"context_line":""},{"line_number":1458,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":1459,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1460,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1461,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_72acbea0","line":1458,"updated":"2017-01-16 16:34:45.000000000","message":"A doc string would be useful here since I\u0027m not exactly sure what this is attempting to do, nor why.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3946a8bd01c3a46c52c44c6688728c2270b00ba7","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1460,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1461,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1462,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1463,"context_line":"        values \u003d {}"},{"line_number":1464,"context_line":"        for conn in connectors:"},{"line_number":1465,"context_line":"            if not values.get(conn.type):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a629dbe_e6a310ff","line":1462,"updated":"2016-11-13 17:13:54.000000000","message":"Can we call os_brick.initiator.connector.get_connector_properties() like the libvirt driver does:\n\n1068     def get_volume_connector(self, instance):\n1069         root_helper \u003d utils.get_root_helper()\n1070         return connector.get_connector_properties(\n1071             root_helper, CONF.my_block_storage_ip,\n1072             CONF.libvirt.volume_use_multipath,\n1073             enforce_multipath\u003dTrue,\n1074             host\u003dCONF.host)\n\nOf course, CONF.my_block_storage_ip will need to instead be populated with the IP address of the SAN that is returned from the node.list_volume_connectors() ironicclient call, but I believe this property-setting logic should be in os_brick, not in the virt drivers themselves...","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"87bbcb49d1fd30aa464ad1eb34241a9274dd211e","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1460,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1461,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1462,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1463,"context_line":"        values \u003d {}"},{"line_number":1464,"context_line":"        for conn in connectors:"},{"line_number":1465,"context_line":"            if not values.get(conn.type):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_adcb2752","line":1462,"in_reply_to":"7a77a97e_4096e23f","updated":"2017-01-16 16:34:45.000000000","message":"I kind of agree that it would be good to put this sort of logic in the os_brick, as we could, although it seems like it would be a fairly specific case for ironic since we have hardware information that has to be conveyed from ironic to Cinder, alternatively we could just let Ironic do it, but It all, I just don\u0027t know what repercussions would exist then.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"52404f70fb973e1f77777d853f9543828e905db7","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1460,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1461,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1462,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1463,"context_line":"        values \u003d {}"},{"line_number":1464,"context_line":"        for conn in connectors:"},{"line_number":1465,"context_line":"            if not values.get(conn.type):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_4096e23f","line":1462,"in_reply_to":"9a629dbe_e6a310ff","updated":"2016-11-17 04:25:05.000000000","message":"Thank you for your advice. We will consider it.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"87bbcb49d1fd30aa464ad1eb34241a9274dd211e","unresolved":false,"context_lines":[{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        if values.get(\u0027ip\u0027):"},{"line_number":1471,"context_line":"            props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d values[\u0027ip\u0027][0]"},{"line_number":1472,"context_line":"        else:"},{"line_number":1473,"context_line":"            # Set ip based on MAC address."},{"line_number":1474,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1475,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1476,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1477,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1478,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"},{"line_number":1479,"context_line":"                         for ip in vif.fixed_ips()]"},{"line_number":1480,"context_line":"            fixed_ips_v4 \u003d [ip for ip in fixed_ips if ip[\u0027version\u0027] \u003d\u003d 4]"},{"line_number":1481,"context_line":"            if fixed_ips_v4:"},{"line_number":1482,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips_v4[0][\u0027address\u0027]"},{"line_number":1483,"context_line":"            elif fixed_ips:"},{"line_number":1484,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips[0][\u0027address\u0027]"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"        if values.get(\u0027iqn\u0027):"},{"line_number":1487,"context_line":"            props[\u0027initiator\u0027] \u003d values[\u0027iqn\u0027][0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_2def3788","line":1484,"range":{"start_line":1472,"start_character":0,"end_line":1484,"end_character":69},"updated":"2017-01-16 16:34:45.000000000","message":"Since the IP addressing can be dynamic by network, the addressing needs to be asserted back into ironic as a connector.  I guess we likely need to consider purging such connectors after teardown.\n\nThis info is needed for ironic to be able to cycle the connection to cinder, since Ironic can operate in a stand-alone fashion.\n\nAdditionally, ipxe which would handle the boot case such as this, as I understand it\u0027s documentation, will attempt to use whatever network interface is available to obtain the connection.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bdc08d7044bdf0079af702d53328bf322adce0fd","unresolved":false,"context_lines":[{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        if values.get(\u0027ip\u0027):"},{"line_number":1471,"context_line":"            props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d values[\u0027ip\u0027][0]"},{"line_number":1472,"context_line":"        else:"},{"line_number":1473,"context_line":"            # Set ip based on MAC address."},{"line_number":1474,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1475,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1476,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1477,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1478,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"},{"line_number":1479,"context_line":"                         for ip in vif.fixed_ips()]"},{"line_number":1480,"context_line":"            fixed_ips_v4 \u003d [ip for ip in fixed_ips if ip[\u0027version\u0027] \u003d\u003d 4]"},{"line_number":1481,"context_line":"            if fixed_ips_v4:"},{"line_number":1482,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips_v4[0][\u0027address\u0027]"},{"line_number":1483,"context_line":"            elif fixed_ips:"},{"line_number":1484,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips[0][\u0027address\u0027]"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"        if values.get(\u0027iqn\u0027):"},{"line_number":1487,"context_line":"            props[\u0027initiator\u0027] \u003d values[\u0027iqn\u0027][0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a1ff146_25e4c80b","line":1484,"range":{"start_line":1472,"start_character":0,"end_line":1484,"end_character":69},"in_reply_to":"1a430d35_408832e8","updated":"2017-03-16 15:02:23.000000000","message":"I was thinking that might be an issue.  Perhaps we just do that part in ironic? We should be able to lookup the information if not somehow already defined for the node if the network_interface in ironic !\u003d noop.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"a0c55bd8b52472afb42269f0605a4b2c0a5fe1cd","unresolved":false,"context_lines":[{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        if values.get(\u0027ip\u0027):"},{"line_number":1471,"context_line":"            props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d values[\u0027ip\u0027][0]"},{"line_number":1472,"context_line":"        else:"},{"line_number":1473,"context_line":"            # Set ip based on MAC address."},{"line_number":1474,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1475,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1476,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1477,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1478,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"},{"line_number":1479,"context_line":"                         for ip in vif.fixed_ips()]"},{"line_number":1480,"context_line":"            fixed_ips_v4 \u003d [ip for ip in fixed_ips if ip[\u0027version\u0027] \u003d\u003d 4]"},{"line_number":1481,"context_line":"            if fixed_ips_v4:"},{"line_number":1482,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips_v4[0][\u0027address\u0027]"},{"line_number":1483,"context_line":"            elif fixed_ips:"},{"line_number":1484,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips[0][\u0027address\u0027]"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"        if values.get(\u0027iqn\u0027):"},{"line_number":1487,"context_line":"            props[\u0027initiator\u0027] \u003d values[\u0027iqn\u0027][0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a1ced50_69b098f5","line":1484,"range":{"start_line":1472,"start_character":0,"end_line":1484,"end_character":69},"in_reply_to":"3a1ff146_25e4c80b","updated":"2017-03-17 16:22:03.000000000","message":"For the simple one nw_info case, we can just use its IP address. However, it might be better to do attachment work in Ironic for more complex cases.\n\nNova calls Cinder attachmet APIs as follows.\nFirst, Nova reserves a volume in nova-api[1]. \nInitialize connection and attach is done[2] in nova-cpu when building block device resources[3] before spawning instance in virt driver.\n[1] https://github.com/openstack/nova/blob/abb33a457738c12cb538a874a6627777dfd46b8b/nova/compute/api.py#L3696\n[2] https://github.com/openstack/nova/blob/abb33a457738c12cb538a874a6627777dfd46b8b/nova/virt/block_device.py#L256\n[3] https://github.com/openstack/nova/blob/abb33a457738c12cb538a874a6627777dfd46b8b/nova/compute/manager.py#L1908\n\nIt seems difficult to skip all attachment processes in Nova because especially nova-api isn\u0027t aware of virt driver.\nWe need more discussion.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"baa8296674e23ca9ceb72164dc2f4351d240f75c","unresolved":false,"context_lines":[{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        if values.get(\u0027ip\u0027):"},{"line_number":1471,"context_line":"            props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d values[\u0027ip\u0027][0]"},{"line_number":1472,"context_line":"        else:"},{"line_number":1473,"context_line":"            # Set ip based on MAC address."},{"line_number":1474,"context_line":"            # If values[\u0027mac\u0027] is not set, use first assigned address."},{"line_number":1475,"context_line":"            nw_info \u003d compute_utils.get_nw_info_for_instance(instance)"},{"line_number":1476,"context_line":"            mac \u003d values.get(\u0027mac\u0027, [None])[0]"},{"line_number":1477,"context_line":"            fixed_ips \u003d [ip for vif in nw_info"},{"line_number":1478,"context_line":"                         if not mac or vif[\u0027address\u0027] \u003d\u003d mac"},{"line_number":1479,"context_line":"                         for ip in vif.fixed_ips()]"},{"line_number":1480,"context_line":"            fixed_ips_v4 \u003d [ip for ip in fixed_ips if ip[\u0027version\u0027] \u003d\u003d 4]"},{"line_number":1481,"context_line":"            if fixed_ips_v4:"},{"line_number":1482,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips_v4[0][\u0027address\u0027]"},{"line_number":1483,"context_line":"            elif fixed_ips:"},{"line_number":1484,"context_line":"                props[\u0027ip\u0027] \u003d props[\u0027host\u0027] \u003d fixed_ips[0][\u0027address\u0027]"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"        if values.get(\u0027iqn\u0027):"},{"line_number":1487,"context_line":"            props[\u0027initiator\u0027] \u003d values[\u0027iqn\u0027][0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_408832e8","line":1484,"range":{"start_line":1472,"start_character":0,"end_line":1484,"end_character":69},"in_reply_to":"7a3c09a3_2def3788","updated":"2017-02-03 10:19:18.000000000","message":"Another issue is that network_info doesn\u0027t have mac addresses of baremetal instance here since ironic vif_attach API was introduced. Mac address is set to vif when vif_attach API is called later. We need another way to get ip address for mac.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"87bbcb49d1fd30aa464ad1eb34241a9274dd211e","unresolved":false,"context_lines":[{"line_number":1494,"context_line":""},{"line_number":1495,"context_line":"        # Eventually it would be nice to be able to do multipath, but for now"},{"line_number":1496,"context_line":"        # we should at least set the value to False."},{"line_number":1497,"context_line":"        props[\u0027multipath\u0027] \u003d False"},{"line_number":1498,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_a7c5068f","line":1497,"range":{"start_line":1497,"start_character":8,"end_line":1497,"end_character":34},"updated":"2017-01-16 16:34:45.000000000","message":"I agree this is likely the best thing to assert here.  It should be worth noting that if there are multiple connectors, the proposed driver code will change this flag upon the volume connection being removed and added back by ironic, such as when the instance is power cycled.","commit_id":"73dd1beb74409da1d02f5cbc60faac7e9d332863"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d244a21e306940d715d76fd2d23b938d6e52b038","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                    self.ironicclient.call(\u0027volume_target.create\u0027,"},{"line_number":416,"context_line":"                                           node_uuid\u003dinstance.node,"},{"line_number":417,"context_line":"                                           volume_type\u003d"},{"line_number":418,"context_line":"                                           driver_volume_type,"},{"line_number":419,"context_line":"                                           properties\u003dtarget_properties,"},{"line_number":420,"context_line":"                                           boot_index\u003dboot_index,"},{"line_number":421,"context_line":"                                           volume_id\u003dbdm[\u0027volume_id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a1ff146_aa35e7f7","line":418,"range":{"start_line":418,"start_character":43,"end_line":418,"end_character":62},"updated":"2017-03-16 15:03:57.000000000","message":"nit: I personally would prefer if we somehow get this on one line.  The odd line wrapping looks a little weird.","commit_id":"e39ff3f8458fd1816e23e5cc895bbf9d62c4ccb5"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d244a21e306940d715d76fd2d23b938d6e52b038","unresolved":false,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"        # validate we are ready to do the deploy"},{"line_number":883,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":884,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":885,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)):"},{"line_number":886,"context_line":"            # something is wrong. undo what we have done"},{"line_number":887,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":888,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":9,"id":"3a1ff146_859c9cc1","line":885,"range":{"start_line":884,"start_character":0,"end_line":885,"end_character":57},"updated":"2017-03-16 15:03:57.000000000","message":"We should also check the storage interface, to see if it validated, that is if the n ode is booting from a remote volume.","commit_id":"e39ff3f8458fd1816e23e5cc895bbf9d62c4ccb5"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3de2a467d8ddb215e3f85bc77217cb5b4a69d247","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                                       volume_target_id)"},{"line_number":441,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":442,"context_line":"                LOG.warning(\"Failed to remove volume target information \""},{"line_number":443,"context_line":"                            \"%(target) of volume %(volume)s from node \""},{"line_number":444,"context_line":"                            \"%(node)s when unprovisioning the instance: \""},{"line_number":445,"context_line":"                            \"%(reason)s\","},{"line_number":446,"context_line":"                            {\u0027target\u0027: volume_target_id,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_f0ae162c","line":443,"range":{"start_line":443,"start_character":29,"end_line":443,"end_character":38},"updated":"2017-05-25 09:14:54.000000000","message":"%(target)s","commit_id":"00acbc5f981555486bc7c3fa203335bbfde79da3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"3de2a467d8ddb215e3f85bc77217cb5b4a69d247","unresolved":false,"context_lines":[{"line_number":946,"context_line":"            self._add_volume_target_info(context, instance)"},{"line_number":947,"context_line":"        except Exception:"},{"line_number":948,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":949,"context_line":"                LOG.error(_LE(\"Error preparing deploy for instance \""},{"line_number":950,"context_line":"                              \"%(instance)s on baremetal node %(node)s.\"),"},{"line_number":951,"context_line":"                          {\u0027instance\u0027: instance.uuid,"},{"line_number":952,"context_line":"                           \u0027node\u0027: node_uuid})"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_2b589f2e","line":949,"range":{"start_line":949,"start_character":26,"end_line":949,"end_character":30},"updated":"2017-05-25 09:14:54.000000000","message":"It is unnecessary.","commit_id":"00acbc5f981555486bc7c3fa203335bbfde79da3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"308ecec2dc35f3b2f3c00759ff57407ec3f352f0","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_09f8397a","line":1062,"updated":"2017-07-07 15:48:46.000000000","message":"During unprovision, the node might be in CLEANWAIT/CLEANING here, already powered on. Then on L1123 we\u0027ll call volume_target.delete, which will fail and warning printed. The target will not be deleted. Is it OK? Not sure what\u0027s going to happen on the next boot of this node, is the old volume going to be attached?","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"71592c43f7717a2a7dbc319320f95cdd627c6668","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_2dfe4105","line":1062,"in_reply_to":"3f1d235d_06b7fc3c","updated":"2017-07-10 06:54:46.000000000","message":"Yes, ironic deletes targets currently. We might need fix with a TODO left in ironic code[1].\n\nhttps://github.com/openstack/ironic/blob/master/ironic/drivers/modules/deploy_utils.py#L1295","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"29f07c015b896745272041c4630a70c4d4aaa054","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_06b7fc3c","line":1062,"in_reply_to":"3f1d235d_09f8397a","updated":"2017-07-07 20:41:43.000000000","message":"As part of tear down before we even get to cleaning, Ironic will trigger volume detachments, then enumerate through the volumes and delete the target records. Once that has occurred, Ironic then kicks the node into CLEANING, where it is powered back up, and the IPA ramdisk is booted up to perform cleaning operations on the node.\n\nPersonally, I see the deletion of the volumes by nova as mostly harmless, but I may have had way too much time to think about the mechanics of this. :)\n\nhttps://github.com/openstack/ironic/blob/master/ironic/drivers/modules/agent.py#L416\nhttps://github.com/openstack/ironic/blob/master/ironic/drivers/modules/iscsi_deploy.py#L489\nhttps://github.com/openstack/ironic/blob/master/ironic/drivers/modules/deploy_utils.py#L1298","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c01e28fac8bc6a054ded52af142aa03bd91eaba8","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_70fe4206","line":1062,"in_reply_to":"3f1d235d_2dfe4105","updated":"2017-07-10 13:24:23.000000000","message":"I see. so maybe we don\u0027t want to print a warning in case of volume target was deleted by ironic itself?","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b953ca296129a01cf53caaafda83a0a64ebd64c","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_bf2025b2","line":1062,"in_reply_to":"3f1d235d_70fe4206","updated":"2017-07-10 15:43:36.000000000","message":"Or just pass on NotFound.  The API should be returning a 404 on a delete/destroy request for something that doesn\u0027t exist. Bad request, I think, would be if somehow there is a failure somewhere else.","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"f02d6ac20bd6b154217f14c3b4f8bce883405bc6","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                          instance\u003dinstance)"},{"line_number":1060,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1061,"context_line":"            if node.provision_state in (ironic_states.NOSTATE,"},{"line_number":1062,"context_line":"                                        ironic_states.CLEANING,"},{"line_number":1063,"context_line":"                                        ironic_states.CLEANWAIT,"},{"line_number":1064,"context_line":"                                        ironic_states.CLEANFAIL,"},{"line_number":1065,"context_line":"                                        ironic_states.AVAILABLE):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_97377b4e","line":1062,"in_reply_to":"3f1d235d_bf2025b2","updated":"2017-07-11 07:38:59.000000000","message":"I fixed not to log a warning message when a target is already removed.","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"fa2fab5ca426ebd3a0a7374342529af61f91859c","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        # Eventually it would be nice to be able to do multipath, but for now"},{"line_number":1658,"context_line":"        # we should at least set the value to False."},{"line_number":1659,"context_line":"        props[\u0027multipath\u0027] \u003d False"},{"line_number":1660,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f201791_bd01e308","line":1659,"updated":"2017-06-26 17:03:55.000000000","message":"The downsides to copying values over is that you will always be behind the curve from changes that are added to the connector, if this is coming from os-brick.  Why not clone the values dict directly, then change what you need to?\n\nAlso, multipath can only be set to True if and only if multipathd is installed and running.  Cinder volume drivers expect it to be running if the value is True.","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"77a4d6da788565ea3d30542746d82eabd1907e2d","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        # Eventually it would be nice to be able to do multipath, but for now"},{"line_number":1658,"context_line":"        # we should at least set the value to False."},{"line_number":1659,"context_line":"        props[\u0027multipath\u0027] \u003d False"},{"line_number":1660,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_3d9d730a","line":1659,"in_reply_to":"5f201791_bd01e308","updated":"2017-07-07 13:48:41.000000000","message":"The ironic conductor will reset this flag if it re-attaches volumes and has multiple forms of volume connectors (different from the actual targets) on file for the node, which I believe is fine.  For an initial boot, I suspect multipath\u003dFalse works jut fine.","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"0ded009e931a90f2250e67432013587c0fd5b75d","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        # Eventually it would be nice to be able to do multipath, but for now"},{"line_number":1658,"context_line":"        # we should at least set the value to False."},{"line_number":1659,"context_line":"        props[\u0027multipath\u0027] \u003d False"},{"line_number":1660,"context_line":"        return props"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f201791_3d7a3cb9","line":1659,"in_reply_to":"5f201791_bd01e308","updated":"2017-06-28 02:05:13.000000000","message":"This information doesn\u0027t come from os-brick. os-brick seems to collect connector information in configured compute nodes. In Ironic case, nodes are not deployed. Then, we use the information registered with Ironic API by an operator. The detail is described in the Ironic SPEC[1].\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/volume-connection-information.html","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6fff7fba0e412cea03134f256cd827a1a037506","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_70df503a","line":409,"updated":"2017-07-10 23:41:45.000000000","message":"is this safe? Are we guaranteed that bdm.connection_info is valid JSON?","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_99e9f481","line":409,"in_reply_to":"3f1d235d_70df503a","updated":"2017-07-11 07:43:37.000000000","message":"connection_info is valid JSON since this is a response of initialize_connection of cinder API.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"229d844bbbdcf6f34069b1040562ff39fc7a6273","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_00ed528a","line":409,"in_reply_to":"3f1d235d_99e9f481","updated":"2017-07-11 15:50:28.000000000","message":"ok, just checking :)","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6fff7fba0e412cea03134f256cd827a1a037506","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""},{"line_number":424,"context_line":"                             \"provisioning the instance %(instance)s\")"},{"line_number":425,"context_line":"                           % {\u0027volume\u0027: bdm.volume_id, \u0027node\u0027: instance.node,"},{"line_number":426,"context_line":"                              \u0027instance\u0027: instance.uuid})"},{"line_number":427,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":428,"context_line":"                    raise exception.InstanceDeployFailure(msg)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_d0d2a434","line":426,"updated":"2017-07-10 23:41:45.000000000","message":"Technically, you can leave the %(instance)s argument out of the above because passing instance\u003dinstance in the LOG.error() call below will automatically include the instance\u0027s UUID in the log message.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""},{"line_number":424,"context_line":"                             \"provisioning the instance %(instance)s\")"},{"line_number":425,"context_line":"                           % {\u0027volume\u0027: bdm.volume_id, \u0027node\u0027: instance.node,"},{"line_number":426,"context_line":"                              \u0027instance\u0027: instance.uuid})"},{"line_number":427,"context_line":"                    LOG.error(msg, instance\u003dinstance)"},{"line_number":428,"context_line":"                    raise exception.InstanceDeployFailure(msg)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_99133467","line":426,"in_reply_to":"3f1d235d_d0d2a434","updated":"2017-07-11 07:43:37.000000000","message":"Done","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6fff7fba0e412cea03134f256cd827a1a037506","unresolved":false,"context_lines":[{"line_number":945,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":946,"context_line":"                LOG.error(\"Error preparing deploy for instance \""},{"line_number":947,"context_line":"                          \"%(instance)s on baremetal node %(node)s.\","},{"line_number":948,"context_line":"                          {\u0027instance\u0027: instance.uuid,"},{"line_number":949,"context_line":"                           \u0027node\u0027: node_uuid})"},{"line_number":950,"context_line":"                self._cleanup_deploy(node, instance, network_info)"},{"line_number":951,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_f0ea40d6","line":948,"updated":"2017-07-10 23:41:45.000000000","message":"ditto comment from above.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":945,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":946,"context_line":"                LOG.error(\"Error preparing deploy for instance \""},{"line_number":947,"context_line":"                          \"%(instance)s on baremetal node %(node)s.\","},{"line_number":948,"context_line":"                          {\u0027instance\u0027: instance.uuid,"},{"line_number":949,"context_line":"                           \u0027node\u0027: node_uuid})"},{"line_number":950,"context_line":"                self._cleanup_deploy(node, instance, network_info)"},{"line_number":951,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_bc013e07","line":948,"in_reply_to":"3f1d235d_f0ea40d6","updated":"2017-07-11 07:43:37.000000000","message":"Done","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c35c677eb891b7d83602ba4d8d0cc2f9982fe1ac","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_ad492761","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"updated":"2017-07-10 13:08:28.000000000","message":"We first need to check if storage is even present before checking the result.  If it is not, it is a good indicator of an older version of ironic, and even though we indicate to upgrade Ironic before Nova, I fear that is not always performed as such.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"229d844bbbdcf6f34069b1040562ff39fc7a6273","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_a0fd7e3b","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"in_reply_to":"3f1d235d_18c0307c","updated":"2017-07-11 15:50:28.000000000","message":"@TheJulia: is there a better way of communicating change in a public API?","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8fe717d864cb2bcd8dd9fcfbd061ba595f772bb1","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_18c0307c","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"in_reply_to":"3f1d235d_970bfb22","updated":"2017-07-11 12:45:01.000000000","message":"Have I ever mentioned I greatly dislike micro versions? :)","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"353f008e679e141705176f1e6845542be65fa588","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_2605f4c2","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"in_reply_to":"3f1d235d_a0fd7e3b","updated":"2017-07-12 05:02:44.000000000","message":"@jaypipes: Not really, I have been bitten by breaking behavior changes across micro versions in the past, so I feel bad with hard coded client initializations using them.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6fff7fba0e412cea03134f256cd827a1a037506","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_d0bbc4e2","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"in_reply_to":"3f1d235d_ad492761","updated":"2017-07-10 23:41:45.000000000","message":"Agreed with @TheJulia that it would be useful to be defensive here.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":960,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":961,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":962,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":963,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":964,"context_line":"            # something is wrong. undo what we have done"},{"line_number":965,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":966,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_970bfb22","line":963,"range":{"start_line":963,"start_character":16,"end_line":963,"end_character":59},"in_reply_to":"3f1d235d_d0bbc4e2","updated":"2017-07-11 07:43:37.000000000","message":"With older ironic, nova-compute fails earlier since the required API version is bumped with this patch[1].\n\n[1] https://review.openstack.org/#/c/215385/19/nova/virt/ironic/client_wrapper.py@33","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5b1c3d679bd49eed883b99580d9973fc60322f51","unresolved":false,"context_lines":[{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":1632,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":1633,"context_line":""},{"line_number":1634,"context_line":"        :param instance: nova instance"},{"line_number":1635,"context_line":"        :returns A connector information dictionary"},{"line_number":1636,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_166374de","line":1633,"updated":"2017-07-11 02:22:17.000000000","message":"We should detail that this information is connector information describing the hardware that will be connecting to the volumes.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"    def get_volume_connector(self, instance):"},{"line_number":1632,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":1633,"context_line":""},{"line_number":1634,"context_line":"        :param instance: nova instance"},{"line_number":1635,"context_line":"        :returns A connector information dictionary"},{"line_number":1636,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_ed4ca277","line":1633,"in_reply_to":"3f1d235d_166374de","updated":"2017-07-11 07:43:37.000000000","message":"Done","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5b1c3d679bd49eed883b99580d9973fc60322f51","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":1633,"context_line":""},{"line_number":1634,"context_line":"        :param instance: nova instance"},{"line_number":1635,"context_line":"        :returns A connector information dictionary"},{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_b6860065","line":1635,"range":{"start_line":1635,"start_character":8,"end_line":1635,"end_character":17},"updated":"2017-07-11 02:22:17.000000000","message":"s/:returns/returns:/ and we should detail that this is for cinder\u0027s consumption.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"        \"\"\"Get connector information for the instance for attaching to volumes."},{"line_number":1633,"context_line":""},{"line_number":1634,"context_line":"        :param instance: nova instance"},{"line_number":1635,"context_line":"        :returns A connector information dictionary"},{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_17a6cb54","line":1635,"range":{"start_line":1635,"start_character":8,"end_line":1635,"end_character":17},"in_reply_to":"3f1d235d_b6860065","updated":"2017-07-11 07:43:37.000000000","message":"Done","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6fff7fba0e412cea03134f256cd827a1a037506","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1639,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1640,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1641,"context_line":"        values \u003d {}"},{"line_number":1642,"context_line":"        for conn in connectors:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_90b54cf1","line":1639,"updated":"2017-07-10 23:41:45.000000000","message":"Maybe it\u0027s just me, but it just seems weird to me to be doing a call to Ironic for listing volume connectors when that call is just a proxy to Cinder to get volume information... Why not just go directly to Cinder? ...","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"353f008e679e141705176f1e6845542be65fa588","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1639,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1640,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1641,"context_line":"        values \u003d {}"},{"line_number":1642,"context_line":"        for conn in connectors:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_661bec1a","line":1639,"in_reply_to":"3f1d235d_00bb1272","updated":"2017-07-12 05:02:44.000000000","message":"@jaypipes: No problem! Happy to answer questions! Storing the same information  makes lots of sense, especially since cinder, at least as far as I\u0027m aware, doesn\u0027t actually store the information from the back end drivers that is returned as a result of an attachment.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5b1c3d679bd49eed883b99580d9973fc60322f51","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1639,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1640,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1641,"context_line":"        values \u003d {}"},{"line_number":1642,"context_line":"        for conn in connectors:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_96566406","line":1639,"in_reply_to":"3f1d235d_90b54cf1","updated":"2017-07-11 02:22:17.000000000","message":"Volume connectors are like network ports.  Either an iscsi software initiator, iscsi hardware initiator, FCoE converged adapter, plain old FibreChannel, etc. Ironic holds the information as the source of truth about the hardware. This is what is needed to actually tell the backend storage beyond cinder of what will be connecting so access lists/lun masking can be updated.\n\nIronic does also hold target information indicating what volumes should be attached, since it needs to have enough info to be able to facilitate attachments, detachments, recovery from outages, re-assertion/update of config... the list is actually kind of long above and beyond a stand-alone use case and that ironic\u0027s storage interface is modular.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"229d844bbbdcf6f34069b1040562ff39fc7a6273","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        \"\"\""},{"line_number":1637,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1638,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1639,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1640,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1641,"context_line":"        values \u003d {}"},{"line_number":1642,"context_line":"        for conn in connectors:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_00bb1272","line":1639,"in_reply_to":"3f1d235d_96566406","updated":"2017-07-11 15:50:28.000000000","message":"@TheJulia: gotcha. Thanks for the excellent information. And that actually matches the information Nova stores internally for volumes, even though it proxies most active information to Cinder.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"30fb418fe687a6012c977360cbc4341182102589","unresolved":false,"context_lines":[{"line_number":401,"context_line":"                         \u0027reason\u0027: six.text_type(e)})"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def _add_volume_target_info(self, context, instance):"},{"line_number":404,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":405,"context_line":"            context, instance.uuid)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_bcea01d5","line":405,"range":{"start_line":404,"start_character":8,"end_line":405,"end_character":35},"updated":"2017-07-18 00:04:37.000000000","message":"You shouldn\u0027t have to load these up from the database again, the block_device_info passed into spawn() has the DriverVolumeBlockDevice objects, which wrap a BlockDeviceMapping object and proxy some of the attributes.\n\nYou can get the mappings from block_device_info via nova.virt.driver.block_device_info_get_mapping(block_device_info).","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":401,"context_line":"                         \u0027reason\u0027: six.text_type(e)})"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def _add_volume_target_info(self, context, instance):"},{"line_number":404,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":405,"context_line":"            context, instance.uuid)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_ba455cb6","line":405,"range":{"start_line":404,"start_character":8,"end_line":405,"end_character":35},"in_reply_to":"1f1a1f67_bcea01d5","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ba55214fd4366b9d1b082610ddeb49c7a84bdb6d","unresolved":false,"context_lines":[{"line_number":405,"context_line":"            context, instance.uuid)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_68d4eb20","line":408,"range":{"start_line":408,"start_character":0,"end_line":408,"end_character":36},"updated":"2017-07-14 14:16:57.000000000","message":"nit: I\u0027d prefer\n\n if not bdm.get(\u0027volume_id\u0027):\n     continue","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"30fb418fe687a6012c977360cbc4341182102589","unresolved":false,"context_lines":[{"line_number":405,"context_line":"            context, instance.uuid)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_bcc32157","line":408,"range":{"start_line":408,"start_character":0,"end_line":408,"end_character":36},"in_reply_to":"1f1a1f67_68d4eb20","updated":"2017-07-18 00:04:37.000000000","message":"Normally I think we\u0027d use bdm.is_volume here. I\u0027m not sure if it matters.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":405,"context_line":"            context, instance.uuid)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            if bdm.get(\u0027volume_id\u0027):"},{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_ba8f9ccb","line":408,"range":{"start_line":408,"start_character":0,"end_line":408,"end_character":36},"in_reply_to":"1f1a1f67_bcc32157","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ba55214fd4366b9d1b082610ddeb49c7a84bdb6d","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"                try:"},{"line_number":415,"context_line":"                    self.ironicclient.call(\u0027volume_target.create\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_a8f1e3cf","line":412,"range":{"start_line":412,"start_character":0,"end_line":412,"end_character":43},"updated":"2017-07-14 14:16:57.000000000","message":"tiny nit: this temporary variable is not overly useful","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"                try:"},{"line_number":415,"context_line":"                    self.ironicclient.call(\u0027volume_target.create\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_5ac408f5","line":412,"range":{"start_line":412,"start_character":0,"end_line":412,"end_character":43},"in_reply_to":"1f1a1f67_93c1b831","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4f4a566342d95f9e0948fa4d4fed1cd6d064813","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":410,"context_line":"                target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":411,"context_line":"                driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":412,"context_line":"                boot_index \u003d bdm.boot_index"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"                try:"},{"line_number":415,"context_line":"                    self.ironicclient.call(\u0027volume_target.create\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_93c1b831","line":412,"range":{"start_line":412,"start_character":0,"end_line":412,"end_character":43},"in_reply_to":"1f1a1f67_a8f1e3cf","updated":"2017-07-14 14:48:38.000000000","message":"+1, yeah, re-assigning doesn\u0027t make sense when it only gets used on line 419.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"30fb418fe687a6012c977360cbc4341182102589","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                                           volume_type\u003ddriver_volume_type,"},{"line_number":418,"context_line":"                                           properties\u003dtarget_properties,"},{"line_number":419,"context_line":"                                           boot_index\u003dboot_index,"},{"line_number":420,"context_line":"                                           volume_id\u003dbdm[\u0027volume_id\u0027])"},{"line_number":421,"context_line":"                except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":422,"context_line":"                    msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_dc9b7d70","line":420,"range":{"start_line":420,"start_character":53,"end_line":420,"end_character":69},"updated":"2017-07-18 00:04:37.000000000","message":"nit: use bdm.volume_id since these are objects. We want to remove the dict compat over time.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":417,"context_line":"                                           volume_type\u003ddriver_volume_type,"},{"line_number":418,"context_line":"                                           properties\u003dtarget_properties,"},{"line_number":419,"context_line":"                                           boot_index\u003dboot_index,"},{"line_number":420,"context_line":"                                           volume_id\u003dbdm[\u0027volume_id\u0027])"},{"line_number":421,"context_line":"                except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":422,"context_line":"                    msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_754eb76f","line":420,"range":{"start_line":420,"start_character":53,"end_line":420,"end_character":69},"in_reply_to":"1f1a1f67_dc9b7d70","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"30fb418fe687a6012c977360cbc4341182102589","unresolved":false,"context_lines":[{"line_number":418,"context_line":"                                           properties\u003dtarget_properties,"},{"line_number":419,"context_line":"                                           boot_index\u003dboot_index,"},{"line_number":420,"context_line":"                                           volume_id\u003dbdm[\u0027volume_id\u0027])"},{"line_number":421,"context_line":"                except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":422,"context_line":"                    msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""},{"line_number":424,"context_line":"                             \"provisioning the instance\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_fc7bd924","line":421,"range":{"start_line":421,"start_character":47,"end_line":421,"end_character":66},"updated":"2017-07-18 00:04:37.000000000","message":"What would cause a 409?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":418,"context_line":"                                           properties\u003dtarget_properties,"},{"line_number":419,"context_line":"                                           boot_index\u003dboot_index,"},{"line_number":420,"context_line":"                                           volume_id\u003dbdm[\u0027volume_id\u0027])"},{"line_number":421,"context_line":"                except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":422,"context_line":"                    msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":423,"context_line":"                             \"volume %(volume)s on node %(node)s when \""},{"line_number":424,"context_line":"                             \"provisioning the instance\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_955dd316","line":421,"range":{"start_line":421,"start_character":47,"end_line":421,"end_character":66},"in_reply_to":"1f1a1f67_fc7bd924","updated":"2017-07-18 08:40:50.000000000","message":"409 might be caused when the same boot index is already used for the node.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ba55214fd4366b9d1b082610ddeb49c7a84bdb6d","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            try:"},{"line_number":435,"context_line":"                self.ironicclient.call(\u0027volume_target.delete\u0027,"},{"line_number":436,"context_line":"                                       volume_target_id)"},{"line_number":437,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":438,"context_line":"                LOG.warning(\"Failed to remove volume target information \""},{"line_number":439,"context_line":"                            \"%(target)s of volume %(volume)s from node \""},{"line_number":440,"context_line":"                            \"%(node)s when unprovisioning the instance: \""}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_e8d0fb21","line":437,"range":{"start_line":437,"start_character":0,"end_line":437,"end_character":46},"updated":"2017-07-14 14:16:57.000000000","message":"shouldn\u0027t we actually catch all ironic exception? can we raise something like Conflict here?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            try:"},{"line_number":435,"context_line":"                self.ironicclient.call(\u0027volume_target.delete\u0027,"},{"line_number":436,"context_line":"                                       volume_target_id)"},{"line_number":437,"context_line":"            except ironic.exc.BadRequest as e:"},{"line_number":438,"context_line":"                LOG.warning(\"Failed to remove volume target information \""},{"line_number":439,"context_line":"                            \"%(target)s of volume %(volume)s from node \""},{"line_number":440,"context_line":"                            \"%(node)s when unprovisioning the instance: \""}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_f574076a","line":437,"range":{"start_line":437,"start_character":0,"end_line":437,"end_character":46},"in_reply_to":"1f1a1f67_e8d0fb21","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ba55214fd4366b9d1b082610ddeb49c7a84bdb6d","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":967,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":968,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":969,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":970,"context_line":"            # something is wrong. undo what we have done"},{"line_number":971,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":972,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_0888d71c","line":969,"range":{"start_line":969,"start_character":0,"end_line":969,"end_character":59},"updated":"2017-07-14 14:16:57.000000000","message":"I remember asking that, but forgot the answer... Do we expect this to fail, if a node has \"cinder\" storage interface, but this validation does not pass and no remote volumes are requested by nova?","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4f4a566342d95f9e0948fa4d4fed1cd6d064813","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        validate_chk \u003d self.ironicclient.call(\"node.validate\", node_uuid)"},{"line_number":967,"context_line":"        if (not validate_chk.deploy.get(\u0027result\u0027)"},{"line_number":968,"context_line":"                or not validate_chk.power.get(\u0027result\u0027)"},{"line_number":969,"context_line":"                or not validate_chk.storage.get(\u0027result\u0027)):"},{"line_number":970,"context_line":"            # something is wrong. undo what we have done"},{"line_number":971,"context_line":"            self._cleanup_deploy(node, instance, network_info)"},{"line_number":972,"context_line":"            raise exception.ValidationError(_("}],"source_content_type":"text/x-python","patch_set":21,"id":"1f1a1f67_33366454","line":969,"range":{"start_line":969,"start_character":0,"end_line":969,"end_character":59},"in_reply_to":"1f1a1f67_0888d71c","updated":"2017-07-14 14:48:38.000000000","message":"The way I originally wrote the validation logic that gets called is if it has the cinder storage interface, and it has connectors, but no targets, it just returns that everything is good.  If there is a misconfiguration, we thus want things to fail fast here so nova can reschedule on to another node.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"33f97f6e8d4006a7fca821eb18b8527f3c74ffe4","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        bdms \u003d virt_driver.block_device_info_get_mapping(block_device_info)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        for bdm in bdms:"},{"line_number":407,"context_line":"            if not bdm.is_volume:"},{"line_number":408,"context_line":"                continue"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":411,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_ef0f4634","line":408,"range":{"start_line":407,"start_character":0,"end_line":408,"end_character":24},"updated":"2017-07-20 03:13:13.000000000","message":"This might be the tempest test scenario, but it fails starting here. \nhttp://logs.openstack.org/49/485349/1/check/gate-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-tinyipa-ubuntu-xenial/b8596a9/logs/screen-n-cpu.txt.gz#_Jul_20_02_51_45_915562\n\nTest Scenario: https://review.openstack.org/#/c/472740/","commit_id":"bc302d07df5bfd86ec7cf8ba5636327ca443a9f2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff96740ce980509593186ba04c44623ca96e744a","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        bdms \u003d virt_driver.block_device_info_get_mapping(block_device_info)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        for bdm in bdms:"},{"line_number":407,"context_line":"            if not bdm.is_volume:"},{"line_number":408,"context_line":"                continue"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":411,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_93fd9cb3","line":408,"range":{"start_line":407,"start_character":0,"end_line":408,"end_character":24},"in_reply_to":"1f1a1f67_135d0ce9","updated":"2017-07-20 03:30:42.000000000","message":"Let\u0027s pick a workaround and leave a TODO for pike and clean it up in Queens with something more elegant.","commit_id":"bc302d07df5bfd86ec7cf8ba5636327ca443a9f2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a9cd06528a9c024cdcb2e2c488fa3eeedb6bbab7","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        bdms \u003d virt_driver.block_device_info_get_mapping(block_device_info)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        for bdm in bdms:"},{"line_number":407,"context_line":"            if not bdm.is_volume:"},{"line_number":408,"context_line":"                continue"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":411,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_d6a9c2dd","line":408,"range":{"start_line":407,"start_character":0,"end_line":408,"end_character":24},"in_reply_to":"1f1a1f67_93fd9cb3","updated":"2017-07-20 04:17:17.000000000","message":"Will do.  I\u0027m thinking checking the wrapped bdm object is the best thing to do for now since the first option somewhat requires knowledge of the underlying destination_type check for someone looking at or troubleshooting the code.\n\nI\u0027ll update the rev, and push the recheck button on the test patch.  Thanks!","commit_id":"bc302d07df5bfd86ec7cf8ba5636327ca443a9f2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9583bd2ba91f1b03640c6ac91d4171afe3e25e14","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        bdms \u003d virt_driver.block_device_info_get_mapping(block_device_info)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        for bdm in bdms:"},{"line_number":407,"context_line":"            if not bdm.is_volume:"},{"line_number":408,"context_line":"                continue"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"            connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":411,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_135d0ce9","line":408,"range":{"start_line":407,"start_character":0,"end_line":408,"end_character":24},"in_reply_to":"1f1a1f67_ef0f4634","updated":"2017-07-20 03:28:55.000000000","message":"No it\u0027s blowing up because the bdm here is a DriverVolumeBlockDevice object which wraps a BlockDeviceMapping object but doesn\u0027t proxy the is_volume property:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/block_device.py#L231\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/block_device.py#L268\n\nIt doesn\u0027t proxy the destination_type field either otherwise we could just check that.\n\nThere are two possible hacky workarounds here:\n\n1. Check isinstance(bdm, DriverVolumeBlockDevice) because that\u0027s only that thing if the destination_type is \u0027volume\u0027:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/block_device.py#L229\n\n2. Interrogate the wrapped bdm object like:\n\nbdm._bdm_obj.is_volume","commit_id":"bc302d07df5bfd86ec7cf8ba5636327ca443a9f2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7e4d7f1167dc0c06339c263740c7a3ec9da8670e","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"        \"\"\""},{"line_number":1655,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1656,"context_line":"        properties \u003d self._parse_node_properties(node)"},{"line_number":1657,"context_line":"        connectors \u003d self.ironicclient.call(\"node.list_volume_connectors\","},{"line_number":1658,"context_line":"                                            instance.node, detail\u003dTrue)"},{"line_number":1659,"context_line":"        values \u003d {}"},{"line_number":1660,"context_line":"        for conn in connectors:"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_7e652a1d","line":1657,"range":{"start_line":1657,"start_character":8,"end_line":1657,"end_character":18},"updated":"2017-07-20 01:05:14.000000000","message":"Worth considering, and ironic is likely an outlier in the nova world for this, but there is the possibility that this is called, and the list is empty, which would cause the logic below to be fallen through without an initiator iqn being added, which would obviously cause this to fail when misconfigured.  Just a thought, and likely follow-up worthy since it is a case where things are misconfigured. Ideally, in a perfect world, this would fail and things get rescheduled.... But I don\u0027t keep track of the nova code-base well enough to know for sure how that interaction would work.","commit_id":"bc302d07df5bfd86ec7cf8ba5636327ca443a9f2"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5ce2876ead6ab27814baec0fb13eff8fe7bb9b1f","unresolved":false,"context_lines":[{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1f1a1f67_99ba5b08","line":414,"range":{"start_line":414,"start_character":46,"end_line":414,"end_character":65},"updated":"2017-07-20 05:17:06.000000000","message":"Similar issue with the previous revision. connection_info does not appear to be directly accessible, but it is present on the underlying object. That being said the unit tests also need to be re-writtten because the test helper object only provides a list of BlockDeviceMapping objects. \\o/\n\nhttp://logs.openstack.org/49/485349/1/check/gate-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-tinyipa-ubuntu-xenial/2b8d4ca/logs/screen-n-cpu.txt.gz#_Jul_20_04_47_27_910278","commit_id":"e9fbc5f9992860323d0673d2674c64871186cfb5"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a1ff9863a1dd4e1a2c77f6bbb379942b738c54da","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":409,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":410,"context_line":"            # checking the underlying object\u0027s status."},{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm._bdm_obj.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1f1a1f67_192beb30","line":414,"range":{"start_line":411,"start_character":0,"end_line":414,"end_character":75},"updated":"2017-07-20 05:22:23.000000000","message":"Unit tests fail on accessing the underlying object because they are written to handle a list of BlockDeviceMappings.  Comments in Revision 24 and 25 as to why the changes. I\u0027ve submitted a recheck on https://review.openstack.org/#/c/485349/1 which should provide us feedback on the integration in the gate-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-tinyipa-ubuntu-xenial job.\n\nAt this point, I\u0027m going to get some sleep.","commit_id":"4b10f1eacac8f255bb0f89db1cae5dcd31d1bd26"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8c3cb474a7d19aaff812575ddae7f5a346b443f4","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":409,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":410,"context_line":"            # checking the underlying object\u0027s status."},{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":"            "},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm._bdm_obj.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                self.ironicclient.call(\u0027volume_target.create\u0027,"},{"line_number":420,"context_line":"                                       node_uuid\u003dinstance.node,"},{"line_number":421,"context_line":"                                       volume_type\u003ddriver_volume_type,"},{"line_number":422,"context_line":"                                       properties\u003dtarget_properties,"},{"line_number":423,"context_line":"                                       boot_index\u003dbdm._bdm_obj.boot_index,"},{"line_number":424,"context_line":"                                       volume_id\u003dbdm._bdm_obj.volume_id)"},{"line_number":425,"context_line":"            except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":426,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":427,"context_line":"                         \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_f974afd2","line":424,"range":{"start_line":411,"start_character":0,"end_line":424,"end_character":72},"updated":"2017-07-20 05:54:43.000000000","message":"Please see revision 24 through this revision. Unit tests need to be revised, tempest test patch rechecked.","commit_id":"fe3da4b17d6aee51ae515c519dea97f3b140b843"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e9b7b28d3e755326ae1f43665e59e14d2ecd7df1","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":409,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":410,"context_line":"            # checking the underlying object\u0027s status."},{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":"            "},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm._bdm_obj.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                self.ironicclient.call(\u0027volume_target.create\u0027,"},{"line_number":420,"context_line":"                                       node_uuid\u003dinstance.node,"},{"line_number":421,"context_line":"                                       volume_type\u003ddriver_volume_type,"},{"line_number":422,"context_line":"                                       properties\u003dtarget_properties,"},{"line_number":423,"context_line":"                                       boot_index\u003dbdm._bdm_obj.boot_index,"},{"line_number":424,"context_line":"                                       volume_id\u003dbdm._bdm_obj.volume_id)"},{"line_number":425,"context_line":"            except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":426,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":427,"context_line":"                         \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_51680520","line":424,"range":{"start_line":411,"start_character":0,"end_line":424,"end_character":72},"in_reply_to":"1f1a1f67_19ccf95f","updated":"2017-07-20 16:32:53.000000000","message":"We\u0027ve achieved a successful boot http://logs.openstack.org/49/485349/2/check/gate-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-tinyipa-ubuntu-xenial/6a71f11/logs/ironic-bm-logs/node-0_console_2017-07-20-15:07:22.txt.gz\n\nThat being said, the executing tempest job did fail, but only well after the involvement with cinder/nova was done. The node failed to boot back up to perform \"cleaning\", and we are still investigating the job logs to try and determine what happened since it does look like it it just didn\u0027t know what to reboot to. Possibly a race between ironic\u0027s vm and neutron or something crazy.  To be determined anyhow.\n\nThat just leaves fixing the tests.","commit_id":"fe3da4b17d6aee51ae515c519dea97f3b140b843"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e0677b9e4c20cd55ae1e0ff0fec17b8eb98ad85c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":409,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":410,"context_line":"            # checking the underlying object\u0027s status."},{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":"            "},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm._bdm_obj.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                self.ironicclient.call(\u0027volume_target.create\u0027,"},{"line_number":420,"context_line":"                                       node_uuid\u003dinstance.node,"},{"line_number":421,"context_line":"                                       volume_type\u003ddriver_volume_type,"},{"line_number":422,"context_line":"                                       properties\u003dtarget_properties,"},{"line_number":423,"context_line":"                                       boot_index\u003dbdm._bdm_obj.boot_index,"},{"line_number":424,"context_line":"                                       volume_id\u003dbdm._bdm_obj.volume_id)"},{"line_number":425,"context_line":"            except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":426,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":427,"context_line":"                         \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_c5cf9d27","line":424,"range":{"start_line":411,"start_character":0,"end_line":424,"end_character":72},"in_reply_to":"1f1a1f67_51680520","updated":"2017-07-21 06:28:26.000000000","message":"Unit tests were fixed.\nThanks.","commit_id":"fe3da4b17d6aee51ae515c519dea97f3b140b843"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"43c231edc4efd3a006e02d3ccb102b5dac6cafbe","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":409,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":410,"context_line":"            # checking the underlying object\u0027s status."},{"line_number":411,"context_line":"            if not bdm._bdm_obj.is_volume:"},{"line_number":412,"context_line":"                continue"},{"line_number":413,"context_line":"            "},{"line_number":414,"context_line":"            connection_info \u003d jsonutils.loads(bdm._bdm_obj.connection_info)"},{"line_number":415,"context_line":"            target_properties \u003d connection_info[\u0027data\u0027]"},{"line_number":416,"context_line":"            driver_volume_type \u003d connection_info[\u0027driver_volume_type\u0027]"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"            try:"},{"line_number":419,"context_line":"                self.ironicclient.call(\u0027volume_target.create\u0027,"},{"line_number":420,"context_line":"                                       node_uuid\u003dinstance.node,"},{"line_number":421,"context_line":"                                       volume_type\u003ddriver_volume_type,"},{"line_number":422,"context_line":"                                       properties\u003dtarget_properties,"},{"line_number":423,"context_line":"                                       boot_index\u003dbdm._bdm_obj.boot_index,"},{"line_number":424,"context_line":"                                       volume_id\u003dbdm._bdm_obj.volume_id)"},{"line_number":425,"context_line":"            except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":426,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":427,"context_line":"                         \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":27,"id":"1f1a1f67_19ccf95f","line":424,"range":{"start_line":411,"start_character":0,"end_line":424,"end_character":72},"in_reply_to":"1f1a1f67_f974afd2","updated":"2017-07-20 14:36:12.000000000","message":"Following up from this change, it looks like everything got populated through, and the node timed out trying to connect to the iscsi target. I\u0027ve posted an update to ironic\u0027s devstack plugin in order to fix what appears to be a default network firewalling issue on the host running the tests.","commit_id":"fe3da4b17d6aee51ae515c519dea97f3b140b843"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6a7f0abbbc8b568f22180af2b5182f54a5e11f74","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        bdms \u003d virt_driver.block_device_info_get_mapping(block_device_info)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        for bdm in bdms:"},{"line_number":408,"context_line":"            # TODO(TheJulia): In Queens, we should refactor the check below"},{"line_number":409,"context_line":"            # to something more elegent, as is_volume is not proxied through"},{"line_number":410,"context_line":"            # to the DriverVolumeBlockDevice object. Until then, we are"},{"line_number":411,"context_line":"            # checking the underlying object\u0027s status."}],"source_content_type":"text/x-python","patch_set":30,"id":"ff346bd7_ac4fb1bb","line":408,"updated":"2017-07-25 12:56:59.000000000","message":"Maybe we should just reassign the local bdm variable here to be:\n\nbdm \u003d bdm._bdm_obj\n\nOr rename the variable in the for loop and do:\n\nfor driver_bdm in bdms:\n   # TODO(....)\n   bdm \u003d driver_bdm._bdm_obj\n   if not bdm.is_volume:\n      continue\n   ....","commit_id":"3e1a3c9f82089b6b37605fcf88bb685625f8632f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6a7f0abbbc8b568f22180af2b5182f54a5e11f74","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                                       volume_type\u003ddriver_volume_type,"},{"line_number":423,"context_line":"                                       properties\u003dtarget_properties,"},{"line_number":424,"context_line":"                                       boot_index\u003dbdm._bdm_obj.boot_index,"},{"line_number":425,"context_line":"                                       volume_id\u003dbdm._bdm_obj.volume_id)"},{"line_number":426,"context_line":"            except (ironic.exc.BadRequest, ironic.exc.Conflict):"},{"line_number":427,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":428,"context_line":"                         \"volume %(volume)s on node %(node)s when \""}],"source_content_type":"text/x-python","patch_set":30,"id":"ff346bd7_cc8315a9","line":425,"range":{"start_line":425,"start_character":49,"end_line":425,"end_character":71},"updated":"2017-07-25 12:56:59.000000000","message":"We should be able to just do bdm.volume_id since the driver volume block device proxies that through:\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/block_device.py#L231\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/block_device.py#L122","commit_id":"3e1a3c9f82089b6b37605fcf88bb685625f8632f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6a7f0abbbc8b568f22180af2b5182f54a5e11f74","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                msg \u003d (_(\"Failed to add volume target information of \""},{"line_number":428,"context_line":"                         \"volume %(volume)s on node %(node)s when \""},{"line_number":429,"context_line":"                         \"provisioning the instance\")"},{"line_number":430,"context_line":"                       % {\u0027volume\u0027: bdm._bdm_obj.volume_id,"},{"line_number":431,"context_line":"                          \u0027node\u0027: instance.node})"},{"line_number":432,"context_line":"                LOG.error(msg, instance\u003dinstance)"},{"line_number":433,"context_line":"                raise exception.InstanceDeployFailure(msg)"}],"source_content_type":"text/x-python","patch_set":30,"id":"ff346bd7_6cbe6966","line":430,"range":{"start_line":430,"start_character":36,"end_line":430,"end_character":58},"updated":"2017-07-25 12:56:59.000000000","message":"same","commit_id":"3e1a3c9f82089b6b37605fcf88bb685625f8632f"}],"releasenotes/notes/bp-ironic-boot-from-volume-cfb98c733cf09a92.yaml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"77a4d6da788565ea3d30542746d82eabd1907e2d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires Ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.XX(TBD)."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"3f1d235d_5d170fa5","line":5,"range":{"start_line":5,"start_character":20,"end_line":5,"end_character":22},"updated":"2017-07-07 13:48:41.000000000","message":"s/Ironic/an ironic/","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"71592c43f7717a2a7dbc319320f95cdd627c6668","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires Ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.XX(TBD)."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"3f1d235d_72f2d49c","line":5,"range":{"start_line":5,"start_character":20,"end_line":5,"end_character":22},"in_reply_to":"3f1d235d_5d170fa5","updated":"2017-07-10 06:54:46.000000000","message":"Done","commit_id":"7fd57e4d0c6ff1dd1e640eb69f491c37886a68ee"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7470940791e4685461f68d693471c93c4227f3ae","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.13.1."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"3f1d235d_6a5f75e5","line":6,"range":{"start_line":6,"start_character":41,"end_line":6,"end_character":47},"updated":"2017-07-10 12:38:56.000000000","message":"I believe we will end up cutting this as 1.14.  I\u0027m waiting on the green light to push the change into the repository","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"33e6b081f185fab744029b78c4164a230464b032","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.13.1."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"3f1d235d_dca645ac","line":6,"range":{"start_line":6,"start_character":41,"end_line":6,"end_character":47},"in_reply_to":"3f1d235d_4ae82e15","updated":"2017-07-10 20:14:23.000000000","message":"1.14.0 has been released, global-requirements update has been proposed https://review.openstack.org/#/c/482146/","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"63b25eedf20ada33453db209ec77461e07dad139","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.13.1."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"3f1d235d_4ae82e15","line":6,"range":{"start_line":6,"start_character":41,"end_line":6,"end_character":47},"in_reply_to":"3f1d235d_6a5f75e5","updated":"2017-07-10 17:13:41.000000000","message":"I have requested a release of this at 1.14.0.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"cf301d10e652de6eeb24d0f3824c919a2220cf14","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.13.1."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"3f1d235d_0672234a","line":6,"range":{"start_line":6,"start_character":41,"end_line":6,"end_character":47},"in_reply_to":"3f1d235d_dca645ac","updated":"2017-07-11 07:43:37.000000000","message":"Thank you for the correction and the patch for global-requirements.","commit_id":"255f17d2f0e673f3c0f1c816ce91c681a7fa36df"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"1125a118c9eafede3f0d9da60b094040c8a4636f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1f1a1f67_6f003fac","line":5,"updated":"2017-07-17 14:05:39.000000000","message":"this isn\u0027t strictly true, there is an upgrade issue here, upgrading Nova past this point means that any environment with Ironic API version \u003c 1.32 will just fail.\n\nSo there should be an upgrade: note here as well.\n\nHonestly, I think this should handle the N-1 ironic gracefully, and remove support for that once Nova is in Queens.","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"e2c82e231a35c3b2d04c2ed6e447dfc2071d2af3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1f1a1f67_82b8f6e4","line":5,"in_reply_to":"1f1a1f67_6f003fac","updated":"2017-07-18 08:40:50.000000000","message":"Done","commit_id":"f48e85af4222124813b9faade12303b01751c4da"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d598653571e8778ecdc625f091e6ad06b4f6e56","unresolved":false,"context_lines":[{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32. The ironic service"},{"line_number":10,"context_line":"    should be upgraded before the nova service. If only the nova service is"},{"line_number":11,"context_line":"    upgraded, the service won\u0027t work with ironic virt driver."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"1f1a1f67_786d82ca","line":11,"range":{"start_line":11,"start_character":18,"end_line":11,"end_character":60},"updated":"2017-07-18 12:11:01.000000000","message":"Perhaps \"ironic virt driver will fail to operate until ironic is upgraded\" ?\n\nIt is nova\u0027s release notes, so consider it a nit.","commit_id":"3d5904f3402590616d7de41c62bfc1939e5b8983"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a92d8f9a1354533aa4ad530a3b4575e37ed532d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_91acb4ed","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"updated":"2017-07-18 15:26:15.000000000","message":"The feature support matrix also mentions hardware limitations - where are those documented? We should link to that so people can know if they support this or not in their deployment.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7ab0d7ce5517ec5b2dfdfde4b2887039d96af006","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_77769672","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"in_reply_to":"1f1a1f67_31c160e6","updated":"2017-07-19 02:42:53.000000000","message":"\u003e Hopefully you guys won\u0027t freak out when we request just to change the support matrix flag without any code changes in nova sometime in the next cycle?\n\nUnless I\u0027m misunderstanding something, I\u0027m more freaked out by the fact there are no Ironic drivers that support this today.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37524bd82cbb4f1ac9a94cb994d06e9ade382d25","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_c24fd368","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"in_reply_to":"1f1a1f67_580f3887","updated":"2017-07-19 15:44:10.000000000","message":"OK the in-tree and vendor vs non-vendor distinction is confusing to me, probably because I\u0027m not familiar with Ironic.\n\nCan we just clarify here and in the support matrix that the \u0027iscsi\u0027 volume type is the only one that is currently supported and/or tested?","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2be8cda3aefd3300b5285439eda63056a3ea42a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_580f3887","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"in_reply_to":"1f1a1f67_77769672","updated":"2017-07-19 13:25:19.000000000","message":"So there is some confusion, and hopefully this comment clears it up.\n\nOur in-tree deployment interface supports iscsi based booting of a machine, which is likely the hardest piece to properly implement. We went ahead and built the substrate such that FibreChannel support was easy to bolt on, which is why I tossed up the idea of partial support of fibrechannel.\n\nWe have a vendor driver that has proposed adding fibrechannel support, which may merge before we release pike. At the same time we will likely see FCoE support next cycle using the same data that nova ships via this patch.\n\nI\u0027ll ping you in IRC, and hopefully we can get this cleared up today.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f219f4af3304383bd2fad7aedc5a2296577e67de","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_31c160e6","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"in_reply_to":"1f1a1f67_91acb4ed","updated":"2017-07-18 15:43:08.000000000","message":"Lets just pull the fibrechannel reference since this is vendor driver based once it actually lands until we can land FCoE from iPXE.\n\nIt will be entirely on an ironic driver side since this code will ship the required information back and forth for our drivers to support FC card configuration. Hopefully you guys won\u0027t freak out when we request just to change the support matrix flag without any code changes in nova sometime in the next cycle?","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"26f67d250c9be61bffabc405fab31d72edf87199","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Enables to launch an instance from a volume with ironic virt driver. This"},{"line_number":5,"context_line":"    feature requires an ironic service supporting API version 1.32 or later. It"},{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_9d525a12","line":6,"range":{"start_line":4,"start_character":4,"end_line":6,"end_character":48},"in_reply_to":"1f1a1f67_c24fd368","updated":"2017-07-19 16:13:17.000000000","message":"Explicitly changing to state that it is iscsi volumes.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a92d8f9a1354533aa4ad530a3b4575e37ed532d1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"},{"line_number":10,"context_line":"    release). The Ironic service must be upgraded to \u003e\u003d 8.0.0 before Nova is upgraded,"},{"line_number":11,"context_line":"    otherwise all Ironic intergration will fail."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_b19a10b6","line":9,"range":{"start_line":9,"start_character":68,"end_line":9,"end_character":80},"updated":"2017-07-18 15:26:15.000000000","message":"1.32 is not part of Ironic 8.0.0:\n\nhttps://github.com/openstack/ironic/blob/8.0.0/ironic/api/controllers/v1/versions.py#L64\n\nSo you\u0027d need Ironic \u003e 8.0.0.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a92d8f9a1354533aa4ad530a3b4575e37ed532d1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"},{"line_number":10,"context_line":"    release). The Ironic service must be upgraded to \u003e\u003d 8.0.0 before Nova is upgraded,"},{"line_number":11,"context_line":"    otherwise all Ironic intergration will fail."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_b1b1f049","line":9,"range":{"start_line":9,"start_character":17,"end_line":9,"end_character":23},"updated":"2017-07-18 15:26:15.000000000","message":"you have this lower-case here, but uppercase later, let\u0027s be consistent","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"26f67d250c9be61bffabc405fab31d72edf87199","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    also requires python-ironicclient \u003e\u003d 1.14.0."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    The required ironic API version is updated to 1.32 (part of the Ironic 8.0.0"},{"line_number":10,"context_line":"    release). The Ironic service must be upgraded to \u003e\u003d 8.0.0 before Nova is upgraded,"},{"line_number":11,"context_line":"    otherwise all Ironic intergration will fail."}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1f1a1f67_5d0a821f","line":9,"range":{"start_line":9,"start_character":17,"end_line":9,"end_character":23},"in_reply_to":"1f1a1f67_b1b1f049","updated":"2017-07-19 16:13:17.000000000","message":"Changing to \u003e 8.0 since 8.0 is actually cut in pike, but the very beginning of the cycle it seems. Removed the .0 part just to be on the safe side for downstream consumers.\n\nAlso, changing to lower case since as I remember the doc guidelines, it should be lower case in reference to project names.","commit_id":"25372fd053e6fa991a149e8817bd2393a24f3237"}]}
