)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2f92c2fa9161a561e03b90361ee020b440d6c18b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tomoki Sekiyama \u003ctomoki.sekiyama@hds.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-10 21:34:59 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enhance iSCSI volume multipath support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, nova-compute supports multipath for iSCSI volume data"},{"line_number":10,"context_line":"path. It depends on response to targets discovery of from the main"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3a961159_e1cc70bd","line":7,"updated":"2014-12-14 09:17:48.000000000","message":"please prefix this with libvirt:","commit_id":"a30d5ebee733bfc555a792f107b07599e5f27f38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: Enhance iSCSI volume multipath support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, nova-compute supports multipath for iSCSI volume data"},{"line_number":10,"context_line":"path. It depends on response to targets discovery of from the main"},{"line_number":11,"context_line":"iSCSI portal, expecting multiple portal addresses are contained."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"However, some arrays only respond to discovery with a single portal"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3a961159_b2374afe","line":10,"updated":"2014-12-21 14:50:42.000000000","message":"s/of from/from/","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, nova-compute supports multipath for iSCSI volume data"},{"line_number":10,"context_line":"path. It depends on response to targets discovery of from the main"},{"line_number":11,"context_line":"iSCSI portal, expecting multiple portal addresses are contained."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"However, some arrays only respond to discovery with a single portal"},{"line_number":14,"context_line":"address, even if secondary portals are available. In this case,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3a961159_d23856f0","line":11,"updated":"2014-12-21 14:50:42.000000000","message":"s/are/to be/","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"}],"nova/tests/unit/virt/libvirt/test_volume.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2f92c2fa9161a561e03b90361ee020b440d6c18b","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                }"},{"line_number":245,"context_line":"        }"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def iscsi_connection_multipath(self, volume, locations, iqns, luns):"},{"line_number":248,"context_line":"        return {"},{"line_number":249,"context_line":"                \u0027driver_volume_type\u0027: \u0027iscsi\u0027,"},{"line_number":250,"context_line":"                \u0027data\u0027: {"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_c1c934ad","line":247,"range":{"start_line":247,"start_character":8,"end_line":247,"end_character":34},"updated":"2014-12-14 09:17:48.000000000","message":"this is an internal test method can you please prefix it with _","commit_id":"a30d5ebee733bfc555a792f107b07599e5f27f38"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"ed718414ba995752c46682060cbe6b69d8c12786","unresolved":false,"context_lines":[{"line_number":1007,"context_line":"        if self._initiator:"},{"line_number":1008,"context_line":"            connector[\u0027initiator\u0027] \u003d self._initiator"},{"line_number":1009,"context_line":"            connector[\u0027multipath\u0027] \u003d (CONF.libvirt.iscsi_use_multipath and"},{"line_number":1010,"context_line":"                                      self._is_multipathd_running())"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"        if self._fc_wwnns and self._fc_wwpns:"},{"line_number":1013,"context_line":"            connector[\"wwnns\"] \u003d self._fc_wwnns"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_bd105650","line":1010,"updated":"2015-01-13 14:22:09.000000000","message":"I think this is a really bad practice. Consider consider what happens if there is some bug / problem in the host OS that has caused the multipathd daemon to fail to start up. This code is going to silently change all the guests to use non-multipath setup instead.\n\nIf the CONF.libirt.iscsi_use_multipath is True, then we should *ALWAYS* use multipathd, or raise a hard error. We must never fallback to non-multipath setup if the admin has requested multipath in the config","commit_id":"9f49bf2c70700dafae0fbf400feaf8e2dc7ee98a"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"7af3f9b66e1f7ab51aa192ab5c78055c1d9c6e22","unresolved":false,"context_lines":[{"line_number":1007,"context_line":"        if self._initiator:"},{"line_number":1008,"context_line":"            connector[\u0027initiator\u0027] \u003d self._initiator"},{"line_number":1009,"context_line":"            connector[\u0027multipath\u0027] \u003d (CONF.libvirt.iscsi_use_multipath and"},{"line_number":1010,"context_line":"                                      self._is_multipathd_running())"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"        if self._fc_wwnns and self._fc_wwpns:"},{"line_number":1013,"context_line":"            connector[\"wwnns\"] \u003d self._fc_wwnns"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_af980e76","line":1010,"in_reply_to":"3a961159_bd105650","updated":"2015-01-14 19:15:05.000000000","message":"OK. I removed the fallback to non-multipath setup in v12.","commit_id":"9f49bf2c70700dafae0fbf400feaf8e2dc7ee98a"}],"nova/virt/libvirt/volume.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2f92c2fa9161a561e03b90361ee020b440d6c18b","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                       iscsi_properties[\u0027target_iqns\u0027])"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        # discover and return every available target"},{"line_number":292,"context_line":"        out \u003d self._run_iscsiadm_bare([\u0027-m\u0027,"},{"line_number":293,"context_line":"                                       \u0027discovery\u0027,"},{"line_number":294,"context_line":"                                       \u0027-t\u0027,"},{"line_number":295,"context_line":"                                       \u0027sendtargets\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_21dbd87c","line":292,"updated":"2014-12-14 09:17:48.000000000","message":"please use () this will save the use of \\\n\nout \u003d (self._run_iscsiadm_bare([\u0027-m\u0027,\n...\n       or \"\")","commit_id":"a30d5ebee733bfc555a792f107b07599e5f27f38"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2f92c2fa9161a561e03b90361ee020b440d6c18b","unresolved":false,"context_lines":[{"line_number":621,"context_line":"            if mpath_device:"},{"line_number":622,"context_line":"                return mpath_device"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        return None"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    def _get_iscsi_devices(self):"},{"line_number":627,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_81d3ac5e","line":624,"updated":"2014-12-14 09:17:48.000000000","message":"you do not need this. by default None is returned","commit_id":"a30d5ebee733bfc555a792f107b07599e5f27f38"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _iterate_multiple_targets(self, iscsi_properties, ips_iqns_luns):"},{"line_number":283,"context_line":"        for ip, iqn, lun in ips_iqns_luns:"},{"line_number":284,"context_line":"            props \u003d iscsi_properties.copy()"},{"line_number":285,"context_line":"            props[\u0027target_portal\u0027] \u003d ip"},{"line_number":286,"context_line":"            props[\u0027target_iqn\u0027] \u003d iqn"},{"line_number":287,"context_line":"            props[\u0027target_lun\u0027] \u003d lun"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_f23d52de","line":284,"updated":"2014-12-21 14:50:42.000000000","message":"You will want to use copy.deepcopy() here instead of \u003cdict\u003e.copy() if you want to ensure that iscsi_properties parameter does not get modified.","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                   iscsi_properties.get(\u0027target_luns\u0027, []))"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def _discover_iscsi_portal(self, iscsi_properties):"},{"line_number":296,"context_line":"        if \u0027target_portals\u0027 in iscsi_properties and\\"},{"line_number":297,"context_line":"           \u0027target_iqns\u0027 in iscsi_properties:"},{"line_number":298,"context_line":"            # use targets specified by iscsi_properties"},{"line_number":299,"context_line":"            return zip(iscsi_properties[\u0027target_portals\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_12265ece","line":296,"updated":"2014-12-21 14:50:42.000000000","message":"Would not need a line continuation if you did this:\n\n if all([v in iscsi_properties for v in (\u0027target_portals\u0027, \u0027target_iqns\u0027)]):","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            # multipath should be configured on the nova-compute node,"},{"line_number":322,"context_line":"            # in order to fit storage vendor"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"            ips_iqns \u003d self._discover_iscsi_portal(iscsi_properties)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"            # There are two types of iSCSI multipath devices.  One which shares"},{"line_number":327,"context_line":"            # the same iqn between multiple portals, and the other which use"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_32235abe","line":324,"updated":"2014-12-21 14:50:42.000000000","message":"Might want to pluralize the name of _discover_iscsi_portal() to _discover_iscsi_portals() since that method can return multiple target paths.","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                    same_portal \u003d True"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"            for ip, iqn in ips_iqns:"},{"line_number":345,"context_line":"                props \u003d iscsi_properties.copy()"},{"line_number":346,"context_line":"                props[\u0027target_portal\u0027] \u003d ip.split(\",\")[0]"},{"line_number":347,"context_line":"                if not same_portal:"},{"line_number":348,"context_line":"                    props[\u0027target_iqn\u0027] \u003d iqn"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_522c66ac","line":345,"updated":"2014-12-21 14:50:42.000000000","message":"This code is modifying iscsi_properties because it doesn\u0027t use copy.deepcopy(). Is that intended?","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                self._connect_to_iscsi_portal(props)"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"            self._rescan_iscsi()"},{"line_number":352,"context_line":"            host_devices \u003d self._get_host_devices(iscsi_properties)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        else:"},{"line_number":355,"context_line":"            host_devices \u003d self._get_host_devices(iscsi_properties)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_7229629a","line":352,"updated":"2014-12-21 14:50:42.000000000","message":"This line, and line 355, are identical, and could be pulled above line 319. That said, if this line is relying on the fact that lines 345-348 are modifying iscsi_properties dict, then that might explain why you chose to duplicate this call here. I\u0027d recommend using deepcopy() and not modifying the iscsi_properties parameter like is being done in this method, as it makes it difficult to read and understand (because you need to track the changes in iscsi_properties in the function to understand what the value of the properties will be...","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            self._run_iscsiadm(iscsi_properties, (\"--rescan\",))"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"            tries \u003d tries + 1"},{"line_number":379,"context_line":"            if all(map(lambda x: not os.path.exists(x), host_devices)):"},{"line_number":380,"context_line":"                time.sleep(tries ** 2)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"        if tries !\u003d 0:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_92196e8a","line":379,"updated":"2014-12-21 14:50:42.000000000","message":"You might want to put an:\n\n else:\n     break\n\nin here, otherwise you will loop twice over the host_devices array issuing calls to os.path.exists() for each, twice in a row (the second will be the while (...) loop)","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        return None"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def _get_multipath_device_name_list(self, single_path_devices):"},{"line_number":630,"context_line":"        for dev in single_path_devices:"},{"line_number":631,"context_line":"            mpath_device \u003d self._get_multipath_device_name(dev)"},{"line_number":632,"context_line":"            if mpath_device:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_b21e6a6e","line":629,"updated":"2014-12-21 14:50:42.000000000","message":"This method is named _get_multipath_device_name_list(), but it returns a scalar/singular value, not a list. Perhaps you meant to name the method _get_first_multipath_device_from_list()?","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8988862d67da213f1597e38d16578a8478c63e22","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        luns \u003d {}"},{"line_number":645,"context_line":"        for iqn, lun in zip(iscsi_properties.get(\u0027target_iqns\u0027, []),"},{"line_number":646,"context_line":"                            iscsi_properties.get(\u0027target_luns\u0027, [])):"},{"line_number":647,"context_line":"            luns[iqn] \u003d lun"},{"line_number":648,"context_line":"        # Loop through ips_iqns to construct all paths"},{"line_number":649,"context_line":"        iqn_luns \u003d []"},{"line_number":650,"context_line":"        for ip, iqn in ips_iqns:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_d20f7637","line":647,"updated":"2014-12-21 14:50:42.000000000","message":"Alternately:\n\n luns \u003d dict(zip(iscsi_properties.get(\u0027target_iqns\u0027, []),\n                 iscsi_properties.get(\u0027target_luns\u0027, [])))","commit_id":"991e855ebe3f67f7ea4ea3b5c1edd1c6705bcca9"},{"author":{"_account_id":12088,"name":"Anish Bhatt","email":"anish.7@gmail.com","username":"anish"},"change_message_id":"fa62b810b3cfc28fed9e10398bd05e303c170940","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        multipath_targets \u003d self._multipath_targets(iscsi_properties)"},{"line_number":711,"context_line":"        if multipath_targets:"},{"line_number":712,"context_line":"            return [\"/dev/disk/by-path/ip-%s-iscsi-%s-lun-%s\" % x for x in"},{"line_number":713,"context_line":"                    multipath_targets]"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        return [\"/dev/disk/by-path/ip-%s-iscsi-%s-lun-%s\" %"},{"line_number":716,"context_line":"                (iscsi_properties[\u0027target_portal\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_2ea799bd","line":713,"updated":"2015-01-14 20:38:18.000000000","message":"We have clashing changes, and they both hit the same function. Essentially, device name can have a \u0027pci-0000:00.00.00\u0027 prefix, addressed in :\nhttps://review.openstack.org/#/c/146233/","commit_id":"f2b5009670b306c57dc44dce272d56490256909c"}]}
