)]}'
{"tempest/test_discover/plugins.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"cca181dad66500b0f40c692f70888a397deaae5a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             in that group."},{"line_number":56,"context_line":"        :rtype list:"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_112a367f","line":58,"updated":"2015-07-23 22:16:47.000000000","message":"I guess here should be\n\n return []\n\nfor passing plugin_options.extend() at line 86.","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1fabab8da92dd8d62d739958bdf3077309add346","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             in that group."},{"line_number":56,"context_line":"        :rtype list:"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_6d9a7070","line":58,"in_reply_to":"3a50d1a3_112a367f","updated":"2015-07-27 15:20:43.000000000","message":"I\u0027m not 100% sure how abc abstractmethods handle return types in the abstract definition. My understanding is that this can be pass since unless the subclass overloads this method an exception will be raised on the subclass implementing the abstract class.\n\nThat being said you do have a good point that the method below in the manager class doesn\u0027t handle non list input correctly. So I probably should check before extend.","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"04a27d2db9063dd276296b11e5e4bb3f63e2c4fe","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             in that group."},{"line_number":56,"context_line":"        :rtype list:"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_26f59eca","line":58,"in_reply_to":"3a50d1a3_3f6e5100","updated":"2015-07-30 14:20:22.000000000","message":"Done","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"f46f61751eda83a705676fda0578d27357b6f7d4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             in that group."},{"line_number":56,"context_line":"        :rtype list:"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_3f6e5100","line":58,"in_reply_to":"3a50d1a3_6d9a7070","updated":"2015-07-29 07:39:55.000000000","message":"My point came from the docstring of line 56 (:rtype list:) and I was a little confused with here.","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4ef4e07b4bb26e7cdbc40f336764c7798a768261","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"},{"line_number":62,"context_line":"class TempestTestPluginManager(object):"},{"line_number":63,"context_line":"    \"\"\"Tempest test plugin manager class"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This class is used to manage the lifecycle of external tempest test"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_199fbcb5","line":62,"updated":"2015-07-24 00:10:53.000000000","message":"How about adding unit test for this class? may be in separate patch which m sure you have planned :).","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1fabab8da92dd8d62d739958bdf3077309add346","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@misc.singleton"},{"line_number":62,"context_line":"class TempestTestPluginManager(object):"},{"line_number":63,"context_line":"    \"\"\"Tempest test plugin manager class"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This class is used to manage the lifecycle of external tempest test"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_ad9e3852","line":62,"in_reply_to":"3a50d1a3_199fbcb5","updated":"2015-07-27 15:20:43.000000000","message":"Yes, unit tests are going to be the next step. I\u0027m not completely sure on how to unit test stevedore plugins yet. I was also waiting on manually testing that this does what we\u0027re expecting before adding unit tests. There are limits to what we\u0027ll actually be able to unit test here. It\u0027ll mostly just be mechanics of the methods making sure they use data from the plugins correctly, which honestly isn\u0027t the most valuable of tests for this. (but it doesn\u0027t hurt)","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4ef4e07b4bb26e7cdbc40f336764c7798a768261","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    plugins. It provides functions for getting set"},{"line_number":67,"context_line":"    \"\"\""},{"line_number":68,"context_line":"    def __init__(self):"},{"line_number":69,"context_line":"        self.ext_plugins \u003d stevedore.ExtensionManager("},{"line_number":70,"context_line":"            \u0027tempest.test.plugins\u0027, invoke_on_load\u003dTrue,"},{"line_number":71,"context_line":"            propagate_map_exceptions\u003dTrue)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_b9c808aa","line":69,"updated":"2015-07-24 00:10:53.000000000","message":"Need rebase.","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1fabab8da92dd8d62d739958bdf3077309add346","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    plugins. It provides functions for getting set"},{"line_number":67,"context_line":"    \"\"\""},{"line_number":68,"context_line":"    def __init__(self):"},{"line_number":69,"context_line":"        self.ext_plugins \u003d stevedore.ExtensionManager("},{"line_number":70,"context_line":"            \u0027tempest.test.plugins\u0027, invoke_on_load\u003dTrue,"},{"line_number":71,"context_line":"            propagate_map_exceptions\u003dTrue)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_0d8f2c24","line":69,"in_reply_to":"3a50d1a3_b9c808aa","updated":"2015-07-27 15:20:43.000000000","message":"It shouldn\u0027t actually matter since it\u0027s far enough away from the new chunks it\u0027ll apply cleanly.","commit_id":"f3cfbff90fcc64cb7c616e07fd151da94cb5b7bd"},{"author":{"_account_id":17211,"name":"Brandon Palm","email":"bapalm@us.ibm.com","username":"bapalm"},"change_message_id":"e2f0a5a37c83cda6b5634aa9c3565dcbfb8f983f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                             in that group."},{"line_number":60,"context_line":"        :rtype: list"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        return []"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_fc106cad","line":62,"updated":"2015-07-31 16:04:47.000000000","message":"As a newbie to Tempest (and OpenStack in general), would would be the purpose of this function?  Isn\u0027t it kind of a waste just to return an empty list?  Thanks!","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":17211,"name":"Brandon Palm","email":"bapalm@us.ibm.com","username":"bapalm"},"change_message_id":"8f01658ecdb8d9110085e1c84ddf2906cf389c2d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                             in that group."},{"line_number":60,"context_line":"        :rtype: list"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        return []"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_b73f5d86","line":62,"in_reply_to":"3a50d1a3_bc3984f4","updated":"2015-07-31 16:21:08.000000000","message":"Ah, okay makes sense now.  Just a safeguard against someone calling get_opt_lists without any parameters.  Thanks for the link it definitely helped.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"40986df11894a961c5f970b476ca5c21213636f0","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                             in that group."},{"line_number":60,"context_line":"        :rtype: list"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        return []"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"@misc.singleton"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_bc3984f4","line":62,"in_reply_to":"3a50d1a3_fc106cad","updated":"2015-07-31 16:11:32.000000000","message":"This is an abstract method being defined in an abstract class. The objective here is to define the interface a plugin will be using in a single place. So on the plugin side you just inherit from this class and it\u0027ll error if you do not overload all the required methods. The empty list here is just a default fallback to make sure the return type is always a list.\n\nYou can read more about abstract classes in python here: \n\nhttps://docs.python.org/2/library/abc.html","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b6589b51eaa40310552aecd9c2785aea2b95d949","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def get_plugin_options_list(self):"},{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_36d9e556","line":96,"updated":"2015-08-03 01:29:14.000000000","message":"Do we need IF condition here ? If any plugin cannot be loaded then it not going to present in self.ext_plugins.\nhttps://github.com/openstack/stevedore/blob/master/stevedore/extension.py#L164\n\nOr m missing anything here.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e7ddd987708b52e3f85055058a60ec16e8773b37","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def get_plugin_options_list(self):"},{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_64465bc1","line":96,"in_reply_to":"3a50d1a3_36d9e556","updated":"2015-08-03 16:00:44.000000000","message":"It\u0027s not strictly necessary, I actually meant to do something like::\n\n    if plug.obj.get_opt_lists():\n\nyou\u0027re right checking if plug doesn\u0027t do anything.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"891da1d0913b3e83a6238dfcaa8f20e347552c04","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_96cc7936","line":97,"updated":"2015-08-03 01:41:11.000000000","message":"We should handle exception here for each plugins? which might be just logging those if any and move forward with other plugins so that Tempest would not fail as whole if something wrong in any plugin.\n\nSame with get_plugin_load_tests_tuple, register_plugin_opts methods. But not in this patch may be in next.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fc70f64a1fbcd740b58b94619a4cb9c3833761a7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_0fabde8a","line":97,"in_reply_to":"1a4dcd0f_0418b783","updated":"2015-08-04 00:16:22.000000000","message":"Yea, somewhat agree but  my main concern is if any plugin has some buggy thing in those overridden methods (any of those), Tempest will be broken as it will be doing auto discovery of buggy plugins too. and it will be till we fix the plugin which is going to be in another project.\n\nI was thinking if we just ignore the buggy plugin if any with zero affect on Tempest or other plugins run. Log exception and remove plugin tests from \"load_tests_dict\".","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6f743440ca5ff46d1e447642c707e3f308095dba","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_9bc16c31","line":97,"in_reply_to":"1a4dcd0f_0fabde8a","updated":"2015-08-04 02:37:07.000000000","message":"As per IRC discussion, I agree not to guard against if there is any bug in plugin for those override methods. Those are assumed to be tested/working fine from plugin. If there is any case that should be caught on gate during import itself.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e7ddd987708b52e3f85055058a60ec16e8773b37","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        plugin_options \u003d []"},{"line_number":95,"context_line":"        for plug in self.ext_plugins:"},{"line_number":96,"context_line":"            if plug:"},{"line_number":97,"context_line":"                plugin_options.extend(plug.obj.get_opt_lists())"},{"line_number":98,"context_line":"        return plugin_options"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_0418b783","line":97,"in_reply_to":"3a50d1a3_96cc7936","updated":"2015-08-03 16:00:44.000000000","message":"Hmm, I\u0027m not sure how defensive we want to get on this stuff. Plugins are by their nature opt-in. If you opt in to garbage that stack traces on these list methods I\u0027m not sure that\u0027s something we care to guard against. It\u0027s just a bug in the plugin that needs to be fixed before you can use it.","commit_id":"a9b32d90aa9cdcb8f4ff947e4a1cc01b993c1cd6"}]}
