)]}'
{"releasenotes/notes/plugin-service-client-registration-00b19a2dd4935ba0.yaml":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"931d7b14cd233c15ecae551f99f3dfe8d5d16f3e","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    any service client they implement. For now this is used by"},{"line_number":6,"context_line":"    tempest only, for auto-registration of service clients"},{"line_number":7,"context_line":"    in the new class `ServiceClients`."},{"line_number":8,"context_line":"  - A new singleton class `clients.ClientsRegistry` is"},{"line_number":9,"context_line":"    available. It holds the service clients registration data"},{"line_number":10,"context_line":"    from all plugins. It is used by `ServiceClients` for"},{"line_number":11,"context_line":"    auto-registration of the service clients implemented"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"bacf61ea_0a1cfe75","line":8,"updated":"2016-07-29 15:14:59.000000000","message":"I would have mentioned this is in tempest.lib, but meh","commit_id":"6d4d85ab7062ec17f5ab332d8e5c4b5e30ca133c"}],"tempest/lib/services/clients.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"c02660a0d1821b5e4c6d02294c3dc25ffd718e08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"dada55a8_93f1766d","updated":"2016-07-19 11:26:56.000000000","message":"The reason this went directly into lib is that I cannot have a stable interface (plugin.py) depending on an unstable one.\nThe rest of the service_client module will be appended here at the end of the patch series.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"901dd7f522293dab90ff46552dfc34d7518a51a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"dada55a8_dcb12de3","in_reply_to":"dada55a8_93f1766d","updated":"2016-07-19 15:59:43.000000000","message":"I am fine to add this as stable interface because this seems good and simple for me.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"901dd7f522293dab90ff46552dfc34d7518a51a5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def register_service_client(self, plugin_name, service_client_data):"},{"line_number":28,"context_line":"        if plugin_name in self._service_clients:"},{"line_number":29,"context_line":"            detailed_error \u003d \u0027Clients for plugin %s already registered\u0027"},{"line_number":30,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":31,"context_line":"                detailed_error\u003ddetailed_error % plugin_name)"},{"line_number":32,"context_line":"        self._service_clients[plugin_name] \u003d service_client_data"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_service_clients(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_1c7e2519","line":31,"range":{"start_line":30,"start_character":29,"end_line":31,"end_character":60},"updated":"2016-07-19 15:59:43.000000000","message":"we need to pass more arguments to this exception as the definition.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"bedf0126f96681a595ddc1fbdbfe40e5d7553847","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def register_service_client(self, plugin_name, service_client_data):"},{"line_number":28,"context_line":"        if plugin_name in self._service_clients:"},{"line_number":29,"context_line":"            detailed_error \u003d \u0027Clients for plugin %s already registered\u0027"},{"line_number":30,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":31,"context_line":"                detailed_error\u003ddetailed_error % plugin_name)"},{"line_number":32,"context_line":"        self._service_clients[plugin_name] \u003d service_client_data"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_service_clients(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_bda420a6","line":31,"range":{"start_line":30,"start_character":29,"end_line":31,"end_character":60},"in_reply_to":"dada55a8_1c7e2519","updated":"2016-07-20 01:09:32.000000000","message":"Yeah I know I was perhaps being a bit lazy on this one. A plugin contains multiple service clients (potentially), so passing the details for one may not make much sense.. also I didn\u0027t want to get into validation of service client registration parameters at this stage.\n\nOptions could be:\n- raise exceptions.ServiceClientRegistrationException(\n                **service_client_data[0],\n                detailed_error\u003ddetailed_error % plugin_name)\n- define a new exception for this\n- leave it as it is, some fields won\u0027t have a value but the detailed_error providers all relevant info.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"32ad85f7f23f2b08bd251254d11756b78fabce24","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def register_service_client(self, plugin_name, service_client_data):"},{"line_number":28,"context_line":"        if plugin_name in self._service_clients:"},{"line_number":29,"context_line":"            detailed_error \u003d \u0027Clients for plugin %s already registered\u0027"},{"line_number":30,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":31,"context_line":"                detailed_error\u003ddetailed_error % plugin_name)"},{"line_number":32,"context_line":"        self._service_clients[plugin_name] \u003d service_client_data"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def get_service_clients(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_6fde416e","line":31,"range":{"start_line":30,"start_character":29,"end_line":31,"end_character":60},"in_reply_to":"dada55a8_bda420a6","updated":"2016-07-26 16:00:29.000000000","message":"I defined a new exception","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"}],"tempest/service_clients.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e23c652841eff084563542a2fc0d532d2ef4b83e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"        if plug_service_versions:"},{"line_number":67,"context_line":"            if not plug_service_versions.isdisjoint(tempest_services()):"},{"line_number":68,"context_line":"                LOG.error("},{"line_number":69,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_9192e19d","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":33},"updated":"2016-07-05 20:59:31.000000000","message":"Why do we need to add this separated condition of line 59?\nI was a little confused.","commit_id":"68eadc926c54c47eca6a27a9dcd755117bc40b78"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e23c652841eff084563542a2fc0d532d2ef4b83e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                                  tempest_services() \u0026"},{"line_number":72,"context_line":"                                                  plug_service_versions))"},{"line_number":73,"context_line":"            continue"},{"line_number":74,"context_line":"        extra_service_versions.extend(plug_service_versions)"},{"line_number":75,"context_line":"    return tempest_services() | extra_service_versions"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_f11ec561","line":74,"updated":"2016-07-05 20:59:31.000000000","message":"This change kills puppet jobs like\n\n2016-07-05 17:09:30.973143 | setUpClass (ceilometer.tests.tempest.api.test_telemetry_notification_api.TelemetryNotificationAPITest)\n2016-07-05 17:09:30.973208 | ------------------------------------------------------------------------------------------------------\n2016-07-05 17:09:30.973224 | \n2016-07-05 17:09:30.973246 | Captured traceback:\n2016-07-05 17:09:30.973268 | ~~~~~~~~~~~~~~~~~~~\n2016-07-05 17:09:30.973298 |     Traceback (most recent call last):\n2016-07-05 17:09:30.973334 |       File \"tempest/test.py\", line 273, in setUpClass\n2016-07-05 17:09:30.973368 |         six.reraise(etype, value, trace)\n2016-07-05 17:09:30.973403 |       File \"tempest/test.py\", line 261, in setUpClass\n2016-07-05 17:09:30.973431 |         cls.setup_credentials()\n2016-07-05 17:09:30.973492 |       File \"/usr/lib/python2.7/site-packages/ceilometer/tests/tempest/api/base.py\", line 58, in setup_credentials\n2016-07-05 17:09:30.973531 |         super(BaseTelemetryTest, cls).setup_credentials()\n2016-07-05 17:09:30.973571 |       File \"tempest/test.py\", line 361, in setup_credentials\n2016-07-05 17:09:30.973603 |         credential_type\u003dcredentials_type)\n2016-07-05 17:09:30.973642 |       File \"tempest/test.py\", line 519, in get_client_manager\n2016-07-05 17:09:30.973681 |         cred_provider \u003d cls._get_credentials_provider()\n2016-07-05 17:09:30.973723 |       File \"tempest/test.py\", line 497, in _get_credentials_provider\n2016-07-05 17:09:30.973759 |         identity_version\u003dcls.get_identity_version())\n2016-07-05 17:09:30.973809 |       File \"tempest/common/credentials_factory.py\", line 83, in get_credentials_provider\n2016-07-05 17:09:30.973865 |         **get_dynamic_provider_params())\n2016-07-05 17:09:30.973917 |       File \"tempest/common/dynamic_creds.py\", line 69, in __init__\n2016-07-05 17:09:30.973961 |         self.security_groups_admin_client) \u003d self._get_admin_clients()\n2016-07-05 17:09:30.974005 |       File \"tempest/common/dynamic_creds.py\", line 92, in _get_admin_clients\n2016-07-05 17:09:30.974042 |         os \u003d clients.Manager(self.default_admin_creds)\n2016-07-05 17:09:30.974078 |       File \"tempest/clients.py\", line 65, in __init__\n2016-07-05 17:09:30.974122 |         client_parameters\u003dself._prepare_configuration())\n2016-07-05 17:09:30.974161 |       File \"tempest/service_clients.py\", line 275, in __init__\n2016-07-05 17:09:30.974193 |         for service in available_services():\n2016-07-05 17:09:30.974236 |       File \"tempest/service_clients.py\", line 74, in available_services\n2016-07-05 17:09:30.974276 |         extra_service_versions.extend(plug_service_versions)\n2016-07-05 17:09:30.974313 |     AttributeError: \u0027set\u0027 object has no attribute \u0027extend\u0027","commit_id":"68eadc926c54c47eca6a27a9dcd755117bc40b78"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e23c652841eff084563542a2fc0d532d2ef4b83e","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        :param service_version: Name of the service complete with version."},{"line_number":309,"context_line":"            Used to track registered services. When a plugin implements it,"},{"line_number":310,"context_line":"            it can be used by other plugins to obtain their configuration."},{"line_number":311,"context_line":"        :param module_path Path to module that includes all service clients."},{"line_number":312,"context_line":"            All service client classes must be exposed by a single module."},{"line_number":313,"context_line":"            If they are separated in different modules, defining __all__"},{"line_number":314,"context_line":"            in the root module can help, similar to what is done by service"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_11e1d1d0","line":311,"range":{"start_line":311,"start_character":26,"end_line":311,"end_character":27},"updated":"2016-07-05 20:59:31.000000000","message":"nit: Add :","commit_id":"68eadc926c54c47eca6a27a9dcd755117bc40b78"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e23c652841eff084563542a2fc0d532d2ef4b83e","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            If they are separated in different modules, defining __all__"},{"line_number":314,"context_line":"            in the root module can help, similar to what is done by service"},{"line_number":315,"context_line":"            clients in tempest."},{"line_number":316,"context_line":"        :param client_names List or set of names of the service client classes."},{"line_number":317,"context_line":"        :param kwargs Extra optional parameters to be passed to all clients."},{"line_number":318,"context_line":"            ServiceClient provides defaults for region, dscv, ca_certs and"},{"line_number":319,"context_line":"            trace_requests."}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_f1dc0514","line":316,"range":{"start_line":316,"start_character":27,"end_line":316,"end_character":28},"updated":"2016-07-05 20:59:31.000000000","message":"ditto","commit_id":"68eadc926c54c47eca6a27a9dcd755117bc40b78"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"e23c652841eff084563542a2fc0d532d2ef4b83e","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            in the root module can help, similar to what is done by service"},{"line_number":315,"context_line":"            clients in tempest."},{"line_number":316,"context_line":"        :param client_names List or set of names of the service client classes."},{"line_number":317,"context_line":"        :param kwargs Extra optional parameters to be passed to all clients."},{"line_number":318,"context_line":"            ServiceClient provides defaults for region, dscv, ca_certs and"},{"line_number":319,"context_line":"            trace_requests."},{"line_number":320,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_1108b190","line":317,"range":{"start_line":317,"start_character":21,"end_line":317,"end_character":22},"updated":"2016-07-05 20:59:31.000000000","message":"ditto","commit_id":"68eadc926c54c47eca6a27a9dcd755117bc40b78"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"8fb692f50379878dcf1a483c5e0ca9f6d38bc1fd","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest.lib import auth"},{"line_number":23,"context_line":"from tempest.lib import exceptions"},{"line_number":24,"context_line":"from tempest.test_discover import plugins"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aa78d24_e9b82bca","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":41},"updated":"2016-07-07 16:02:24.000000000","message":"This is a problem when moving this module to tempest.lib, hacking won\u0027t allow it. One alternative it to remove the plugin service client self registration, an push it to the plugins. I\u0027m looking for alternatives.","commit_id":"9f522481488b947ed25da770da063f265a9ac63b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8d369e50f578337df61154122d91df506b77a208","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_5bd19e56","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"updated":"2016-07-26 08:32:33.000000000","message":"Should we just ignore them ?\n\nThis actually depends on plugins installed. A plugin can register other plugin\u0027s service clients also depending on their tests and if those are already registered by other plugin then this is issue.\n\nPerfect example of this case is Congress- \n- Congress plugin will register ceilometer service client with different param for their scenario tests\n- Ceilometer plugin also register ceilometer service client with different param than congress one.\n\nIf both plugin are installed then, we end up registering only one service client(which one we do not know).\n\nIn that case, i think we must expect \u0027name\u0027 of such clients appended with plugin name etc, like-  \u003cplugin_name\u003e_\u003cservice_client_name\u003e(congress_telemetry_clients) ?\n\nIf not passed like that then error.\n\nand if so we should document that that very clearly may be in plugins.py-\u003eget_service_clients(\nor in http://docs.openstack.org/developer/tempest/plugin.html","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e11390ed9c3518ae9b51dae6f889800863b923ce","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_381cca11","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"bacf61ea_1d1d78bd","updated":"2016-07-29 10:00:52.000000000","message":"Yea, i think i got it now. plugin has to be present if their service client is needed by other.\nThanks","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4ab77ccb8eda457a8b2ecb1393fc36c9dba11abf","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_e76e1595","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"bacf61ea_60ddf60d","updated":"2016-07-29 08:53:55.000000000","message":"ah i got the clear case here which is not in current plugins but may be in future. \n\nProblem is if we have plugin in separate repo and other plugin need their service client.\n\nplugin_1 (of project_1) - expose service_clients1\n\nproject_1 and  plugin_1 are in separate repo\n\nproject_2 plugin has scenario tests which interact with project_1 so need service_clients1. SO need to expose service_clients1 (as plugin_1 might not be present when project_1 is there)\n\nIn that case 2 plugin end up exposing the same client.\n\nThis is very future case or might not occur but we should handle. \nNow I am thinking if we just ignore the duplicate clients even in register_service_client_module","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d4c1f84748e1ff78a0acddeacf3fe4a699e406c6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_1d1d78bd","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"bacf61ea_e76e1595","updated":"2016-07-29 09:45:59.000000000","message":"I disagree with this. If you setup a venv where you install plugins you need, you can pull in all the service clients you need, regardless of whether they are in-tree with a project or in a dedicated repo.\nI don\u0027t want to make the code to make is easy to have a proliferation of implementations of service clients for the same service.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"32ad85f7f23f2b08bd251254d11756b78fabce24","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_cff3ed71","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"dada55a8_1efb7d7c","updated":"2016-07-26 16:00:29.000000000","message":"I changed this to raise an Exception to be inline with L296","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"4de53da346ef6785652a83b582fa1d2bb639ab6c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_1efb7d7c","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"dada55a8_5bd19e56","updated":"2016-07-26 14:49:08.000000000","message":"This is not about how plugin use service clients, it\u0027s about which service clients they expose via the plugin interface.\n\nCongress plugin won\u0027t expose the ceilometer service client. It may try to use it though, as long as it has a hard dependency on the ceilometer plugin.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"dfdba1c40f084f4ff5d80a1b4a3e4b6a1ea6375a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                                     plugin_services[plugin_name]])"},{"line_number":58,"context_line":"        # If a plugin exposes a duplicate service_version skip it"},{"line_number":59,"context_line":"        if plug_service_versions:"},{"line_number":60,"context_line":"            if not plug_service_versions.isdisjoint(extra_service_versions):"},{"line_number":61,"context_line":"                LOG.error("},{"line_number":62,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"},{"line_number":63,"context_line":"                    \u0027claimed by another one\u0027 % (plugin_name,"},{"line_number":64,"context_line":"                                                extra_service_versions \u0026"},{"line_number":65,"context_line":"                                                plug_service_versions))"},{"line_number":66,"context_line":"            if not plug_service_versions.isdisjoint(tempest_modules()):"},{"line_number":67,"context_line":"                LOG.error("},{"line_number":68,"context_line":"                    \u0027Plugin %s is trying to register a service %s already \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_60ddf60d","line":65,"range":{"start_line":60,"start_character":0,"end_line":65,"end_character":71},"in_reply_to":"dada55a8_cff3ed71","updated":"2016-07-29 08:47:00.000000000","message":"humm, actually issue is if only congress plugin is installed which need ceilometer clients, then it need to to expose the ceiolmeter client. \n\nIf so then issue comes when ceilmeter (exposing its client) and congress plugin (also exposing the same) both installed.\n\nBut we can invalidate this case as congress need ceilometer to be installed so expect ceilometer plugin to be installed which eventually expose the required clients So they do not need to expose the ceilometer client.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"615744ed310c801018ed2068e0f6949b0667874a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        :param scope: default scope for tokens produced by the auth provider"},{"line_number":224,"context_line":"        :param disable_ssl_certificate_validation Applies to auth and to all"},{"line_number":225,"context_line":"                                                  service clients."},{"line_number":226,"context_line":"        :param ca_certs: Applies to auth and to all service clients."},{"line_number":227,"context_line":"        :param trace_requests: Applies to auth and to all service clients."},{"line_number":228,"context_line":"        :param client_parameters: Dictionary with parameters for service"},{"line_number":229,"context_line":"            clients. Keys of the dictionary are the service client service"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_0521a14d","line":226,"updated":"2016-07-25 17:53:36.000000000","message":"This is an unrelated fix, if you have to respin can you drop this part","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"32ad85f7f23f2b08bd251254d11756b78fabce24","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        :param scope: default scope for tokens produced by the auth provider"},{"line_number":224,"context_line":"        :param disable_ssl_certificate_validation Applies to auth and to all"},{"line_number":225,"context_line":"                                                  service clients."},{"line_number":226,"context_line":"        :param ca_certs: Applies to auth and to all service clients."},{"line_number":227,"context_line":"        :param trace_requests: Applies to auth and to all service clients."},{"line_number":228,"context_line":"        :param client_parameters: Dictionary with parameters for service"},{"line_number":229,"context_line":"            clients. Keys of the dictionary are the service client service"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_3e8761b6","line":226,"in_reply_to":"dada55a8_0521a14d","updated":"2016-07-26 16:00:29.000000000","message":"Done","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"901dd7f522293dab90ff46552dfc34d7518a51a5","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # other plugins, so we continue the registration process"},{"line_number":294,"context_line":"                try:"},{"line_number":295,"context_line":"                    self.register_service_client_module(**service_client)"},{"line_number":296,"context_line":"                except Exception:"},{"line_number":297,"context_line":"                    LOG.exception("},{"line_number":298,"context_line":"                        \u0027Failed to register service client from plugin %s \u0027"},{"line_number":299,"context_line":"                        \u0027with parameters %s\u0027 % (plugin, service_client))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_1cb2a594","line":296,"range":{"start_line":296,"start_character":23,"end_line":296,"end_character":32},"updated":"2016-07-19 15:59:43.000000000","message":"Can we catch a specific exception here instead of Exception?\n\nThe following LOG.exception doesn\u0027t contain the actual exception, so it seems nice to specify it.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"615744ed310c801018ed2068e0f6949b0667874a","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # other plugins, so we continue the registration process"},{"line_number":294,"context_line":"                try:"},{"line_number":295,"context_line":"                    self.register_service_client_module(**service_client)"},{"line_number":296,"context_line":"                except Exception:"},{"line_number":297,"context_line":"                    LOG.exception("},{"line_number":298,"context_line":"                        \u0027Failed to register service client from plugin %s \u0027"},{"line_number":299,"context_line":"                        \u0027with parameters %s\u0027 % (plugin, service_client))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_e51bad1a","line":296,"updated":"2016-07-25 17:53:36.000000000","message":"So if this is the path we want it looks fine to me, it\u0027s a catchall to make sure any failure isn\u0027t fatal. The question about whether we want this to be fatal or not is something else. It\u0027s not like we\u0027re consistent on this in plugin interfaces at all. I\u0027m normally of the mindset fail, and fail early with a clear message. Because unless something fails no one will look at a log file \u003e1M. But, I don\u0027t really feel too strongly about this","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"32ad85f7f23f2b08bd251254d11756b78fabce24","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # other plugins, so we continue the registration process"},{"line_number":294,"context_line":"                try:"},{"line_number":295,"context_line":"                    self.register_service_client_module(**service_client)"},{"line_number":296,"context_line":"                except Exception:"},{"line_number":297,"context_line":"                    LOG.exception("},{"line_number":298,"context_line":"                        \u0027Failed to register service client from plugin %s \u0027"},{"line_number":299,"context_line":"                        \u0027with parameters %s\u0027 % (plugin, service_client))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_4f87fdb4","line":296,"in_reply_to":"dada55a8_1c50b3d3","updated":"2016-07-26 16:00:29.000000000","message":"On second thoughts, failing provides more protection against broken implementations, so switching to that.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"bedf0126f96681a595ddc1fbdbfe40e5d7553847","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # other plugins, so we continue the registration process"},{"line_number":294,"context_line":"                try:"},{"line_number":295,"context_line":"                    self.register_service_client_module(**service_client)"},{"line_number":296,"context_line":"                except Exception:"},{"line_number":297,"context_line":"                    LOG.exception("},{"line_number":298,"context_line":"                        \u0027Failed to register service client from plugin %s \u0027"},{"line_number":299,"context_line":"                        \u0027with parameters %s\u0027 % (plugin, service_client))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_9d22fcff","line":296,"range":{"start_line":296,"start_character":23,"end_line":296,"end_character":32},"in_reply_to":"dada55a8_1cb2a594","updated":"2016-07-20 01:09:32.000000000","message":"LOG.exception will log the entire stack trace, so that should be enough.\nI could catch ServiceClientRegistrationException but I would also catch Exception anyways, and the handling would be the same, so I see no reason to separate it.\nI need to catch Exception here because I cannot risk compromising the service clients because of a bad plugin.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"07353d5248fd4d1bc81dda30433b6530548b4aa4","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # other plugins, so we continue the registration process"},{"line_number":294,"context_line":"                try:"},{"line_number":295,"context_line":"                    self.register_service_client_module(**service_client)"},{"line_number":296,"context_line":"                except Exception:"},{"line_number":297,"context_line":"                    LOG.exception("},{"line_number":298,"context_line":"                        \u0027Failed to register service client from plugin %s \u0027"},{"line_number":299,"context_line":"                        \u0027with parameters %s\u0027 % (plugin, service_client))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_1c50b3d3","line":296,"in_reply_to":"dada55a8_e51bad1a","updated":"2016-07-26 11:41:48.000000000","message":"OK, I guess I will take this to the QA meeting and perhaps on the ML.\nI see the value of failing fast and forcing people to fix their plugin, but also there is value in reducing attrition between different plugins. Not sure what is best here really.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8d369e50f578337df61154122d91df506b77a208","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        :param kwargs: Extra optional parameters to be passed to all clients."},{"line_number":320,"context_line":"            ServiceClient provides defaults for region, dscv, ca_certs and"},{"line_number":321,"context_line":"            trace_requests."},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        if hasattr(self, name):"},{"line_number":324,"context_line":"            using_name \u003d getattr(self, name)"},{"line_number":325,"context_line":"            detailed_error \u003d \u0027Module name already in use: %s\u0027 % using_name"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_56885571","line":322,"range":{"start_line":322,"start_character":7,"end_line":322,"end_character":11},"updated":"2016-07-26 08:32:33.000000000","message":"should mention about the raise exception for registering the same client.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"07353d5248fd4d1bc81dda30433b6530548b4aa4","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        :param kwargs: Extra optional parameters to be passed to all clients."},{"line_number":320,"context_line":"            ServiceClient provides defaults for region, dscv, ca_certs and"},{"line_number":321,"context_line":"            trace_requests."},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        if hasattr(self, name):"},{"line_number":324,"context_line":"            using_name \u003d getattr(self, name)"},{"line_number":325,"context_line":"            detailed_error \u003d \u0027Module name already in use: %s\u0027 % using_name"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_bc6b67b8","line":322,"range":{"start_line":322,"start_character":7,"end_line":322,"end_character":11},"in_reply_to":"dada55a8_56885571","updated":"2016-07-26 11:41:48.000000000","message":"Will do","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8d369e50f578337df61154122d91df506b77a208","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":328,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":329,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":330,"context_line":"        if service_version in self.registered_services:"},{"line_number":331,"context_line":"            detailed_error \u003d \u0027Service %s already registered.\u0027 % service_version"},{"line_number":332,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":333,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":334,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":335,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":336,"context_line":"        params \u003d dict(region\u003dself.region,"},{"line_number":337,"context_line":"                      disable_ssl_certificate_validation\u003dself.dscv,"},{"line_number":338,"context_line":"                      ca_certs\u003dself.ca_certs,"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_56d97556","line":335,"range":{"start_line":330,"start_character":0,"end_line":335,"end_character":46},"updated":"2016-07-26 08:32:33.000000000","message":"But if someone want to register same service clients(same service_version) with different name which differ with params ?\n\nExample-\nceilometer- {\u0027name\u0027: \u0027telemetry\u0027,\n                      \u0027service_version\u0027: \u0027telemetry\u0027\n                      ..., **kwargs_1}\n\ncongress - {\u0027name\u0027: \u0027congress_telemetry\u0027,\n            \u0027service_version\u0027: \u0027telemetry\u0027\n            ..., **kwargs_2}\n\nI did not get to check the duplication of service_versions, should not name checking enough?","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"dfdba1c40f084f4ff5d80a1b4a3e4b6a1ea6375a","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":328,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":329,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":330,"context_line":"        if service_version in self.registered_services:"},{"line_number":331,"context_line":"            detailed_error \u003d \u0027Service %s already registered.\u0027 % service_version"},{"line_number":332,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":333,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":334,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":335,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":336,"context_line":"        params \u003d dict(region\u003dself.region,"},{"line_number":337,"context_line":"                      disable_ssl_certificate_validation\u003dself.dscv,"},{"line_number":338,"context_line":"                      ca_certs\u003dself.ca_certs,"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_4cbe28d5","line":335,"range":{"start_line":330,"start_character":0,"end_line":335,"end_character":46},"in_reply_to":"dada55a8_1c46f34e","updated":"2016-07-29 08:47:00.000000000","message":"ditto.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"07353d5248fd4d1bc81dda30433b6530548b4aa4","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":328,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":329,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":330,"context_line":"        if service_version in self.registered_services:"},{"line_number":331,"context_line":"            detailed_error \u003d \u0027Service %s already registered.\u0027 % service_version"},{"line_number":332,"context_line":"            raise exceptions.ServiceClientRegistrationException("},{"line_number":333,"context_line":"                name\u003dname, service_version\u003dservice_version,"},{"line_number":334,"context_line":"                module_path\u003dmodule_path, client_names\u003dclient_names,"},{"line_number":335,"context_line":"                detailed_error\u003ddetailed_error)"},{"line_number":336,"context_line":"        params \u003d dict(region\u003dself.region,"},{"line_number":337,"context_line":"                      disable_ssl_certificate_validation\u003dself.dscv,"},{"line_number":338,"context_line":"                      ca_certs\u003dself.ca_certs,"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_1c46f34e","line":335,"range":{"start_line":330,"start_character":0,"end_line":335,"end_character":46},"in_reply_to":"dada55a8_56d97556","updated":"2016-07-26 11:41:48.000000000","message":"I want to enforce here that a service client for is only registered once.\nThe parameters that are passed into the registration API are the default values from config (which is same for all plugins). If a test requires a client with different settings, it can get it by passing those settings to the client when getting it from the factory.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"}],"tempest/test_discover/plugins.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8d369e50f578337df61154122d91df506b77a208","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        in any ServiceClients object instantiated by tests."},{"line_number":72,"context_line":"        The default implementation returns an empty list."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        :return list of dictionaries. Each element of the list represents"},{"line_number":75,"context_line":"            the service client for an API. Each dict must define all"},{"line_number":76,"context_line":"            parameters required for the invocation of"},{"line_number":77,"context_line":"            `service_clients.ServiceClients.register_service_client_module`."},{"line_number":78,"context_line":"        :rtype: list"},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_d87d941d","line":77,"range":{"start_line":74,"start_character":38,"end_line":77,"end_character":76},"updated":"2016-07-26 08:32:33.000000000","message":"may be a detailed example would be more better here.\n\nSpecially to show how to register other plugin\u0027s service clients to avoid any error (as commented in previous files).","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"f8bcd61b85c96b3d9c295fbee66f957ce40a572f","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        in any ServiceClients object instantiated by tests."},{"line_number":72,"context_line":"        The default implementation returns an empty list."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        :return list of dictionaries. Each element of the list represents"},{"line_number":75,"context_line":"            the service client for an API. Each dict must define all"},{"line_number":76,"context_line":"            parameters required for the invocation of"},{"line_number":77,"context_line":"            `service_clients.ServiceClients.register_service_client_module`."},{"line_number":78,"context_line":"        :rtype: list"},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_bc7fe715","line":77,"range":{"start_line":74,"start_character":38,"end_line":77,"end_character":76},"in_reply_to":"dada55a8_d87d941d","updated":"2016-07-26 11:44:01.000000000","message":"ok, I\u0027ll add some more docs here and in the plugin docs in general","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"}],"tempest/tests/test_service_clients.py":[{"author":{"_account_id":14885,"name":"Daniel Mellado","email":"dmellado@redhat.com","username":"daniel-mellado"},"change_message_id":"f43803833a5c242a2ef0b506e5826b2d941fe5b0","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            client_names\u003d[],"},{"line_number":278,"context_line":"            **expected_params)"},{"line_number":279,"context_line":"        self.assertThat(_manager, has_attribute(\u0027fake_module\u0027))"},{"line_number":280,"context_line":"        # Assert called once, without check for exact parameters"},{"line_number":281,"context_line":"        self.assertTrue(factory_mock.called)"},{"line_number":282,"context_line":"        self.assertEqual(1, factory_mock.call_count)"},{"line_number":283,"context_line":"        # Assert expected params are in with their values"},{"line_number":284,"context_line":"        actual_kwargs \u003d factory_mock.call_args[1]"},{"line_number":285,"context_line":"        self.assertIn(\u0027region\u0027, actual_kwargs)"}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_d34c9772","line":282,"range":{"start_line":280,"start_character":0,"end_line":282,"end_character":52},"updated":"2016-07-19 08:34:32.000000000","message":"What would be the value on assert that is called without checking it for parameters?","commit_id":"9f522481488b947ed25da770da063f265a9ac63b"}],"tempest/tests/test_tempest_plugin.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"615744ed310c801018ed2068e0f6949b0667874a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from tempest.tests import fake_tempest_plugin as fake_plugin"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestPluginDiscovery(base.TestCase):"},{"line_number":23,"context_line":"    def test_load_tests_with_one_plugin(self):"},{"line_number":24,"context_line":"        # we can\u0027t mock stevedore since it\u0027s a singleton and already executed"},{"line_number":25,"context_line":"        # during test discovery. So basically this test covers the plugin loop"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_451b991b","line":22,"updated":"2016-07-25 17:53:36.000000000","message":"It\u0027d be good to have a test to ensure that not having the plugin method for clients in your class isn\u0027t fatal. That would require adding a new fake class but I think it\u0027lll be good to just ensure in unit tests that we aren\u0027t causing an issue for existing plugins.","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"32ad85f7f23f2b08bd251254d11756b78fabce24","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from tempest.tests import fake_tempest_plugin as fake_plugin"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestPluginDiscovery(base.TestCase):"},{"line_number":23,"context_line":"    def test_load_tests_with_one_plugin(self):"},{"line_number":24,"context_line":"        # we can\u0027t mock stevedore since it\u0027s a singleton and already executed"},{"line_number":25,"context_line":"        # during test discovery. So basically this test covers the plugin loop"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_245590c1","line":22,"in_reply_to":"dada55a8_451b991b","updated":"2016-07-26 16:00:29.000000000","message":"Done","commit_id":"36cb1a9d32814fb31710eb767c060ae4b465e670"}]}
