)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"1897ba7a12ca3de7e85538e877f27cc5b1fb8980","unresolved":false,"context_lines":[{"line_number":16,"context_line":"target IQN, so nova-compute cannot establish multiple sessions for"},{"line_number":17,"context_line":"the target(s). To enable nova-compute to login to secondary portals,"},{"line_number":18,"context_line":"cinder should tell all the portal addresses and corresponding"},{"line_number":19,"context_line":"target iqns/luns."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"With this patch initialize_connection API will return connection_info"},{"line_number":22,"context_line":"with multiple portal addresses/iqns/luns when multipath\u003dTrue is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a961159_bc0746c9","line":19,"updated":"2014-12-11 04:24:12.000000000","message":"You mention nova-compute here a lot, which is fine, but we also have to have all the same support in brick for copy volume \u003c--\u003e image functions in Cinder.","commit_id":"dfc81dfa0518203c569c264db7e55fcf13635228"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"1897ba7a12ca3de7e85538e877f27cc5b1fb8980","unresolved":false,"context_lines":[{"line_number":19,"context_line":"target iqns/luns."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"With this patch initialize_connection API will return connection_info"},{"line_number":22,"context_line":"with multiple portal addresses/iqns/luns when multipath\u003dTrue is"},{"line_number":23,"context_line":"specified in the connector info. For example:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"  {\"driver_volume_type\": \"iscsi\","}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a961159_5cf822c3","line":22,"updated":"2014-12-11 04:24:12.000000000","message":"the multipath test needs to happen in brick as well for\ncopy volume \u003c---\u003e image operations.","commit_id":"dfc81dfa0518203c569c264db7e55fcf13635228"}],"cinder/brick/initiator/connector.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"88e32aa7e37edd664c9a406267c35341e6a05b96","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self._linuxscsi.set_execute(execute)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def _discover_iscsi_portal(self, connection_properties):"},{"line_number":187,"context_line":"        if \u0027target_portal_secondary\u0027 in connection_properties:"},{"line_number":188,"context_line":"            # use targets specified by connection_properties"},{"line_number":189,"context_line":"            return zip([connection_properties[\u0027target_portal\u0027]] +"},{"line_number":190,"context_line":"                       connection_properties[\u0027target_portal_secondary\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_98b31809","line":187,"updated":"2014-11-18 07:41:33.000000000","message":"Should check if \u0027target_iqn_secondary\" is in connection_properties as well.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"749de8e9d9a66fa65391b2feb28ed70c6af440d0","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self._linuxscsi.set_execute(execute)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def _discover_iscsi_portal(self, connection_properties):"},{"line_number":187,"context_line":"        if \u0027target_portal_secondary\u0027 in connection_properties:"},{"line_number":188,"context_line":"            # use targets specified by connection_properties"},{"line_number":189,"context_line":"            return zip([connection_properties[\u0027target_portal\u0027]] +"},{"line_number":190,"context_line":"                       connection_properties[\u0027target_portal_secondary\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_f0b97e16","line":187,"in_reply_to":"5a890539_98b31809","updated":"2014-11-18 17:45:05.000000000","message":"Agreed. I\u0027ll fix this in next patch.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"88e32aa7e37edd664c9a406267c35341e6a05b96","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        tries \u003d 0"},{"line_number":239,"context_line":"        while all(map(lambda x: not os.path.exists(x), host_devices)):"},{"line_number":240,"context_line":"            if tries \u003e\u003d self.device_scan_attempts:"},{"line_number":241,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dhost_devices)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            LOG.warn(_(\"ISCSI volume not yet found at: %(host_device)s. \""},{"line_number":244,"context_line":"                       \"Will rescan \u0026 retry.  Try number: %(tries)s\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_9b7b127a","line":241,"updated":"2014-11-18 07:41:33.000000000","message":"Before this change, if there are 2 paths and only 1 is available, connect volume can still succeed.  \n\nAfter this change, both paths need to be available for connect volume to succeed.  I think this is fine.  So we want to make sure that all paths are valid when the volume is first connected.  Can you please add a comment here?","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"749de8e9d9a66fa65391b2feb28ed70c6af440d0","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        tries \u003d 0"},{"line_number":239,"context_line":"        while all(map(lambda x: not os.path.exists(x), host_devices)):"},{"line_number":240,"context_line":"            if tries \u003e\u003d self.device_scan_attempts:"},{"line_number":241,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dhost_devices)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            LOG.warn(_(\"ISCSI volume not yet found at: %(host_device)s. \""},{"line_number":244,"context_line":"                       \"Will rescan \u0026 retry.  Try number: %(tries)s\"),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_1081aa4d","line":241,"in_reply_to":"5a890539_9b7b127a","updated":"2014-11-18 17:45:05.000000000","message":"it is very confusing, but this means:\n\n  while all the paths don\u0027t exist:\n\nIn other words, if there is at least 1 path available, this loop is skipped.\nAnyway, I\u0027ll add a comment here explaining this.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9924,"name":"Jeegn Chen","email":"Jeegn.Chen@emc.com","username":"jeegn-chen"},"change_message_id":"25c2407d4b1d76e51235bafae7524732477e1b23","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        # choose an accessible host device"},{"line_number":299,"context_line":"        for dev in host_devices:"},{"line_number":300,"context_line":"            if os.path.exists(dev):"},{"line_number":301,"context_line":"                host_device \u003d dev"},{"line_number":302,"context_line":"                break"},{"line_number":303,"context_line":"        multipath_device \u003d None"},{"line_number":304,"context_line":"        if self.use_multipath:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_decf2356","line":301,"updated":"2014-11-19 01:21:35.000000000","message":"For single path scenario, this check should be enough.\n\nBut in multipath scenario, there is chance that the dev exists but the network connection is broken before disconnect due to some reason. As a result, \"multipath -ll /dev/\u003cdev\u003e\" will not be able to return any paths and thus the following remove_multipath_device may do nothing and leave faulty device behind.\n\nSo in multipath scenario, it might be better to check whether \"multipath -ll /dev/\u003cdev\u003e\" can return paths.","commit_id":"d1453da37e5ce810f4394496d41995e87ab96917"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"c3ea28788208bfb3bfb2685bc885d2b0859b24b8","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            if tries \u003e\u003d self.device_scan_attempts:"},{"line_number":239,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dhost_devices)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            LOG.warn(_(\"ISCSI volume not yet found at: %(host_device)s. \""},{"line_number":242,"context_line":"                       \"Will rescan \u0026 retry.  Try number: %(tries)s\"),"},{"line_number":243,"context_line":"                     {\u0027host_device\u0027: host_devices,"},{"line_number":244,"context_line":"                      \u0027tries\u0027: tries})"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_b53c49c0","line":241,"updated":"2014-12-05 02:33:49.000000000","message":"_LW is currently what we put in front of the warning message.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2653221b9a6de79cd28f881806c8ebbd3dec6068","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            if tries \u003e\u003d self.device_scan_attempts:"},{"line_number":239,"context_line":"                raise exception.VolumeDeviceNotFound(device\u003dhost_devices)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            LOG.warn(_(\"ISCSI volume not yet found at: %(host_device)s. \""},{"line_number":242,"context_line":"                       \"Will rescan \u0026 retry.  Try number: %(tries)s\"),"},{"line_number":243,"context_line":"                     {\u0027host_device\u0027: host_devices,"},{"line_number":244,"context_line":"                      \u0027tries\u0027: tries})"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_539073ed","line":241,"in_reply_to":"5a890539_b53c49c0","updated":"2014-12-06 07:13:13.000000000","message":"Yes.  _LW is needed for warning message.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"c3ea28788208bfb3bfb2685bc885d2b0859b24b8","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            LOG.warn(_(\"ISCSI volume not yet found at: %(host_device)s. \""},{"line_number":242,"context_line":"                       \"Will rescan \u0026 retry.  Try number: %(tries)s\"),"},{"line_number":243,"context_line":"                     {\u0027host_device\u0027: host_devices,"},{"line_number":244,"context_line":"                      \u0027tries\u0027: tries})"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"            # The rescan isn\u0027t documented as being necessary(?), but it helps"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_b5aa89cf","line":243,"updated":"2014-12-05 02:33:49.000000000","message":"(host_device)s \u003d \u003e(host_devices)s,\n\u0027host_device\u0027 \u003d\u003e\u0027host_devices\u0027 , since it has been change to pl.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"c3ea28788208bfb3bfb2685bc885d2b0859b24b8","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        if tries !\u003d 0:"},{"line_number":254,"context_line":"            LOG.debug(\"Found iSCSI node %(host_device)s \""},{"line_number":255,"context_line":"                      \"(after %(tries)s rescans)\","},{"line_number":256,"context_line":"                      {\u0027host_device\u0027: host_devices, \u0027tries\u0027: tries})"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        # choose an accessible host device"},{"line_number":259,"context_line":"        for dev in host_devices:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_55796580","line":256,"updated":"2014-12-05 02:33:49.000000000","message":"\u0027host_device\u0027 \u003d\u003e\u0027host_devices\u0027 \n(host_device)s  \u003d \u003e(host_devices)s","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"02796b934ff82f1089426645530e30077c9b42a4","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        # will reappear after rescan."},{"line_number":288,"context_line":"        self._rescan_iscsi()"},{"line_number":289,"context_line":"        host_devices \u003d self._get_device_path(connection_properties)"},{"line_number":290,"context_line":"        multipath_device \u003d None"},{"line_number":291,"context_line":"        # choose an accessible host device"},{"line_number":292,"context_line":"        for dev in host_devices:"},{"line_number":293,"context_line":"            if os.path.exists(dev):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_55f085fc","line":290,"updated":"2014-12-05 02:35:50.000000000","message":"Shall we put a host_device \u003d None here?\nBecause Line 304 we use this param. If it is set before, it is possible error will raise.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"02796b934ff82f1089426645530e30077c9b42a4","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        if self.use_multipath:"},{"line_number":302,"context_line":"            self._rescan_multipath()"},{"line_number":303,"context_line":"            if multipath_device:"},{"line_number":304,"context_line":"                device_realpath \u003d os.path.realpath(host_device)"},{"line_number":305,"context_line":"                self._linuxscsi.remove_multipath_device(device_realpath)"},{"line_number":306,"context_line":"                return self._disconnect_volume_multipath_iscsi("},{"line_number":307,"context_line":"                    connection_properties, multipath_device)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_f56331a8","line":304,"updated":"2014-12-05 02:35:50.000000000","message":"What if we got no host_device set before?","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"1897ba7a12ca3de7e85538e877f27cc5b1fb8980","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        props[\u0027wwpns\u0027] \u003d wwpns"},{"line_number":54,"context_line":"    wwnns \u003d fc.get_fc_wwnns()"},{"line_number":55,"context_line":"    if wwnns:"},{"line_number":56,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    return props"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_5c4ae226","line":56,"updated":"2014-12-11 04:24:12.000000000","message":"I think you need to add the test to set the multipath\u003dTrue/False if the multipath daemon is installed and running on the system.","commit_id":"dfc81dfa0518203c569c264db7e55fcf13635228"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"3837cd7e52220ba68b9423e8e0c780812a7d6e86","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        props[\u0027wwpns\u0027] \u003d wwpns"},{"line_number":54,"context_line":"    wwnns \u003d fc.get_fc_wwnns()"},{"line_number":55,"context_line":"    if wwnns:"},{"line_number":56,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    return props"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_3bc97c26","line":56,"in_reply_to":"3a961159_5c4ae226","updated":"2014-12-12 00:05:20.000000000","message":"Added the test for multipath daemon running.","commit_id":"dfc81dfa0518203c569c264db7e55fcf13635228"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"a070e40fb29f0eebd5dbdff4450f9089311fde65","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":43,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":44,"context_line":"        LOG.warn(_LW(\u0027multipathd is not running (exit code %s): \u0027"},{"line_number":45,"context_line":"                     \u0027disabling multipath.\u0027), {\u0027err\u0027: err.exit_code})"},{"line_number":46,"context_line":"        return False"},{"line_number":47,"context_line":"    return True"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_38f6a25d","line":45,"updated":"2014-12-15 06:03:15.000000000","message":"This probably should be an info, not a warning.  \n\nAlso, what if multipathd isn\u0027t installed?","commit_id":"0d604b1ee313d1e1b6662a516cbd9626f39a5338"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e01e250ce49b2fdea4c1b22141c46f0a5b0c4c67","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":43,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":44,"context_line":"        LOG.warn(_LW(\u0027multipathd is not running (exit code %s): \u0027"},{"line_number":45,"context_line":"                     \u0027disabling multipath.\u0027), {\u0027err\u0027: err.exit_code})"},{"line_number":46,"context_line":"        return False"},{"line_number":47,"context_line":"    return True"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_73258f5b","line":45,"in_reply_to":"3a961159_38f6a25d","updated":"2014-12-15 20:44:00.000000000","message":"I think it would be better to be a warn so that admin can notice that multipath is not used even though they enabled the multipath in configs.\n\nWhen multipathd is not installed, execute() raises ProcessExecutionError, so this returns False.","commit_id":"0d604b1ee313d1e1b6662a516cbd9626f39a5338"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"a070e40fb29f0eebd5dbdff4450f9089311fde65","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if wwnns:"},{"line_number":67,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":68,"context_line":"    if multipath and is_multipathd_running(root_helper):"},{"line_number":69,"context_line":"        props[\u0027multipath\u0027] \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    return props"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_989eb605","line":69,"updated":"2014-12-15 06:03:15.000000000","message":"else:\n   props[\u0027multipath\u0027] \u003d False","commit_id":"0d604b1ee313d1e1b6662a516cbd9626f39a5338"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e01e250ce49b2fdea4c1b22141c46f0a5b0c4c67","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if wwnns:"},{"line_number":67,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":68,"context_line":"    if multipath and is_multipathd_running(root_helper):"},{"line_number":69,"context_line":"        props[\u0027multipath\u0027] \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    return props"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_f3189f20","line":69,"in_reply_to":"3a961159_989eb605","updated":"2014-12-15 20:44:00.000000000","message":"OK I\u0027ll add this in next version.","commit_id":"0d604b1ee313d1e1b6662a516cbd9626f39a5338"},{"author":{"_account_id":10439,"name":"Xi Yang","email":"yang.xi@99cloud.net","username":"phenom"},"change_message_id":"04f8a1b0cd2f38294e01824ad5854802d933bad8","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def is_multipathd_running(root_helper):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        putils.execute(\u0027multipathd\u0027, \u0027show\u0027, \u0027status\u0027,"},{"line_number":43,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":44,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":45,"context_line":"        LOG.info(_LI(\u0027multipathd is not running (exit code %s): \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_f4c0972c","line":42,"updated":"2015-01-09 06:16:58.000000000","message":"Do you add the multipathd command to file \u0027cinder/etc/rootwrap.d/volume.filters\u0027 ?\nOtherwise this command will always return failure.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":10439,"name":"Xi Yang","email":"yang.xi@99cloud.net","username":"phenom"},"change_message_id":"af50030b1f3a40a86048bb49da23c567981c1cc5","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def is_multipathd_running(root_helper):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        putils.execute(\u0027multipathd\u0027, \u0027show\u0027, \u0027status\u0027,"},{"line_number":43,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":44,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":45,"context_line":"        LOG.info(_LI(\u0027multipathd is not running (exit code %s): \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_efc0a07f","line":42,"in_reply_to":"3a961159_06296e9b","updated":"2015-01-12 02:42:18.000000000","message":"ok, i see. Another question (just a question), i didn\u0027t see you check multipathd\u0027s status in the nova side change (https://review.openstack.org/#/c/134683/). Did i miss it?","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"8458f33aa67c23d415730789a51cf2abb899d76e","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def is_multipathd_running(root_helper):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        putils.execute(\u0027multipathd\u0027, \u0027show\u0027, \u0027status\u0027,"},{"line_number":43,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":44,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":45,"context_line":"        LOG.info(_LI(\u0027multipathd is not running (exit code %s): \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_f3a309af","line":42,"in_reply_to":"3a961159_efc0a07f","updated":"2015-01-12 22:24:41.000000000","message":"The changes for nova was not published yet. I have added the nova change to is_multipathd_running check. Thank you for pointing this out.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"72cefa0d435a09fa64818d81afbe5abac330ed34","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def is_multipathd_running(root_helper):"},{"line_number":41,"context_line":"    try:"},{"line_number":42,"context_line":"        putils.execute(\u0027multipathd\u0027, \u0027show\u0027, \u0027status\u0027,"},{"line_number":43,"context_line":"                       run_as_root\u003dTrue, root_helper\u003droot_helper)"},{"line_number":44,"context_line":"    except putils.ProcessExecutionError as err:"},{"line_number":45,"context_line":"        LOG.info(_LI(\u0027multipathd is not running (exit code %s): \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_06296e9b","line":42,"in_reply_to":"3a961159_f4c0972c","updated":"2015-01-09 17:24:33.000000000","message":"Yes, please see:\n  https://review.openstack.org/#/c/134681/16/etc/cinder/rootwrap.d/volume.filters","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":7860,"name":"Ryan Lucio","email":"ryan.lucio@fireeye.com","username":"rlucio"},"change_message_id":"20f9a6cc718c8f16eee8ccd46751d2b8e9f935d3","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        # choose an accessible host device"},{"line_number":300,"context_line":"        for dev in host_devices:"},{"line_number":301,"context_line":"            if os.path.exists(dev):"},{"line_number":302,"context_line":"                host_device \u003d dev"},{"line_number":303,"context_line":"                break"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        if self.use_multipath:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_e765044a","line":302,"updated":"2015-01-13 00:49:19.000000000","message":"If self.use_multipath is false and the path for the (single) device in host_devices was not found then host_device will not be defined for assignment to device_info[\u0027path\u0027] later in the function.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"b7a0a32769610c1ecddf4108abff82f0a1252eec","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        # choose an accessible host device"},{"line_number":300,"context_line":"        for dev in host_devices:"},{"line_number":301,"context_line":"            if os.path.exists(dev):"},{"line_number":302,"context_line":"                host_device \u003d dev"},{"line_number":303,"context_line":"                break"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        if self.use_multipath:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_6d2735b6","line":302,"in_reply_to":"3a961159_e765044a","updated":"2015-01-13 16:20:12.000000000","message":"When none of paths are found, exception.VolumeDeviceNotFound is raised in the loop above, and it doesn\u0027t come here, in both cases self.use_multipath is True or False. That is, at least a path should exists here.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":7860,"name":"Ryan Lucio","email":"ryan.lucio@fireeye.com","username":"rlucio"},"change_message_id":"20f9a6cc718c8f16eee8ccd46751d2b8e9f935d3","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            # choose an accessible host device"},{"line_number":334,"context_line":"            for dev in host_devices:"},{"line_number":335,"context_line":"                if os.path.exists(dev):"},{"line_number":336,"context_line":"                    host_device \u003d dev"},{"line_number":337,"context_line":"                    multipath_device \u003d self._get_multipath_device_name("},{"line_number":338,"context_line":"                        host_device)"},{"line_number":339,"context_line":"                    if multipath_device:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_c7ad6834","line":336,"updated":"2015-01-13 00:49:19.000000000","message":"Again, the host_device variable will not be defined if no path is found.  The block to throw an exception will not work because referring to host_device will throw a nameerror.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"b7a0a32769610c1ecddf4108abff82f0a1252eec","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            # choose an accessible host device"},{"line_number":334,"context_line":"            for dev in host_devices:"},{"line_number":335,"context_line":"                if os.path.exists(dev):"},{"line_number":336,"context_line":"                    host_device \u003d dev"},{"line_number":337,"context_line":"                    multipath_device \u003d self._get_multipath_device_name("},{"line_number":338,"context_line":"                        host_device)"},{"line_number":339,"context_line":"                    if multipath_device:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_ed6085d2","line":336,"in_reply_to":"3a961159_c7ad6834","updated":"2015-01-13 16:20:12.000000000","message":"It\u0027s problematic here. Thank you for pointing this out. I will fix this.","commit_id":"5006517e53722b3e4634a3ca495f2a5344f7b983"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"a5b2559438866c4e3db91971653d7a91a0abf647","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if wwnns:"},{"line_number":67,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":68,"context_line":"    if multipath:"},{"line_number":69,"context_line":"        _check_multipathd_running(root_helper)"},{"line_number":70,"context_line":"        props[\u0027multipath\u0027] \u003d True"},{"line_number":71,"context_line":"    else:"},{"line_number":72,"context_line":"        props[\u0027multipath\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_f99af16c","line":69,"updated":"2015-02-03 05:27:25.000000000","message":"this raises an exception if multipathd isn\u0027t running.  You\u0027ll need to wrap this in a try block, to properly set multipath \u003d False on exception.","commit_id":"c85603eb78efe830fd42f6528e70eedaddd771c9"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"8ec87577f1208f38187746bc998da981b274f6eb","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    if wwnns:"},{"line_number":67,"context_line":"        props[\u0027wwnns\u0027] \u003d wwnns"},{"line_number":68,"context_line":"    if multipath:"},{"line_number":69,"context_line":"        _check_multipathd_running(root_helper)"},{"line_number":70,"context_line":"        props[\u0027multipath\u0027] \u003d True"},{"line_number":71,"context_line":"    else:"},{"line_number":72,"context_line":"        props[\u0027multipath\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":19,"id":"da86d52c_94dd3c73","line":69,"in_reply_to":"da86d52c_f99af16c","updated":"2015-02-03 06:09:40.000000000","message":"As talked on IRC, I will add an \u0027enforce_multipath\u003dTrue|False\u0027 parameter.\n\nIf True, it raise an exception to abort the process when multipathd is not running. This will be good for nova because multipath directly affects instances reliability.\n\nIf False, it will fallback to multipath \u003d False when multipathd is not running. This is more like current Cinder\u0027s behavior, and nice for cinder because it uses multipath for quick image/volume copy.","commit_id":"c85603eb78efe830fd42f6528e70eedaddd771c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"58ea5dfabec8a57980e2a70055993844183c6bb3","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                      \"(after %(tries)s rescans)\","},{"line_number":297,"context_line":"                      {\u0027host_devices\u0027: host_devices, \u0027tries\u0027: tries})"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # choose an accessible host device"},{"line_number":300,"context_line":"        host_device \u003d next(dev for dev in host_devices if os.path.exists(dev))"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        if self.use_multipath:"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa81d914_e01d0275","line":299,"updated":"2015-01-28 13:21:29.000000000","message":"Please start upper case if updating again.","commit_id":"c85603eb78efe830fd42f6528e70eedaddd771c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"58ea5dfabec8a57980e2a70055993844183c6bb3","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            self._rescan_multipath()"},{"line_number":329,"context_line":"            host_device \u003d multipath_device \u003d None"},{"line_number":330,"context_line":"            host_devices \u003d self._get_device_path(connection_properties)"},{"line_number":331,"context_line":"            # choose an accessible host device"},{"line_number":332,"context_line":"            for dev in host_devices:"},{"line_number":333,"context_line":"                if os.path.exists(dev):"},{"line_number":334,"context_line":"                    host_device \u003d dev"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa81d914_60091231","line":331,"updated":"2015-01-28 13:21:29.000000000","message":"Same","commit_id":"c85603eb78efe830fd42f6528e70eedaddd771c9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4303a0a87582a4ae6644cd4d25e51fc3d62129d1","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return True"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_connector_properties(root_helper, my_ip, multipath, enforce_multipath):"},{"line_number":55,"context_line":"    \"\"\"Get the connection properties for all protocols."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    When the connector wants to use multipath, multipath\u003dTrue should be"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_47e0ef28","line":54,"updated":"2015-02-05 20:49:30.000000000","message":"The enforce_multipath flag is set to False everywhere in this patch. Is the intend for the driver to override this if needed? Shouldn\u0027t this be a configurable option like the use_multipath_for_image_xfer flag in cinder.conf?","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"8189d95d2b12744ae39b7ee946d6cbe7878c542d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return True"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_connector_properties(root_helper, my_ip, multipath, enforce_multipath):"},{"line_number":55,"context_line":"    \"\"\"Get the connection properties for all protocols."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    When the connector wants to use multipath, multipath\u003dTrue should be"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_e29b9115","line":54,"in_reply_to":"da86d52c_47e0ef28","updated":"2015-02-05 21:26:03.000000000","message":"\u0027enforce_multipath\u003dTrue\u0027 is intended for Nova to use this as brick library. In Nova, multipath directly affects the reliability of instances, it must not silently fall back to single path. However, for cinder, the multipath is used for quick image\u003c-\u003evolume copy, The session is soon detached after the copy, so the fallback to single path is usually desirable.\n\nBut I am okey to add the cinder.conf option to configure this if anyone have use-cases to disable the fallback in cinder. How do you think?","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e65c74419993964a1cc3a894aafa4947ce8a966b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return True"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_connector_properties(root_helper, my_ip, multipath, enforce_multipath):"},{"line_number":55,"context_line":"    \"\"\"Get the connection properties for all protocols."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    When the connector wants to use multipath, multipath\u003dTrue should be"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_fd7b3478","line":54,"in_reply_to":"da86d52c_5d11a050","updated":"2015-02-05 21:35:30.000000000","message":"OK, then I will add a config option \u0027use_multipath_for_image_xfer \u003dTrue|False\u0027 to configure whether multipath is required.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ce19411d42c79a0d489978728267cd5a0830a381","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return True"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def get_connector_properties(root_helper, my_ip, multipath, enforce_multipath):"},{"line_number":55,"context_line":"    \"\"\"Get the connection properties for all protocols."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    When the connector wants to use multipath, multipath\u003dTrue should be"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_5d11a050","line":54,"in_reply_to":"da86d52c_e29b9115","updated":"2015-02-05 21:30:16.000000000","message":"Actually for our driver, multipath should be enforced. Otherwise create boot volume doesn\u0027t work properly.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ce19411d42c79a0d489978728267cd5a0830a381","unresolved":false,"context_lines":[{"line_number":233,"context_line":"    def _discover_iscsi_portals(self, connection_properties):"},{"line_number":234,"context_line":"        if all([key in connection_properties for key in (\u0027target_portals\u0027,"},{"line_number":235,"context_line":"                                                         \u0027target_iqns\u0027)]):"},{"line_number":236,"context_line":"            # use targets specified by connection_properties"},{"line_number":237,"context_line":"            return zip(connection_properties[\u0027target_portals\u0027],"},{"line_number":238,"context_line":"                       connection_properties[\u0027target_iqns\u0027])"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_47054f44","line":236,"updated":"2015-02-05 21:30:16.000000000","message":"Use upper case for the first letter.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e65c74419993964a1cc3a894aafa4947ce8a966b","unresolved":false,"context_lines":[{"line_number":233,"context_line":"    def _discover_iscsi_portals(self, connection_properties):"},{"line_number":234,"context_line":"        if all([key in connection_properties for key in (\u0027target_portals\u0027,"},{"line_number":235,"context_line":"                                                         \u0027target_iqns\u0027)]):"},{"line_number":236,"context_line":"            # use targets specified by connection_properties"},{"line_number":237,"context_line":"            return zip(connection_properties[\u0027target_portals\u0027],"},{"line_number":238,"context_line":"                       connection_properties[\u0027target_iqns\u0027])"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_1df648f9","line":236,"in_reply_to":"da86d52c_47054f44","updated":"2015-02-05 21:35:30.000000000","message":"And I\u0027ll fix these comments too.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ce19411d42c79a0d489978728267cd5a0830a381","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            return zip(connection_properties[\u0027target_portals\u0027],"},{"line_number":238,"context_line":"                       connection_properties[\u0027target_iqns\u0027])"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        # discover and return every available target"},{"line_number":241,"context_line":"        out \u003d self._run_iscsiadm_bare([\u0027-m\u0027,"},{"line_number":242,"context_line":"                                       \u0027discovery\u0027,"},{"line_number":243,"context_line":"                                       \u0027-t\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_87fbc745","line":240,"updated":"2015-02-05 21:30:16.000000000","message":"Here too.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ce19411d42c79a0d489978728267cd5a0830a381","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            self._rescan_multipath()"},{"line_number":339,"context_line":"            host_device \u003d multipath_device \u003d None"},{"line_number":340,"context_line":"            host_devices \u003d self._get_device_path(connection_properties)"},{"line_number":341,"context_line":"            # choose an accessible host device"},{"line_number":342,"context_line":"            for dev in host_devices:"},{"line_number":343,"context_line":"                if os.path.exists(dev):"},{"line_number":344,"context_line":"                    host_device \u003d dev"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_27b93b79","line":341,"updated":"2015-02-05 21:30:16.000000000","message":"Upper","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"}],"cinder/tests/brick/test_brick_connector.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd19d3952fb066df8e77360d889f8f4a4e41fb25","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            cmd_format \u003d \u0027iscsiadm -m node -T %s -p %s --%s\u0027"},{"line_number":270,"context_line":"            expected_commands \u003d [cmd_format % (iqn1, location1, \u0027login\u0027),"},{"line_number":271,"context_line":"                                 cmd_format % (iqn2, location2, \u0027login\u0027)]"},{"line_number":272,"context_line":"            self.assertEqual(result, expected_result)"},{"line_number":273,"context_line":"            for command in expected_commands:"},{"line_number":274,"context_line":"                self.assertIn(command, self.cmds)"},{"line_number":275,"context_line":"            mock_device_name.assert_called_once_with(devs[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_58748735","line":272,"updated":"2014-11-15 03:47:38.000000000","message":"This is reversed. The order should be expected, actual.","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"192af11ae52bcbbf5e9f29787412a677173df44d","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            cmd_format \u003d \u0027iscsiadm -m node -T %s -p %s --%s\u0027"},{"line_number":270,"context_line":"            expected_commands \u003d [cmd_format % (iqn1, location1, \u0027login\u0027),"},{"line_number":271,"context_line":"                                 cmd_format % (iqn2, location2, \u0027login\u0027)]"},{"line_number":272,"context_line":"            self.assertEqual(result, expected_result)"},{"line_number":273,"context_line":"            for command in expected_commands:"},{"line_number":274,"context_line":"                self.assertIn(command, self.cmds)"},{"line_number":275,"context_line":"            mock_device_name.assert_called_once_with(devs[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_ddc925ad","line":272,"in_reply_to":"5a890539_58748735","updated":"2014-11-17 17:32:19.000000000","message":"Done","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"c3ea28788208bfb3bfb2685bc885d2b0859b24b8","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                    raise putils.ProcessExecutionError(None, None, 21)"},{"line_number":315,"context_line":"            return mock.DEFAULT"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        with contextlib.nested("},{"line_number":318,"context_line":"            mock.patch.object(os.path, \u0027exists\u0027,"},{"line_number":319,"context_line":"                              side_effect\u003dlambda x: x !\u003d dev1),"},{"line_number":320,"context_line":"            mock.patch.object(self.connector_with_multipath.driver,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_3a1cc676","line":317,"updated":"2014-12-05 02:33:49.000000000","message":"Just one suggestion to remove contextlib.nested: You can use the decorator @mock.patch.object or @mock.patch(depending on a method or a class) on top of this method, which can remove the nested structure. I think you can find enough references in other test cases.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"58ea5dfabec8a57980e2a70055993844183c6bb3","unresolved":false,"context_lines":[{"line_number":1006,"context_line":"                             \u0027 -v volume-b2911673-863c-4380-a5f2-e1729eecfe3f\u0027]"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"        LOG.debug(\"self.cmds \u003d %s.\" % self.cmds)"},{"line_number":1009,"context_line":"        LOG.debug(\"expected \u003d %s.\" % expected_commands)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa81d914_5b37a3e3","line":1009,"updated":"2015-01-28 13:21:29.000000000","message":"If updating, please change % to ,","commit_id":"c85603eb78efe830fd42f6528e70eedaddd771c9"}],"cinder/tests/test_volume.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd19d3952fb066df8e77360d889f8f4a4e41fb25","unresolved":false,"context_lines":[{"line_number":4042,"context_line":"        self.assertEqual(result[\"target_iqn\"], \"iqn:iqn\")"},{"line_number":4043,"context_line":"        self.assertEqual(result[\"target_iqn_secondary\"], [\"iqn:iqn\"])"},{"line_number":4044,"context_line":"        self.assertEqual(result[\"target_lun\"], 0)"},{"line_number":4045,"context_line":"        self.assertEqual(result[\"target_lun_secondary\"], [0])"},{"line_number":4046,"context_line":""},{"line_number":4047,"context_line":"    def test_get_volume_stats(self):"},{"line_number":4048,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_98918f49","line":4045,"updated":"2014-11-15 03:47:38.000000000","message":"the order should be expected, actual.  These are all reversed.","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"192af11ae52bcbbf5e9f29787412a677173df44d","unresolved":false,"context_lines":[{"line_number":4042,"context_line":"        self.assertEqual(result[\"target_iqn\"], \"iqn:iqn\")"},{"line_number":4043,"context_line":"        self.assertEqual(result[\"target_iqn_secondary\"], [\"iqn:iqn\"])"},{"line_number":4044,"context_line":"        self.assertEqual(result[\"target_lun\"], 0)"},{"line_number":4045,"context_line":"        self.assertEqual(result[\"target_lun_secondary\"], [0])"},{"line_number":4046,"context_line":""},{"line_number":4047,"context_line":"    def test_get_volume_stats(self):"},{"line_number":4048,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_bd6459b9","line":4045,"in_reply_to":"5a890539_98918f49","updated":"2014-11-17 17:32:19.000000000","message":"Done","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"}],"cinder/utils.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4303a0a87582a4ae6644cd4d25e51fc3d62129d1","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"def brick_get_connector_properties(multipath\u003dFalse):"},{"line_number":578,"context_line":"    \"\"\"wrapper for the brick calls to automatically set"},{"line_number":579,"context_line":"    the root_helper needed for cinder."},{"line_number":580,"context_line":"    \"\"\""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    root_helper \u003d get_root_helper()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_2c5da079","line":579,"updated":"2015-02-05 20:49:30.000000000","message":"Please add description about this new parameter \u0027multipath\u0027.","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"8189d95d2b12744ae39b7ee946d6cbe7878c542d","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"def brick_get_connector_properties(multipath\u003dFalse):"},{"line_number":578,"context_line":"    \"\"\"wrapper for the brick calls to automatically set"},{"line_number":579,"context_line":"    the root_helper needed for cinder."},{"line_number":580,"context_line":"    \"\"\""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    root_helper \u003d get_root_helper()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da86d52c_424e1d3c","line":579,"in_reply_to":"da86d52c_2c5da079","updated":"2015-02-05 21:26:03.000000000","message":"OK I will add description:\n\n\"\"\" :patam multipath: A boolean indicating whether the connector can support    \n                      multipath. Even if multipath\u003dTrue, it falls back to       \n                      multipath\u003dFalse when multipathd is not running.           \n\"\"\"","commit_id":"ca58460ebc47fcb2b4b24b4fb4f1edafc770d357"}],"cinder/volume/driver.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bd19d3952fb066df8e77360d889f8f4a4e41fb25","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        if nr \u003e 1:"},{"line_number":990,"context_line":"            properties[\u0027target_portal_secondary\u0027] \u003d portals[1:]"},{"line_number":991,"context_line":"            properties[\u0027target_iqn_secondary\u0027] \u003d [results[1]] * (nr - 1)"},{"line_number":992,"context_line":"            properties[\u0027target_lun_secondary\u0027] \u003d [lun] * (nr - 1)"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        properties[\u0027volume_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":995,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_58c64769","line":992,"updated":"2014-11-15 03:47:38.000000000","message":"If exception is caught on line 977, is this still right?","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"192af11ae52bcbbf5e9f29787412a677173df44d","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        if nr \u003e 1:"},{"line_number":990,"context_line":"            properties[\u0027target_portal_secondary\u0027] \u003d portals[1:]"},{"line_number":991,"context_line":"            properties[\u0027target_iqn_secondary\u0027] \u003d [results[1]] * (nr - 1)"},{"line_number":992,"context_line":"            properties[\u0027target_lun_secondary\u0027] \u003d [lun] * (nr - 1)"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        properties[\u0027volume_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":995,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_d808532a","line":992,"in_reply_to":"5a890539_58c64769","updated":"2014-11-17 17:32:19.000000000","message":"The exception on line 977 means that we should use default lun for the iscsi helper. And since the addresses are pointing the same iscsi target daemon, it is OK to use the same lun\u0027s.","commit_id":"6602a587fcc557cd3c5b7c946a2f16eb7e00baf6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"88e32aa7e37edd664c9a406267c35341e6a05b96","unresolved":false,"context_lines":[{"line_number":907,"context_line":"            LOG.debug(\"Error from iscsiadm -m discovery: %s\" % ex.stderr)"},{"line_number":908,"context_line":"            return None"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        for target in out.splitlines():"},{"line_number":911,"context_line":"            if (self.configuration.iscsi_ip_address in target"},{"line_number":912,"context_line":"                    and volume_name in target):"},{"line_number":913,"context_line":"                return target"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_f8f5fc82","line":910,"updated":"2014-11-18 07:41:33.000000000","message":"If the first target portal (iscsi_ip_address) is down, could this be unavailable in the discovery output?  Should you check if the 2nd target portal (iscsi_ip_address_secondary) is in target if the first one is not?","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"63a7b14cbba0617f05e03ce7099e59dac717e2c5","unresolved":false,"context_lines":[{"line_number":907,"context_line":"            LOG.debug(\"Error from iscsiadm -m discovery: %s\" % ex.stderr)"},{"line_number":908,"context_line":"            return None"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        for target in out.splitlines():"},{"line_number":911,"context_line":"            if (self.configuration.iscsi_ip_address in target"},{"line_number":912,"context_line":"                    and volume_name in target):"},{"line_number":913,"context_line":"                return target"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_d3d9ec23","line":910,"in_reply_to":"5a890539_3303100f","updated":"2014-11-18 18:01:30.000000000","message":"I think the LVM iSCSI driver uses this method.  Not sure if other drivers use this.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2a858e93dabad2e81697d6874726ce86133d26c3","unresolved":false,"context_lines":[{"line_number":907,"context_line":"            LOG.debug(\"Error from iscsiadm -m discovery: %s\" % ex.stderr)"},{"line_number":908,"context_line":"            return None"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        for target in out.splitlines():"},{"line_number":911,"context_line":"            if (self.configuration.iscsi_ip_address in target"},{"line_number":912,"context_line":"                    and volume_name in target):"},{"line_number":913,"context_line":"                return target"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_e2d9ac23","line":910,"in_reply_to":"5a890539_d3d9ec23","updated":"2014-11-18 20:10:33.000000000","message":"I\u0027ve investigated this. In LVM iSCSI driver, create_export (in cinder/volume/drivers/lvm.py, redirected to the helper method in cinder/volume/iscsi.py) always sets volume[\u0027provider_location\u0027] field before driver\u0027s initialize_connection() method is called, so this _do_iscsi_discovery() should never be called. (In addition, the volumes are CHAP protected, discovery wouldn\u0027t work well.)\n\nAnd no other in-tree drivers use this. dead code?","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"749de8e9d9a66fa65391b2feb28ed70c6af440d0","unresolved":false,"context_lines":[{"line_number":907,"context_line":"            LOG.debug(\"Error from iscsiadm -m discovery: %s\" % ex.stderr)"},{"line_number":908,"context_line":"            return None"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        for target in out.splitlines():"},{"line_number":911,"context_line":"            if (self.configuration.iscsi_ip_address in target"},{"line_number":912,"context_line":"                    and volume_name in target):"},{"line_number":913,"context_line":"                return target"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_3303100f","line":910,"in_reply_to":"5a890539_f8f5fc82","updated":"2014-11-18 17:45:05.000000000","message":"This looks like a deprecated path, sending discovery to volume[\u0027host\u0027] which is usually an address of the host running cinder-volume, not an array. Do any drivers rely on this method?","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a1be45f3f1ced08b2a9a904f29eddf191e21201a","unresolved":false,"context_lines":[{"line_number":969,"context_line":""},{"line_number":970,"context_line":"        results \u003d location.split(\" \")"},{"line_number":971,"context_line":"        portals \u003d results[0].split(\",\")[0].split(\";\")"},{"line_number":972,"context_line":"        nr \u003d len(portals)"},{"line_number":973,"context_line":"        properties[\u0027target_portal\u0027] \u003d portals[0]"},{"line_number":974,"context_line":"        properties[\u0027target_iqn\u0027] \u003d results[1]"},{"line_number":975,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_564ec597","line":972,"updated":"2014-11-18 20:47:14.000000000","message":"Please use a more descriptive variable name here.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"89e9d4b1e852c2f4ec66cadedcc271932dd57abf","unresolved":false,"context_lines":[{"line_number":969,"context_line":""},{"line_number":970,"context_line":"        results \u003d location.split(\" \")"},{"line_number":971,"context_line":"        portals \u003d results[0].split(\",\")[0].split(\";\")"},{"line_number":972,"context_line":"        nr \u003d len(portals)"},{"line_number":973,"context_line":"        properties[\u0027target_portal\u0027] \u003d portals[0]"},{"line_number":974,"context_line":"        properties[\u0027target_iqn\u0027] \u003d results[1]"},{"line_number":975,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_c06bc31d","line":972,"in_reply_to":"5a890539_564ec597","updated":"2014-11-18 23:32:21.000000000","message":"changed to nr_portals.","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2f3e2403db8e9cb4963c6790b7a17344d9f14330","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    cfg.StrOpt(\u0027iscsi_ip_address\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027$my_ip\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027The IP address that the iSCSI daemon is listening on\u0027),"},{"line_number":54,"context_line":"    cfg.ListOpt(\u0027iscsi_ip_addresses_secondary\u0027,"},{"line_number":55,"context_line":"                default\u003d[],"},{"line_number":56,"context_line":"                help\u003d\u0027The list of secondary IP addresses of the iSCSI daemon\u0027),"},{"line_number":57,"context_line":"    cfg.IntOpt(\u0027iscsi_port\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_dca9a6de","line":54,"updated":"2014-11-20 17:06:01.000000000","message":"Maybe \u0027secondary_iscsi_ip_addresses\u0027 will be more user friendly","commit_id":"d1453da37e5ce810f4394496d41995e87ab96917"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2f3e2403db8e9cb4963c6790b7a17344d9f14330","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        :target_secondary_iqns:    the list of iqns corresponding to portals"},{"line_number":932,"context_line":"                                   in target_secondary_portals"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"        :target_secondary_portals:    the list of secondary address of the"},{"line_number":935,"context_line":"                                      portal of the iSCSI target"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"        :target_secondary_luns:    the list of luns corresponding to portals"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_dc6286d8","line":934,"updated":"2014-11-20 17:06:01.000000000","message":"Typo, should be \u0027addresses\u0027","commit_id":"d1453da37e5ce810f4394496d41995e87ab96917"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2653221b9a6de79cd28f881806c8ebbd3dec6068","unresolved":false,"context_lines":[{"line_number":929,"context_line":""},{"line_number":930,"context_line":"        :target_discovered:    boolean indicating whether discovery was used"},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"        :target_iqn:    the IQN of the iSCSI target (only when multipath\u003dFalse)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"        :target_portal:    the portal of the iSCSI target (only when"},{"line_number":935,"context_line":"                           multipath\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_93601b0f","line":932,"updated":"2014-12-06 07:13:13.000000000","message":"For backward compatibility, when multipath\u003dTrue, target_iqn (without \"s\") can still be used.  In the case of creating a boot volume (going thru brick), I think multipath can be True even when target_iqn is used.  This is because drivers that currently support multipathing already have the multipath flag set to True in cinder.conf.  In this case, multipath\u003dTrue but a single target_iqn will be used.","commit_id":"0e03c57538ee3aea5c3b3fbc4185b9c20b17c936"}],"cinder/volume/iscsi.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"cdc5b0ebf62ca742c76fc252c1d69a8c9bdf00e7","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        if ip_secondary is None:"},{"line_number":163,"context_line":"            ip_secondary \u003d []"},{"line_number":164,"context_line":"        portals \u003d map(lambda x: \"%s:%s\" % (x, port), [ip] + ip_secondary)"},{"line_number":165,"context_line":"        return \"%s,%s %s %s\" % (\";\".join(portals), target, iqn, lun)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _fix_id_migration(self, context, volume, vg_name):"},{"line_number":168,"context_line":"        \"\"\"Fix provider_location and dev files to address bug 1065702."}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_836905c0","line":165,"updated":"2014-12-03 23:26:05.000000000","message":"can we use the long form of the string creation here since there are so many %s\u0027s in that string?\n\nreturn (\"%{something}s,%{another}s\" % {\"something\": value, \"another\": blah})","commit_id":"c19cc27248783a9587abda69526ceca8a437e374"}],"cinder/volume/targets/tgt.py":[{"author":{"_account_id":12088,"name":"Anish Bhatt","email":"anish.7@gmail.com","username":"anish"},"change_message_id":"7f56fd5943d150b22552ba636065e6262be6fc17","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _iscsi_location(self, ip, target, iqn, lun\u003dNone, ip_secondary\u003dNone):"},{"line_number":117,"context_line":"        ip_secondary \u003d ip_secondary or []"},{"line_number":118,"context_line":"        port \u003d self.configuration.iscsi_port"},{"line_number":119,"context_line":"        portals \u003d map(lambda x: \"%s:%s\" % (x, port), [ip] + ip_secondary)"},{"line_number":120,"context_line":"        return (\"%(portals)s,%(target)s %(iqn)s %(lun)s\""},{"line_number":121,"context_line":"                % ({\u0027portals\u0027: \";\".join(portals),"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_f10490c7","line":118,"updated":"2015-01-14 21:15:28.000000000","message":"If you have a configurable secondary_ip_address, then shouldn\u0027t secondary port be configurable as well ?","commit_id":"ceae8a78c3491356f61329224f3f53352fb9aee3"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"1dae6ab4b46f7d47d2f5b4cc1f58e30350daa0bc","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _iscsi_location(self, ip, target, iqn, lun\u003dNone, ip_secondary\u003dNone):"},{"line_number":117,"context_line":"        ip_secondary \u003d ip_secondary or []"},{"line_number":118,"context_line":"        port \u003d self.configuration.iscsi_port"},{"line_number":119,"context_line":"        portals \u003d map(lambda x: \"%s:%s\" % (x, port), [ip] + ip_secondary)"},{"line_number":120,"context_line":"        return (\"%(portals)s,%(target)s %(iqn)s %(lun)s\""},{"line_number":121,"context_line":"                % ({\u0027portals\u0027: \";\".join(portals),"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_f1c65015","line":118,"in_reply_to":"3a961159_f10490c7","updated":"2015-01-14 21:28:58.000000000","message":"In this implementation for LVM driver, secondary_ip_address is intended to specify the other IP addresses of a cinder-volume node (except one for  iscsi_ip_address), where Tgtd/LIO/IET will open a single port (3260 by default). So the connector should use the same port to login to the target.","commit_id":"ceae8a78c3491356f61329224f3f53352fb9aee3"}],"etc/cinder/cinder.conf.sample":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"100b878972594db844b233da9747cfed23d197c0","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"# Deprecated group/name - [DATABASE]/sql_max_pool_size"},{"line_number":2447,"context_line":"#max_pool_size\u003d\u003cNone\u003e"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"# Maximum number of database connection retries during"},{"line_number":2450,"context_line":"# startup. Set to -1 to specify an infinite retry count."},{"line_number":2451,"context_line":"# (integer value)"},{"line_number":2452,"context_line":"# Deprecated group/name - [DEFAULT]/sql_max_retries"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"5a890539_20a839da","line":2449,"updated":"2014-11-17 19:32:01.000000000","message":"Need to rebase on top of https://review.openstack.org/#/c/135059/  to get rid of this change.","commit_id":"25c0e355a8dd7c4931c490bc9fcc3183d4d4c0c6"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a1be45f3f1ced08b2a9a904f29eddf191e21201a","unresolved":false,"context_lines":[{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"# The list of secondary IP addresses of the iSCSI daemon (list"},{"line_number":1042,"context_line":"# value)"},{"line_number":1043,"context_line":"#iscsi_ip_address_secondary\u003d"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"# The port that the iSCSI daemon is listening on (integer"},{"line_number":1046,"context_line":"# value)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"5a890539_16e19d9a","line":1043,"updated":"2014-11-18 20:47:14.000000000","message":"Should be iscsi_ip_addresses_secondary?","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"89e9d4b1e852c2f4ec66cadedcc271932dd57abf","unresolved":false,"context_lines":[{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"# The list of secondary IP addresses of the iSCSI daemon (list"},{"line_number":1042,"context_line":"# value)"},{"line_number":1043,"context_line":"#iscsi_ip_address_secondary\u003d"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"# The port that the iSCSI daemon is listening on (integer"},{"line_number":1046,"context_line":"# value)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"5a890539_607dafe7","line":1043,"in_reply_to":"5a890539_16e19d9a","updated":"2014-11-18 23:32:21.000000000","message":"Done","commit_id":"ae4a87c583319c42582f1a013c66fcc79e56d356"}]}
