)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Provide Kaminario K2 all-flash array iSCSI driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The purpose of this blueprint is to provide cinder driver for"},{"line_number":10,"context_line":"Kaminario K2 all-flash iSCSI array. It will include the minimum"},{"line_number":11,"context_line":"set of features required by the Newton(N) release."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7aa08908_1a1b4982","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":29},"updated":"2016-06-08 19:09:32.000000000","message":"This isn\u0027t a blueprint, it\u0027s a patch. :)\n\nSpeaking of which, I didn\u0027t see a blueprint filed for this. Please submit a blueprint and link to it in this commit message with a line like \"Implements: blueprint add-kaminario-iscsi\"\n\nhttps://blueprints.launchpad.net/cinder","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Provide Kaminario K2 all-flash array iSCSI driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The purpose of this blueprint is to provide cinder driver for"},{"line_number":10,"context_line":"Kaminario K2 all-flash iSCSI array. It will include the minimum"},{"line_number":11,"context_line":"set of features required by the Newton(N) release."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7aa08908_e02111b6","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":29},"in_reply_to":"7aa08908_1a1b4982","updated":"2016-06-10 07:34:47.000000000","message":"done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"}],"cinder/tests/unit/volume/drivers/test_kaminario.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                setattr(self, a, obj(b) if isinstance(b, dict) else b)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class TestKaminarioISCSI(test.TestCase):"},{"line_number":74,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":75,"context_line":"        super(TestKaminarioISCSI, self).__init__(*args, **kwargs)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_7d11a751","line":73,"updated":"2016-06-08 19:09:32.000000000","message":"Need a few more tests here that actually validate the good and failure paths of the methods.","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                setattr(self, a, obj(b) if isinstance(b, dict) else b)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class TestKaminarioISCSI(test.TestCase):"},{"line_number":74,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":75,"context_line":"        super(TestKaminarioISCSI, self).__init__(*args, **kwargs)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_601c0178","line":73,"in_reply_to":"7aa08908_7d11a751","updated":"2016-06-10 07:34:47.000000000","message":"Done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c12bbef30d416c7294de055fcfa482c5051deffd","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_create_volume(self):"},{"line_number":127,"context_line":"        \"\"\"Test create_volume.\"\"\""},{"line_number":128,"context_line":"        result \u003d self.driver.create_volume(Obj(TEST_VOLUME))"},{"line_number":129,"context_line":"        self.assertIsNone(result)"},{"line_number":130,"context_line":"        self.assertRaises(AttributeError,"},{"line_number":131,"context_line":"                          self.driver.create_volume, TEST_VOLUME)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_4650160b","line":128,"updated":"2016-06-15 18:36:50.000000000","message":"Any specific reason to use your own object instead of the real volume objects? There are some nice helpers over in like cinder/tests/unit/fake_volume.py\n\nNot really worth blocking the patch, but IMO you would be better off to just jump right in using those to avoid any headaches/refactoring later on.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"}],"cinder/volume/drivers/kaminario/kaminario_common.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":33,"context_line":"kaminario_opts \u003d ["},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027kaminario_nodedup_substring\u0027,"},{"line_number":35,"context_line":"               default\u003d\u0027nodedup\u0027,"},{"line_number":36,"context_line":"               help\u003d\"Create dedup/nodedup volumes based on this substring.\")]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":"CONF.register_opts(kaminario_opts)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_3d227fa3","line":36,"updated":"2016-06-08 19:09:32.000000000","message":"Would be good to list what the acceptable values are for this setting.","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":33,"context_line":"kaminario_opts \u003d ["},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027kaminario_nodedup_substring\u0027,"},{"line_number":35,"context_line":"               default\u003d\u0027nodedup\u0027,"},{"line_number":36,"context_line":"               help\u003d\"Create dedup/nodedup volumes based on this substring.\")]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":"CONF.register_opts(kaminario_opts)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_000c1d41","line":36,"in_reply_to":"7aa08908_3d227fa3","updated":"2016-06-10 07:34:47.000000000","message":"Done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            self.client.new(\"volumes\", name\u003dvol_name,"},{"line_number":123,"context_line":"                            size\u003dvolume.size * units.Mi,"},{"line_number":124,"context_line":"                            volume_group\u003dvg).save()"},{"line_number":125,"context_line":"        except Exception as ex:"},{"line_number":126,"context_line":"            vg_rs \u003d self.client.search(\"volume_groups\", name\u003dvg_name)"},{"line_number":127,"context_line":"            if vg_rs.total !\u003d 0:"},{"line_number":128,"context_line":"                LOG.debug(\"Deleting vg: %s for failed volume in K2.\", vg_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_fd791794","line":125,"range":{"start_line":125,"start_character":15,"end_line":125,"end_character":24},"updated":"2016-06-08 19:09:32.000000000","message":"Can we catch a more specific exception?","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            self.client.new(\"volumes\", name\u003dvol_name,"},{"line_number":123,"context_line":"                            size\u003dvolume.size * units.Mi,"},{"line_number":124,"context_line":"                            volume_group\u003dvg).save()"},{"line_number":125,"context_line":"        except Exception as ex:"},{"line_number":126,"context_line":"            vg_rs \u003d self.client.search(\"volume_groups\", name\u003dvg_name)"},{"line_number":127,"context_line":"            if vg_rs.total !\u003d 0:"},{"line_number":128,"context_line":"                LOG.debug(\"Deleting vg: %s for failed volume in K2.\", vg_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_5bd45a46","line":125,"range":{"start_line":125,"start_character":15,"end_line":125,"end_character":24},"in_reply_to":"7aa08908_fd791794","updated":"2016-06-10 07:34:47.000000000","message":"No","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"},{"line_number":168,"context_line":"            LOG.exception(msg)"},{"line_number":169,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_7d94078a","line":168,"range":{"start_line":168,"start_character":16,"end_line":168,"end_character":25},"updated":"2016-06-08 19:09:32.000000000","message":"You are not in an exception context here, so this should just be LOG.error()","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"},{"line_number":168,"context_line":"            LOG.exception(msg)"},{"line_number":169,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_7b3676b5","line":168,"range":{"start_line":168,"start_character":16,"end_line":168,"end_character":25},"in_reply_to":"7aa08908_7d94078a","updated":"2016-06-10 07:34:47.000000000","message":"Done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"39bc61713b0c7805511397a630f7b434335dc61e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from cinder import utils"},{"line_number":27,"context_line":"from cinder.volume.drivers.san import san"},{"line_number":28,"context_line":"from cinder.volume import utils as vol_utils"},{"line_number":29,"context_line":"import krest"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_06d8ce1c","line":29,"updated":"2016-06-09 19:36:30.000000000","message":"Please do \"krest \u003d importutils.try_import(\"krest\") here.  And then check for krest \u003d None in check_for_setup_error().\n\nThis makes dependency handling much cleaner for us.","commit_id":"661841d299f681d9db7c9b522d2eeed88c1fcd46"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"d605d97bdc005f213835412b0e9ab685c225b2f9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.BoolOpt(\u0027auto_calc_max_oversubscription_ratio\u0027,"},{"line_number":43,"context_line":"                default\u003dFalse,"},{"line_number":44,"context_line":"                help\u003d\"K2 driver will calculate max_oversubscription_ratio \""},{"line_number":45,"context_line":"                     \"on setting this option as True.\")]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"},{"line_number":48,"context_line":"CONF.register_opts(kaminario1_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_e6a14297","line":45,"updated":"2016-06-15 18:09:26.000000000","message":"What is the purpose of automatically calculating this?","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c12bbef30d416c7294de055fcfa482c5051deffd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.BoolOpt(\u0027auto_calc_max_oversubscription_ratio\u0027,"},{"line_number":43,"context_line":"                default\u003dFalse,"},{"line_number":44,"context_line":"                help\u003d\"K2 driver will calculate max_oversubscription_ratio \""},{"line_number":45,"context_line":"                     \"on setting this option as True.\")]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"},{"line_number":48,"context_line":"CONF.register_opts(kaminario1_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a1e564dd","line":45,"in_reply_to":"7aa08908_e6a14297","updated":"2016-06-15 18:36:50.000000000","message":"We do this in the Pure drivers too. The main idea being that if someone wants to use thin provisioning and doesn\u0027t care to limit. In that case the driver can give kind of a best-guess at what is safe to consider as a max ratio based on current usage. With the idea being that if things start to fill up too much someone can migrate volumes later, but until then the driver will start to lower the ratio as it gets more full instead of needing a conf change or conservative starting point. Its configurable though if, for whatever reason, there are requirements for a strict policy on how much it is allowed to over subscribe the backend.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"d605d97bdc005f213835412b0e9ab685c225b2f9","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        vg_name \u003d self.get_volume_group_name(volume.id)"},{"line_number":131,"context_line":"        vol_name \u003d self.get_volume_name(volume.id)"},{"line_number":132,"context_line":"        if CONF.kaminario_nodedup_substring in volume.volume_type.name:"},{"line_number":133,"context_line":"            prov_type \u003d False"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            prov_type \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_c6908651","line":132,"updated":"2016-06-15 18:09:26.000000000","message":"Use self.configuration.kaminario_nodedup_substring instead of CONF.k...","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"12e8a170392f14cbc8b78d80214288fd30f1c4de","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        vg_name \u003d self.get_volume_group_name(volume.id)"},{"line_number":131,"context_line":"        vol_name \u003d self.get_volume_name(volume.id)"},{"line_number":132,"context_line":"        if CONF.kaminario_nodedup_substring in volume.volume_type.name:"},{"line_number":133,"context_line":"            prov_type \u003d False"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            prov_type \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_2e53f16d","line":132,"in_reply_to":"7aa08908_74195222","updated":"2016-06-16 15:06:41.000000000","message":"we are not using \"self.configuration.append_config_values(kaminario1_opts)\" in code , so people can not set value of \"kaminario_nodedup_substring\" in backend section. we are using CONF.register_opts(kaminario1_opts), so value of \"kaminario_nodedup_substring\" can only be set in [DEFAULT] section. I cross-checked this approach. \nIf i try to use \"self.configuration.kaminario_nodedup_substring\" in code , i am getting error\n\"NoSuchOptError: no such option in group kaminario-iscsi-dedup: kaminario_nodedup_substring\"\n\n\nI have below backend section:\n[kaminario-iscsi-dedup]\nvolume_driver \u003d cinder.volume.drivers.kaminario.kaminario_iscsi.KaminarioISCSIDriver\nvolume_backend_name \u003d kaminario-iscsi-dedup\nsan_ip \u003d 192.168.6.4\nsan_login \u003d admin\nsan_password \u003d admin\nfilter_function \u003d \"capabilities.total_volumes \u003c 250\"\nkaminario_nodedup_substring \u003d \"dddddd\"","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6cb4a79948115483cd67153696ad390b997da250","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        vg_name \u003d self.get_volume_group_name(volume.id)"},{"line_number":131,"context_line":"        vol_name \u003d self.get_volume_name(volume.id)"},{"line_number":132,"context_line":"        if CONF.kaminario_nodedup_substring in volume.volume_type.name:"},{"line_number":133,"context_line":"            prov_type \u003d False"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            prov_type \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_74195222","line":132,"in_reply_to":"7aa08908_a1428466","updated":"2016-06-16 13:28:40.000000000","message":"Understood, but using self.configuration is preferred so that configuration works the same as it does for other drivers.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"deb5847d145af972f4a5985d9785f5414dc0e5ec","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        vg_name \u003d self.get_volume_group_name(volume.id)"},{"line_number":131,"context_line":"        vol_name \u003d self.get_volume_name(volume.id)"},{"line_number":132,"context_line":"        if CONF.kaminario_nodedup_substring in volume.volume_type.name:"},{"line_number":133,"context_line":"            prov_type \u003d False"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            prov_type \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a1428466","line":132,"in_reply_to":"7aa08908_c6908651","updated":"2016-06-15 19:20:53.000000000","message":"The idea is to set the value of kaminario_nodedup_substring from  [DEFAULT] section of cinder.conf and no need to set it in K2 multi-backends configuration groups and create different volume_types.\n\n[DEFAULT]\nkaminario_nodedup_substring \u003d \"nodeup\"\n\n[kaminario-iscsi1]\nvolume_driver \u003d cinder.volume.drivers.kaminario.kaminario_iscsi.KaminarioISCSIDriver\nvolume_backend_name \u003d kaminario-iscsi1\nsan_ip \u003d 192.168.6.4\nsan_login \u003d admin\nsan_password \u003d admin\n\n[kaminario-iscsi2]\nvolume_driver \u003d cinder.volume.drivers.kaminario.kaminario_iscsi.KaminarioISCSIDriver\nvolume_backend_name \u003d kaminario-iscsi2\nsan_ip \u003d 192.168.6.5\nsan_login \u003d admin\nsan_password \u003d admin","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c12bbef30d416c7294de055fcfa482c5051deffd","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":207,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":208,"context_line":"        except Exception as ex:"},{"line_number":209,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":210,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":211,"context_line":"            cview.delete()"},{"line_number":212,"context_line":"            self.delete_volume(volume)"},{"line_number":213,"context_line":"            LOG.exception(_LE(\"Copy to volume: %(vol)s from view: %(view)s \""},{"line_number":214,"context_line":"                              \"failed\"), {\"vol\": vol_name, \"view\": view_name})"},{"line_number":215,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_0151d8d8","line":212,"range":{"start_line":209,"start_character":12,"end_line":212,"end_character":38},"updated":"2016-06-15 18:36:50.000000000","message":"Lots of these can raise exceptions too... you might want to consider a more safe way to cleanup. Same goes for other methods where you are attaching/detaching volumes like in clone below this.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"deb5847d145af972f4a5985d9785f5414dc0e5ec","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":207,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":208,"context_line":"        except Exception as ex:"},{"line_number":209,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":210,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":211,"context_line":"            cview.delete()"},{"line_number":212,"context_line":"            self.delete_volume(volume)"},{"line_number":213,"context_line":"            LOG.exception(_LE(\"Copy to volume: %(vol)s from view: %(view)s \""},{"line_number":214,"context_line":"                              \"failed\"), {\"vol\": vol_name, \"view\": view_name})"},{"line_number":215,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_6c2ff3a7","line":212,"range":{"start_line":209,"start_character":12,"end_line":212,"end_character":38},"in_reply_to":"7aa08908_0151d8d8","updated":"2016-06-15 19:20:53.000000000","message":"In terminate_connection code, we are not raising any exception.The idea is to delete any mapping for cview and volume before deleting them. If there is no mapping for cview and volume, terminate_connection will not raise any exception and we can safely delete cview and volume.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c12bbef30d416c7294de055fcfa482c5051deffd","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                      \u0027thin_provisioning_support\u0027: True,"},{"line_number":353,"context_line":"                      \u0027sparse_copy_volume\u0027: True,"},{"line_number":354,"context_line":"                      \u0027total_volumes\u0027: total_volumes,"},{"line_number":355,"context_line":"                      \u0027filter_function\u0027: conf.filter_function,"},{"line_number":356,"context_line":"                      \u0027thick_provisioning_support\u0027: False,"},{"line_number":357,"context_line":"                      \u0027provisioned_capacity_gb\u0027: provisioned_vol / units.Mi,"},{"line_number":358,"context_line":"                      \u0027max_oversubscription_ratio\u0027: ratio}"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a1a9e492","line":355,"updated":"2016-06-15 18:36:50.000000000","message":"I think we fixed this so you don\u0027t need to return it in your driver https://github.com/openstack/cinder/blob/master/cinder/volume/manager.py#L1985\n\nYou should be able to not worry about adding this to your stats.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"deb5847d145af972f4a5985d9785f5414dc0e5ec","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                      \u0027thin_provisioning_support\u0027: True,"},{"line_number":353,"context_line":"                      \u0027sparse_copy_volume\u0027: True,"},{"line_number":354,"context_line":"                      \u0027total_volumes\u0027: total_volumes,"},{"line_number":355,"context_line":"                      \u0027filter_function\u0027: conf.filter_function,"},{"line_number":356,"context_line":"                      \u0027thick_provisioning_support\u0027: False,"},{"line_number":357,"context_line":"                      \u0027provisioned_capacity_gb\u0027: provisioned_vol / units.Mi,"},{"line_number":358,"context_line":"                      \u0027max_oversubscription_ratio\u0027: ratio}"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a73f3486","line":355,"in_reply_to":"7aa08908_a1a9e492","updated":"2016-06-15 19:20:53.000000000","message":"Done","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.BoolOpt(\u0027auto_calc_max_oversubscription_ratio\u0027,"},{"line_number":43,"context_line":"                default\u003dFalse,"},{"line_number":44,"context_line":"                help\u003d\"K2 driver will calculate max_oversubscription_ratio \""},{"line_number":45,"context_line":"                     \"on setting this option as True.\")]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"},{"line_number":48,"context_line":"CONF.register_opts(kaminario1_opts)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d4f3cde5","line":45,"updated":"2016-06-16 21:02:54.000000000","message":"max_oversubscription_ratio should be a float.  You are making it a boolean?","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.BoolOpt(\u0027auto_calc_max_oversubscription_ratio\u0027,"},{"line_number":43,"context_line":"                default\u003dFalse,"},{"line_number":44,"context_line":"                help\u003d\"K2 driver will calculate max_oversubscription_ratio \""},{"line_number":45,"context_line":"                     \"on setting this option as True.\")]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"CONF \u003d cfg.CONF"},{"line_number":48,"context_line":"CONF.register_opts(kaminario1_opts)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_27d5b61a","line":45,"in_reply_to":"7aa08908_d4f3cde5","updated":"2016-06-17 07:06:58.000000000","message":"we are not making \u0027max_oversubscription_ratio\u0027 as a boolean. auto_calc_max_oversubscription_ratio is set as True for calculating float value of \u0027max_oversubscription_ratio\u0027 by driver itself. If it is False, then max_oversubscription_ratio \u003d self.configuration.max_oversubscription_ratio","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def check_for_setup_error(self):"},{"line_number":84,"context_line":"        if self.krest is None:"},{"line_number":85,"context_line":"            msg \u003d _(\"Unable to import \u0027krest\u0027 python module.\")"},{"line_number":86,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            conf \u003d self.configuration"},{"line_number":89,"context_line":"            self.client \u003d self.krest.EndPoint(conf.san_ip,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d41aad17","line":86,"range":{"start_line":86,"start_character":18,"end_line":86,"end_character":63},"updated":"2016-06-16 21:02:54.000000000","message":"exception.KaminarioCinderDriverException(reason\u003dmsg)","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def check_for_setup_error(self):"},{"line_number":84,"context_line":"        if self.krest is None:"},{"line_number":85,"context_line":"            msg \u003d _(\"Unable to import \u0027krest\u0027 python module.\")"},{"line_number":86,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            conf \u003d self.configuration"},{"line_number":89,"context_line":"            self.client \u003d self.krest.EndPoint(conf.san_ip,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_c7e67215","line":86,"range":{"start_line":86,"start_character":18,"end_line":86,"end_character":63},"in_reply_to":"7aa08908_d41aad17","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    msg \u003d _(\"K2 rest api version should be \""},{"line_number":100,"context_line":"                            \"\u003e\u003d %s.\") % K2_MIN_VERSION"},{"line_number":101,"context_line":"                    LOG.error(msg)"},{"line_number":102,"context_line":"                    raise exception.KaminarioCinderDriverException(msg)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\"K2 rest api version search failed.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_14ec35f2","line":102,"updated":"2016-06-16 21:02:54.000000000","message":"reason\u003dmsg","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    msg \u003d _(\"K2 rest api version should be \""},{"line_number":100,"context_line":"                            \"\u003e\u003d %s.\") % K2_MIN_VERSION"},{"line_number":101,"context_line":"                    LOG.error(msg)"},{"line_number":102,"context_line":"                    raise exception.KaminarioCinderDriverException(msg)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\"K2 rest api version search failed.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_e7ebaeda","line":102,"in_reply_to":"7aa08908_14ec35f2","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\"K2 rest api version search failed.\")"},{"line_number":106,"context_line":"                LOG.error(msg)"},{"line_number":107,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @kaminario_logger"},{"line_number":110,"context_line":"    def _check_ops(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d4c8ed77","line":107,"updated":"2016-06-16 21:02:54.000000000","message":"Same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\"K2 rest api version search failed.\")"},{"line_number":106,"context_line":"                LOG.error(msg)"},{"line_number":107,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @kaminario_logger"},{"line_number":110,"context_line":"    def _check_ops(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_87b3ca09","line":107,"in_reply_to":"7aa08908_d4c8ed77","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                LOG.debug(\"Deleting vg: %s for failed volume in K2.\", vg_name)"},{"line_number":153,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":154,"context_line":"            LOG.exception(_LE(\"Creation of volume %s failed.\"), vol_name)"},{"line_number":155,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    @kaminario_logger"},{"line_number":158,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_1471d544","line":155,"updated":"2016-06-16 21:02:54.000000000","message":"raise exception.KaminarioCinderDriverException(reason\u003dsix.text_type(ex.message))","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                LOG.debug(\"Deleting vg: %s for failed volume in K2.\", vg_name)"},{"line_number":153,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":154,"context_line":"            LOG.exception(_LE(\"Creation of volume %s failed.\"), vol_name)"},{"line_number":155,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    @kaminario_logger"},{"line_number":158,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_67adfe9a","line":155,"in_reply_to":"7aa08908_1471d544","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                LOG.exception(_LE(\"Creating a view: %(view)s from snapshot: \""},{"line_number":186,"context_line":"                                  \"%(snap)s failed\"), {\"view\": view_name,"},{"line_number":187,"context_line":"                                                       \"snap\": snap_name})"},{"line_number":188,"context_line":"                raise exception.KaminarioCinderDriverException(ex)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d483cda7","line":188,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                LOG.exception(_LE(\"Creating a view: %(view)s from snapshot: \""},{"line_number":186,"context_line":"                                  \"%(snap)s failed\"), {\"view\": view_name,"},{"line_number":187,"context_line":"                                                       \"snap\": snap_name})"},{"line_number":188,"context_line":"                raise exception.KaminarioCinderDriverException(ex)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_c794b245","line":188,"in_reply_to":"7aa08908_d483cda7","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"},{"line_number":192,"context_line":"            LOG.error(msg)"},{"line_number":193,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        try:"},{"line_number":196,"context_line":"            conn \u003d self.initialize_connection(cview, properties)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_54651d1b","line":193,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            msg \u003d _(\"Snapshot: %s search failed in K2.\") % snap_name"},{"line_number":192,"context_line":"            LOG.error(msg)"},{"line_number":193,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        try:"},{"line_number":196,"context_line":"            conn \u003d self.initialize_connection(cview, properties)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_a78fe62c","line":193,"in_reply_to":"7aa08908_54651d1b","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":203,"context_line":"                                  snapshot.volume.size * units.Ki,"},{"line_number":204,"context_line":"                                  self.configuration.volume_dd_blocksize,"},{"line_number":205,"context_line":"                                  sparse\u003dTrue)"},{"line_number":206,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":207,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":208,"context_line":"        except Exception as ex:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_34817190","line":205,"updated":"2016-06-16 21:02:54.000000000","message":"Looks like you don\u0027t have the clone function on the array itself.  This will be so slow.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":203,"context_line":"                                  snapshot.volume.size * units.Ki,"},{"line_number":204,"context_line":"                                  self.configuration.volume_dd_blocksize,"},{"line_number":205,"context_line":"                                  sparse\u003dTrue)"},{"line_number":206,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":207,"context_line":"            self.terminate_connection(cview, properties)"},{"line_number":208,"context_line":"        except Exception as ex:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_87346a4a","line":205,"in_reply_to":"7aa08908_34817190","updated":"2016-06-17 07:06:58.000000000","message":"True, we do not have clone function.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":212,"context_line":"            self.delete_volume(volume)"},{"line_number":213,"context_line":"            LOG.exception(_LE(\"Copy to volume: %(vol)s from view: %(view)s \""},{"line_number":214,"context_line":"                              \"failed\"), {\"vol\": vol_name, \"view\": view_name})"},{"line_number":215,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @kaminario_logger"},{"line_number":218,"context_line":"    def create_cloned_volume(self, volume, src_vref):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_34fcd13d","line":215,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":212,"context_line":"            self.delete_volume(volume)"},{"line_number":213,"context_line":"            LOG.exception(_LE(\"Copy to volume: %(vol)s from view: %(view)s \""},{"line_number":214,"context_line":"                              \"failed\"), {\"vol\": vol_name, \"view\": view_name})"},{"line_number":215,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @kaminario_logger"},{"line_number":218,"context_line":"    def create_cloned_volume(self, volume, src_vref):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_a739a641","line":215,"in_reply_to":"7aa08908_34fcd13d","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"c3a0f4555d4875221922dc2b3e92d6cf8014ea35","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            self.create_volume(volume)"},{"line_number":232,"context_line":"            conn \u003d self.initialize_connection(volume, properties)"},{"line_number":233,"context_line":"            dest_attach_info \u003d self._connect_device(conn)"},{"line_number":234,"context_line":"            vol_utils.copy_volume(src_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":235,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":236,"context_line":"                                  src_vref.size * units.Ki,"},{"line_number":237,"context_line":"                                  self.configuration.volume_dd_blocksize,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_81a1fa48","line":234,"updated":"2016-06-17 02:36:27.000000000","message":"The source volume may be in-used and there may be data IO in the source volume. In this case, it is hard to ensure the data integrity. How about take a snapshot first and then copy data from the snap to the target volume?","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            self.create_volume(volume)"},{"line_number":232,"context_line":"            conn \u003d self.initialize_connection(volume, properties)"},{"line_number":233,"context_line":"            dest_attach_info \u003d self._connect_device(conn)"},{"line_number":234,"context_line":"            vol_utils.copy_volume(src_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":235,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":236,"context_line":"                                  src_vref.size * units.Ki,"},{"line_number":237,"context_line":"                                  self.configuration.volume_dd_blocksize,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_b2f28699","line":234,"in_reply_to":"7aa08908_81a1fa48","updated":"2016-06-17 07:06:58.000000000","message":"we will check that volume is not attached for clone operation and will raise an exception if the volume is attached and will suggest user to create a snapshot and then create a volume from the snapshot.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":236,"context_line":"                                  src_vref.size * units.Ki,"},{"line_number":237,"context_line":"                                  self.configuration.volume_dd_blocksize,"},{"line_number":238,"context_line":"                                  sparse\u003dTrue)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":241,"context_line":"            self.terminate_connection(src_vref, properties)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_f401a93a","line":238,"updated":"2016-06-16 21:02:54.000000000","message":"You don\u0027t have a clone volume function on the array itself?  This will be very slow.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                                  dest_attach_info[\u0027device\u0027][\u0027path\u0027],"},{"line_number":236,"context_line":"                                  src_vref.size * units.Ki,"},{"line_number":237,"context_line":"                                  self.configuration.volume_dd_blocksize,"},{"line_number":238,"context_line":"                                  sparse\u003dTrue)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":241,"context_line":"            self.terminate_connection(src_vref, properties)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_6785fecd","line":238,"in_reply_to":"7aa08908_f401a93a","updated":"2016-06-17 07:06:58.000000000","message":"True, we do not have a clone support in array.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        except Exception as ex:"},{"line_number":243,"context_line":"            self.terminate_connection(src_vref, properties)"},{"line_number":244,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":245,"context_line":"            self.delete_volume(volume)"},{"line_number":246,"context_line":"            LOG.exception(_LE(\"Create a clone: %s failed.\"), clone_name)"},{"line_number":247,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_94d305d5","line":245,"updated":"2016-06-16 21:02:54.000000000","message":"terminate_connection and delete_volume could throw exception themselves.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        except Exception as ex:"},{"line_number":243,"context_line":"            self.terminate_connection(src_vref, properties)"},{"line_number":244,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":245,"context_line":"            self.delete_volume(volume)"},{"line_number":246,"context_line":"            LOG.exception(_LE(\"Create a clone: %s failed.\"), clone_name)"},{"line_number":247,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_f86b4c83","line":245,"in_reply_to":"7aa08908_94d305d5","updated":"2016-06-17 07:06:58.000000000","message":"In terminate_connection code, we are not raising any exception.The idea is to delete any mapping for cview and volume before deleting them. If there is no mapping for cview and volume, terminate_connection will not raise any exception and we can safely delete cview and volume.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":245,"context_line":"            self.delete_volume(volume)"},{"line_number":246,"context_line":"            LOG.exception(_LE(\"Create a clone: %s failed.\"), clone_name)"},{"line_number":247,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @kaminario_logger"},{"line_number":250,"context_line":"    def delete_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_747819f9","line":247,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            self.terminate_connection(volume, properties)"},{"line_number":245,"context_line":"            self.delete_volume(volume)"},{"line_number":246,"context_line":"            LOG.exception(_LE(\"Create a clone: %s failed.\"), clone_name)"},{"line_number":247,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @kaminario_logger"},{"line_number":250,"context_line":"    def delete_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_675cde7d","line":247,"in_reply_to":"7aa08908_747819f9","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            vg_rs \u003d self.client.search(\"volume_groups\", name\u003dvg_name)"},{"line_number":265,"context_line":"            if vg_rs.total !\u003d 0:"},{"line_number":266,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":267,"context_line":"        except Exception as ex:"},{"line_number":268,"context_line":"            LOG.exception(_LE(\"Deletion of volume %s failed.\"), vol_name)"},{"line_number":269,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":270,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_141b95cb","line":267,"updated":"2016-06-16 21:02:54.000000000","message":"Can you figure out whether the exception is caused by volume not found?  If the volume does not exist any more, it should log a message but return success.  Otherwise raise exception.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            vg_rs \u003d self.client.search(\"volume_groups\", name\u003dvg_name)"},{"line_number":265,"context_line":"            if vg_rs.total !\u003d 0:"},{"line_number":266,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":267,"context_line":"        except Exception as ex:"},{"line_number":268,"context_line":"            LOG.exception(_LE(\"Deletion of volume %s failed.\"), vol_name)"},{"line_number":269,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":270,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_e729ee9c","line":267,"in_reply_to":"7aa08908_141b95cb","updated":"2016-06-17 07:06:58.000000000","message":"vol_rs.total !\u003d 0\nvg_rs.total !\u003d 0\n\nno exception will raise if volume or volume_group is not found on K2 array. We are trying to delete them when \"total !\u003d0\" which means that volume or vg exists on K2 array.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":267,"context_line":"        except Exception as ex:"},{"line_number":268,"context_line":"            LOG.exception(_LE(\"Deletion of volume %s failed.\"), vol_name)"},{"line_number":269,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    @kaminario_logger"},{"line_number":272,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_f425290a","line":269,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                vg_rs.hits[0].delete()"},{"line_number":267,"context_line":"        except Exception as ex:"},{"line_number":268,"context_line":"            LOG.exception(_LE(\"Deletion of volume %s failed.\"), vol_name)"},{"line_number":269,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    @kaminario_logger"},{"line_number":272,"context_line":"    def get_volume_stats(self, refresh\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_27c93626","line":269,"in_reply_to":"7aa08908_f425290a","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            LOG.debug(\"Searching and deleting snapshot: %s in K2.\", snap_name)"},{"line_number":316,"context_line":"            self.client.search(\"snapshots\","},{"line_number":317,"context_line":"                               short_name\u003dsnap_name).hits[0].delete()"},{"line_number":318,"context_line":"        except Exception as ex:"},{"line_number":319,"context_line":"            LOG.exception(_LE(\"Deletion of snapshot: %s failed.\"), snap_name)"},{"line_number":320,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_344971d1","line":318,"updated":"2016-06-16 21:02:54.000000000","message":"Can you figure out whether the exception is caused by snapshot not found?  If the snapshot does not exist any more, it should log a message but return success.  Otherwise raise exception.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            LOG.debug(\"Searching and deleting snapshot: %s in K2.\", snap_name)"},{"line_number":316,"context_line":"            self.client.search(\"snapshots\","},{"line_number":317,"context_line":"                               short_name\u003dsnap_name).hits[0].delete()"},{"line_number":318,"context_line":"        except Exception as ex:"},{"line_number":319,"context_line":"            LOG.exception(_LE(\"Deletion of snapshot: %s failed.\"), snap_name)"},{"line_number":320,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_8743ca6b","line":318,"in_reply_to":"7aa08908_344971d1","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                               short_name\u003dsnap_name).hits[0].delete()"},{"line_number":318,"context_line":"        except Exception as ex:"},{"line_number":319,"context_line":"            LOG.exception(_LE(\"Deletion of snapshot: %s failed.\"), snap_name)"},{"line_number":320,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    @kaminario_logger"},{"line_number":323,"context_line":"    def extend_volume(self, volume, new_size):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_94e945ba","line":320,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                               short_name\u003dsnap_name).hits[0].delete()"},{"line_number":318,"context_line":"        except Exception as ex:"},{"line_number":319,"context_line":"            LOG.exception(_LE(\"Deletion of snapshot: %s failed.\"), snap_name)"},{"line_number":320,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    @kaminario_logger"},{"line_number":323,"context_line":"    def extend_volume(self, volume, new_size):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_876c6a09","line":320,"in_reply_to":"7aa08908_94e945ba","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            vol.save()"},{"line_number":332,"context_line":"        except Exception as ex:"},{"line_number":333,"context_line":"            LOG.exception(_LE(\"Extending volume: %s failed.\"), vol_name)"},{"line_number":334,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    @kaminario_logger"},{"line_number":337,"context_line":"    def update_volume_stats(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_34db311d","line":334,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            vol.save()"},{"line_number":332,"context_line":"        except Exception as ex:"},{"line_number":333,"context_line":"            LOG.exception(_LE(\"Extending volume: %s failed.\"), vol_name)"},{"line_number":334,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    @kaminario_logger"},{"line_number":337,"context_line":"    def update_volume_stats(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_07aa3a19","line":334,"in_reply_to":"7aa08908_34db311d","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                                      name\u003d\"Best_Effort_Retention\").hits[0]"},{"line_number":404,"context_line":"        except Exception as ex:"},{"line_number":405,"context_line":"            LOG.exception(_LE(\"Retention policy search failed in K2.\"))"},{"line_number":406,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":409,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_34adf188","line":406,"updated":"2016-06-16 21:02:54.000000000","message":"See above.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                                      name\u003d\"Best_Effort_Retention\").hits[0]"},{"line_number":404,"context_line":"        except Exception as ex:"},{"line_number":405,"context_line":"            LOG.exception(_LE(\"Retention policy search failed in K2.\"))"},{"line_number":406,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":409,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_c7af9229","line":406,"in_reply_to":"7aa08908_34adf188","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"}],"cinder/volume/drivers/kaminario/kaminario_iscsi.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                LOG.debug(\"Deleting initiator hostname: %s in K2.\", host_name)"},{"line_number":146,"context_line":"                host.delete()"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            LOG.warning(_LW(\"Host: %s not found on K2.\") % host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_dd541bcb","line":148,"range":{"start_line":148,"start_character":56,"end_line":148,"end_character":58},"updated":"2016-06-08 19:09:32.000000000","message":"% \u003e ,","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                LOG.debug(\"Deleting initiator hostname: %s in K2.\", host_name)"},{"line_number":146,"context_line":"                host.delete()"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            LOG.warning(_LW(\"Host: %s not found on K2.\") % host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_9b7242ac","line":148,"range":{"start_line":148,"start_character":56,"end_line":148,"end_character":58},"in_reply_to":"7aa08908_dd541bcb","updated":"2016-06-10 07:34:47.000000000","message":"Done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"d605d97bdc005f213835412b0e9ab685c225b2f9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":45,"context_line":"            vol \u003d vol_rs.hits[0]"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            vol \u003d volume"},{"line_number":48,"context_line":"        \"\"\"Get target_portal\"\"\""},{"line_number":49,"context_line":"        LOG.debug(\"Searching first iscsi port ip  without wan in K2.\")"},{"line_number":50,"context_line":"        iscsi_ip_rs \u003d self.client.search(\"system/net_ips\", wan_port\u003d\"\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_86015e6d","line":47,"updated":"2016-06-15 18:09:26.000000000","message":"When is this else case hit?\n\nThis kind of checking hints that you need to refactor these methods a bit...","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"deb5847d145af972f4a5985d9785f5414dc0e5ec","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":45,"context_line":"            vol \u003d vol_rs.hits[0]"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            vol \u003d volume"},{"line_number":48,"context_line":"        \"\"\"Get target_portal\"\"\""},{"line_number":49,"context_line":"        LOG.debug(\"Searching first iscsi port ip  without wan in K2.\")"},{"line_number":50,"context_line":"        iscsi_ip_rs \u003d self.client.search(\"system/net_ips\", wan_port\u003d\"\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a7429466","line":47,"in_reply_to":"7aa08908_21e4d4aa","updated":"2016-06-15 19:20:53.000000000","message":"We need it while creating a volume from snapshot.\nOur array does not allow to create a volume directly from snapshot. We have to create a view from snapshot and have to attach the view and then we are creating a new cinder volume and attaching new volume and then copying data from view to new volume and then deattaching both view and new volume and then deleting view.\nview object is different from cinder volume object so we want to use same initialize_connection code using if and else condition.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"c12bbef30d416c7294de055fcfa482c5051deffd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":45,"context_line":"            vol \u003d vol_rs.hits[0]"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            vol \u003d volume"},{"line_number":48,"context_line":"        \"\"\"Get target_portal\"\"\""},{"line_number":49,"context_line":"        LOG.debug(\"Searching first iscsi port ip  without wan in K2.\")"},{"line_number":50,"context_line":"        iscsi_ip_rs \u003d self.client.search(\"system/net_ips\", wan_port\u003d\"\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_21e4d4aa","line":47,"in_reply_to":"7aa08908_86015e6d","updated":"2016-06-15 18:36:50.000000000","message":"Looks like it is when attaching volumes/snapshots in the create from source operations in the driver. They pass in a view to attach that comes from their client instead of a cinder object.\n\nI do agree it might be easier to read this with some refactoring, but it seems ok as-is functionally.","commit_id":"8b4f16e4aab2f6b3d84c7f1b98b33546714223f5"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            if not hasattr(vol_rs, \u0027hits\u0027) or vol_rs.total \u003d\u003d 0:"},{"line_number":42,"context_line":"                msg \u003d _(\"Unable to find volume: %s from K2.\") % vol_name"},{"line_number":43,"context_line":"                LOG.exception(msg)"},{"line_number":44,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":45,"context_line":"            vol \u003d vol_rs.hits[0]"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            vol \u003d volume"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_118e07d0","line":44,"updated":"2016-06-16 21:02:54.000000000","message":"exception.KaminarioCinderDriverException(reason\u003dmsg)","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            if not hasattr(vol_rs, \u0027hits\u0027) or vol_rs.total \u003d\u003d 0:"},{"line_number":42,"context_line":"                msg \u003d _(\"Unable to find volume: %s from K2.\") % vol_name"},{"line_number":43,"context_line":"                LOG.exception(msg)"},{"line_number":44,"context_line":"                raise exception.KaminarioCinderDriverException(msg)"},{"line_number":45,"context_line":"            vol \u003d vol_rs.hits[0]"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            vol \u003d volume"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_adf347e6","line":44,"in_reply_to":"7aa08908_118e07d0","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            iscsi_ip \u003d iscsi_ip_rs.hits[0].ip_address"},{"line_number":54,"context_line":"        if not iscsi_ip:"},{"line_number":55,"context_line":"            msg \u003d _(\"Unable to get ISCSI IP addres from K2.\")"},{"line_number":56,"context_line":"            LOG.exception(msg)"},{"line_number":57,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":58,"context_line":"        iscsi_portal \u003d \"{0}:{1}\".format(iscsi_ip, ISCSI_TCP_PORT)"},{"line_number":59,"context_line":"        LOG.debug(\"Searching system state for target iqn in K2.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_916f97fb","line":56,"updated":"2016-06-16 21:02:54.000000000","message":"This is not in an exception block.  Logging an exception will cause some errors.  Please use LOG.error instead.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            iscsi_ip \u003d iscsi_ip_rs.hits[0].ip_address"},{"line_number":54,"context_line":"        if not iscsi_ip:"},{"line_number":55,"context_line":"            msg \u003d _(\"Unable to get ISCSI IP addres from K2.\")"},{"line_number":56,"context_line":"            LOG.exception(msg)"},{"line_number":57,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":58,"context_line":"        iscsi_portal \u003d \"{0}:{1}\".format(iscsi_ip, ISCSI_TCP_PORT)"},{"line_number":59,"context_line":"        LOG.debug(\"Searching system state for target iqn in K2.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_4d2bc333","line":56,"in_reply_to":"7aa08908_916f97fb","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if not iscsi_ip:"},{"line_number":55,"context_line":"            msg \u003d _(\"Unable to get ISCSI IP addres from K2.\")"},{"line_number":56,"context_line":"            LOG.exception(msg)"},{"line_number":57,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":58,"context_line":"        iscsi_portal \u003d \"{0}:{1}\".format(iscsi_ip, ISCSI_TCP_PORT)"},{"line_number":59,"context_line":"        LOG.debug(\"Searching system state for target iqn in K2.\")"},{"line_number":60,"context_line":"        sys_state_rs \u003d self.client.search(\"system/state\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_b143b36b","line":57,"updated":"2016-06-16 21:02:54.000000000","message":"reason\u003dmsg","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if not iscsi_ip:"},{"line_number":55,"context_line":"            msg \u003d _(\"Unable to get ISCSI IP addres from K2.\")"},{"line_number":56,"context_line":"            LOG.exception(msg)"},{"line_number":57,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":58,"context_line":"        iscsi_portal \u003d \"{0}:{1}\".format(iscsi_ip, ISCSI_TCP_PORT)"},{"line_number":59,"context_line":"        LOG.debug(\"Searching system state for target iqn in K2.\")"},{"line_number":60,"context_line":"        sys_state_rs \u003d self.client.search(\"system/state\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_8d25ab5d","line":57,"in_reply_to":"7aa08908_b143b36b","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if not target_iqn:"},{"line_number":66,"context_line":"            msg \u003d _(\"Unable to get target iqn from K2.\")"},{"line_number":67,"context_line":"            LOG.exception(msg)"},{"line_number":68,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":69,"context_line":"        host_name \u003d self.get_initiator_host_name(connector)"},{"line_number":70,"context_line":"        LOG.debug(\"Searching initiator hostname: %s in K2.\", host_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d158ff59","line":67,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if not target_iqn:"},{"line_number":66,"context_line":"            msg \u003d _(\"Unable to get target iqn from K2.\")"},{"line_number":67,"context_line":"            LOG.exception(msg)"},{"line_number":68,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":69,"context_line":"        host_name \u003d self.get_initiator_host_name(connector)"},{"line_number":70,"context_line":"        LOG.debug(\"Searching initiator hostname: %s in K2.\", host_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_6d283f34","line":67,"in_reply_to":"7aa08908_d158ff59","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if not target_iqn:"},{"line_number":66,"context_line":"            msg \u003d _(\"Unable to get target iqn from K2.\")"},{"line_number":67,"context_line":"            LOG.exception(msg)"},{"line_number":68,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":69,"context_line":"        host_name \u003d self.get_initiator_host_name(connector)"},{"line_number":70,"context_line":"        LOG.debug(\"Searching initiator hostname: %s in K2.\", host_name)"},{"line_number":71,"context_line":"        host_rs \u003d self.client.search(\"hosts\", name\u003dhost_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_71302b08","line":68,"updated":"2016-06-16 21:02:54.000000000","message":"same","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if not target_iqn:"},{"line_number":66,"context_line":"            msg \u003d _(\"Unable to get target iqn from K2.\")"},{"line_number":67,"context_line":"            LOG.exception(msg)"},{"line_number":68,"context_line":"            raise exception.KaminarioCinderDriverException(msg)"},{"line_number":69,"context_line":"        host_name \u003d self.get_initiator_host_name(connector)"},{"line_number":70,"context_line":"        LOG.debug(\"Searching initiator hostname: %s in K2.\", host_name)"},{"line_number":71,"context_line":"        host_rs \u003d self.client.search(\"hosts\", name\u003dhost_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_cd1fb307","line":68,"in_reply_to":"7aa08908_71302b08","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            except Exception as ex:"},{"line_number":84,"context_line":"                LOG.debug(\"Unable to create host : %s in K2.\", host_name)"},{"line_number":85,"context_line":"                self.delete_host_by_name(host_name)"},{"line_number":86,"context_line":"                raise exception.KaminarioCinderDriverException(ex)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            LOG.debug(\"Use existing initiator hostname: %s in K2.\", host_name)"},{"line_number":89,"context_line":"            host \u003d host_rs.hits[0]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_54019d03","line":86,"updated":"2016-06-16 21:02:54.000000000","message":"exception.KaminarioCinderDriverException(reason\u003dsix.text_type(ex.message))","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            except Exception as ex:"},{"line_number":84,"context_line":"                LOG.debug(\"Unable to create host : %s in K2.\", host_name)"},{"line_number":85,"context_line":"                self.delete_host_by_name(host_name)"},{"line_number":86,"context_line":"                raise exception.KaminarioCinderDriverException(ex)"},{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            LOG.debug(\"Use existing initiator hostname: %s in K2.\", host_name)"},{"line_number":89,"context_line":"            host \u003d host_rs.hits[0]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_ed142fea","line":86,"in_reply_to":"7aa08908_54019d03","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                LOG.debug(\"Unable to mapping volume:%(vol)s to host: %(host)s\","},{"line_number":97,"context_line":"                          {\u0027host\u0027: host_name, \u0027vol\u0027: vol.name})"},{"line_number":98,"context_line":"                self.delete_host_by_name(host_name)"},{"line_number":99,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":100,"context_line":"        if type(volume).__name__ \u003d\u003d \u0027RestObject\u0027:"},{"line_number":101,"context_line":"            volsnap \u003d None"},{"line_number":102,"context_line":"            LOG.debug(\"Searching volsnaps in K2.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_947e6568","line":99,"updated":"2016-06-16 21:02:54.000000000","message":"exception.KaminarioCinderDriverException(reason\u003dsix.text_type(ex.message))","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                LOG.debug(\"Unable to mapping volume:%(vol)s to host: %(host)s\","},{"line_number":97,"context_line":"                          {\u0027host\u0027: host_name, \u0027vol\u0027: vol.name})"},{"line_number":98,"context_line":"                self.delete_host_by_name(host_name)"},{"line_number":99,"context_line":"            raise exception.KaminarioCinderDriverException(ex)"},{"line_number":100,"context_line":"        if type(volume).__name__ \u003d\u003d \u0027RestObject\u0027:"},{"line_number":101,"context_line":"            volsnap \u003d None"},{"line_number":102,"context_line":"            LOG.debug(\"Searching volsnaps in K2.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_4dd2a335","line":99,"in_reply_to":"7aa08908_947e6568","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d7c0f68c71fb3d207de909c6653d2d9289c09c73","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                         \"target_portal\": iscsi_portal,"},{"line_number":117,"context_line":"                         \"target_lun\": lun,"},{"line_number":118,"context_line":"                         \"target_discovered\": True,"},{"line_number":119,"context_line":"                         \"access_mode\": \"rw\"}}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @kaminario_logger"},{"line_number":122,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_b4c9e1ae","line":119,"updated":"2016-06-16 21:02:54.000000000","message":"Please remove the last line \"access_mode\": \"rw\".  This should not be hardcoded to \"rw\".  The manager will populate this.","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"7a6a4e8806cc38e0a149731f7f510935c64801c4","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                         \"target_portal\": iscsi_portal,"},{"line_number":117,"context_line":"                         \"target_lun\": lun,"},{"line_number":118,"context_line":"                         \"target_discovered\": True,"},{"line_number":119,"context_line":"                         \"access_mode\": \"rw\"}}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @kaminario_logger"},{"line_number":122,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_ade187fe","line":119,"in_reply_to":"7aa08908_b4c9e1ae","updated":"2016-06-17 07:06:58.000000000","message":"Done","commit_id":"50d4693ed3122706ec5f42e609b55feb36497b0a"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"97adf46a9e2a72c2e78003b2c3ad55a122b37791","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from cinder.i18n import _, _LW"},{"line_number":20,"context_line":"from cinder import interface"},{"line_number":21,"context_line":"from cinder.volume.drivers.kaminario import kaminario_common as common"},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"ISCSI_TCP_PORT \u003d \"3260\""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_c0547cc7","line":22,"updated":"2016-06-17 15:15:01.000000000","message":"Technically the oslo_log import should be separate before the cinder imports, but not a huge deal.","commit_id":"7f875697e062c69b31cc8bfc31f38c2d79abbdf4"}],"requirements.txt":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"39bc61713b0c7805511397a630f7b434335dc61e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"httplib2\u003e\u003d0.7.5 # MIT"},{"line_number":12,"context_line":"iso8601\u003e\u003d0.1.11 # MIT"},{"line_number":13,"context_line":"keystonemiddleware!\u003d4.1.0,!\u003d4.5.0,\u003e\u003d4.0.0 # Apache-2.0"},{"line_number":14,"context_line":"krest\u003e\u003d1.3.1  # Apache-2.0"},{"line_number":15,"context_line":"lxml\u003e\u003d2.3 # BSD"},{"line_number":16,"context_line":"oauth2client\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":17,"context_line":"oslo.config\u003e\u003d3.10.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":4,"id":"7aa08908_462f76f6","line":14,"updated":"2016-06-09 19:36:30.000000000","message":"When the other change I noted is made, this can be removed.  This way, this library is not required for every Cinder installation.","commit_id":"661841d299f681d9db7c9b522d2eeed88c1fcd46"}],"test-requirements.txt":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"81ed101deb54eb9eff20f06d4b26ca1ce5a0d0ee","unresolved":false,"context_lines":[{"line_number":9,"context_line":"coverage\u003e\u003d3.6 # Apache-2.0"},{"line_number":10,"context_line":"ddt\u003e\u003d1.0.1 # MIT"},{"line_number":11,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":12,"context_line":"krest\u003e\u003d1.3.1  # Apache-2.0"},{"line_number":13,"context_line":"mock\u003e\u003d2.0 # BSD"},{"line_number":14,"context_line":"mox3\u003e\u003d0.7.0 # Apache-2.0"},{"line_number":15,"context_line":"oslotest\u003e\u003d1.10.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"7aa08908_1d2fc33f","line":12,"updated":"2016-06-08 19:09:32.000000000","message":"Since this is in requirements.txt it is not needed here. test-requirements.txt is just for any additional libraries needed in order to run the tests.","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"8676bcb85b190206b73b06f985fc2230dfa997cb","unresolved":false,"context_lines":[{"line_number":9,"context_line":"coverage\u003e\u003d3.6 # Apache-2.0"},{"line_number":10,"context_line":"ddt\u003e\u003d1.0.1 # MIT"},{"line_number":11,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":12,"context_line":"krest\u003e\u003d1.3.1  # Apache-2.0"},{"line_number":13,"context_line":"mock\u003e\u003d2.0 # BSD"},{"line_number":14,"context_line":"mox3\u003e\u003d0.7.0 # Apache-2.0"},{"line_number":15,"context_line":"oslotest\u003e\u003d1.10.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"7aa08908_1b5f720f","line":12,"in_reply_to":"7aa08908_1d2fc33f","updated":"2016-06-10 07:34:47.000000000","message":"Done","commit_id":"96f8320b5aa46410f0415a67d314edd43526646d"}]}
