)]}'
{"tempest/clients.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"da6ede900b7304fdf4a86477a6422ecc769b8e3a","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        super(Manager, self).__init__("},{"line_number":68,"context_line":"            credentials\u003dcredentials, identity_uri\u003didentity_uri, scope\u003dscope,"},{"line_number":69,"context_line":"            region\u003dCONF.identity.region,"},{"line_number":70,"context_line":"            **(dict(self._prepare_configuration(), **self.default_params)))"},{"line_number":71,"context_line":"        # TODO(andreaf) When clients are initialised without the right"},{"line_number":72,"context_line":"        # parameters available, the calls below will trigger a KeyError."},{"line_number":73,"context_line":"        # We should catch that and raise a better error."}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_1e459516","line":70,"updated":"2016-06-22 16:00:42.000000000","message":"ugh, this is ugly, I\u0027m not sure I even understand what this is doing. Also is the result from _prepare_configuration always a dict?","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acf960aa09c7d8f7627fdbe78fab886a4043d9cf","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        super(Manager, self).__init__("},{"line_number":68,"context_line":"            credentials\u003dcredentials, identity_uri\u003didentity_uri, scope\u003dscope,"},{"line_number":69,"context_line":"            region\u003dCONF.identity.region,"},{"line_number":70,"context_line":"            **(dict(self._prepare_configuration(), **self.default_params)))"},{"line_number":71,"context_line":"        # TODO(andreaf) When clients are initialised without the right"},{"line_number":72,"context_line":"        # parameters available, the calls below will trigger a KeyError."},{"line_number":73,"context_line":"        # We should catch that and raise a better error."}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_dcb78bf3","line":70,"in_reply_to":"3aaa91ec_1e459516","updated":"2016-06-22 21:01:14.000000000","message":"_prepare_configuration() always returns a dict.\ndict(my_dict, **my_dict2) builds a new dict which contains my_dict and my_dict2 applied as an update. \nThere shouldn\u0027t be any conflict, but it should probably be the other way around (default params first). In any case if you find this not readable I can split in multiple lines.","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"da6ede900b7304fdf4a86477a6422ecc769b8e3a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        configuration \u003d {}"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # Parameter / config item names"},{"line_number":120,"context_line":"        parameters \u003d {\u0027region\u0027, \u0027catalog_type\u0027, \u0027endpoint_type\u0027,"},{"line_number":121,"context_line":"                      \u0027build_timeout\u0027, \u0027build_interval\u0027}"},{"line_number":122,"context_line":"        identity_parameters \u003d {\u0027uri\u0027, \u0027uri_v3\u0027, \u0027v2_admin_endpoint_type\u0027,"},{"line_number":123,"context_line":"                               \u0027v2_public_endpoint_type\u0027, \u0027v3_endpoint_type\u0027}"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_7e4c9942","line":120,"updated":"2016-06-22 16:00:42.000000000","message":"nit: I always found this syntax confusing for sets, since it\u0027s the same brace as a dict and prefer to use set() for sets","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"da6ede900b7304fdf4a86477a6422ecc769b8e3a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            configuration[service] \u003d {}"},{"line_number":129,"context_line":"            # Group names replace \"-\" with \"_\" in service names"},{"line_number":130,"context_line":"            config_group \u003d service.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":131,"context_line":"            options \u003d getattr(CONF, config_group)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"            # Setup the standard parameters"},{"line_number":134,"context_line":"            for parameter in parameters:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_5e471d1d","line":131,"updated":"2016-06-22 16:00:42.000000000","message":"We probably should have a here:\n\n  if not options:\n     LOG something?\n     continue","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"da6ede900b7304fdf4a86477a6422ecc769b8e3a","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"            # Setup the standard parameters"},{"line_number":134,"context_line":"            for parameter in parameters:"},{"line_number":135,"context_line":"                # Exclude a few differences in configuration items"},{"line_number":136,"context_line":"                if ((parameter \u003d\u003d \u0027endpoint_type\u0027 and service \u003d\u003d \u0027identity\u0027) or"},{"line_number":137,"context_line":"                    (parameter.startswith(\u0027build_\u0027) and"},{"line_number":138,"context_line":"                        service in (\u0027identity\u0027, \u0027object-storage\u0027))):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_be5601d0","line":135,"updated":"2016-06-22 16:00:42.000000000","message":"Maybe we should call these differences out specifically in the comment. I know why, but it might be difficult for people to grok exactly why this is needed.","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    # timeout values don\u0027t exist."},{"line_number":46,"context_line":"    default_params_with_timeout_values \u003d config.service_client_config("},{"line_number":47,"context_line":"        \u0027compute\u0027)"},{"line_number":48,"context_line":"    del default_params_with_timeout_values[\u0027region\u0027]"},{"line_number":49,"context_line":"    del default_params_with_timeout_values[\u0027endpoint_type\u0027]"},{"line_number":50,"context_line":"    del default_params_with_timeout_values[\u0027catalog_type\u0027]"},{"line_number":51,"context_line":"    default_params_with_timeout_values.update(default_params)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_05c81d54","line":48,"updated":"2016-06-30 16:39:27.000000000","message":"Heh, this is just because we default to everything compute and override per service when necessary. Do you think this is better than just referencing the raw CONF values for build_interval and build_timeout like before?","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    # timeout values don\u0027t exist."},{"line_number":46,"context_line":"    default_params_with_timeout_values \u003d config.service_client_config("},{"line_number":47,"context_line":"        \u0027compute\u0027)"},{"line_number":48,"context_line":"    del default_params_with_timeout_values[\u0027region\u0027]"},{"line_number":49,"context_line":"    del default_params_with_timeout_values[\u0027endpoint_type\u0027]"},{"line_number":50,"context_line":"    del default_params_with_timeout_values[\u0027catalog_type\u0027]"},{"line_number":51,"context_line":"    default_params_with_timeout_values.update(default_params)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_e024df60","line":48,"in_reply_to":"3aaa91ec_05c81d54","updated":"2016-06-30 17:12:16.000000000","message":"I don\u0027t mind really. \nI always try to keep the number of places I reference to a config settings as little as possible because that makes it easier to ensure we always honour the right configuration settings, which is why I did this.\nOn the other side getting the whole client settings and deleting a few items looks a bit ugly / confusing.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"df7fec91a9bd0ef44568308c49e10db4d24011f4","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    # timeout values don\u0027t exist."},{"line_number":46,"context_line":"    default_params_with_timeout_values \u003d config.service_client_config("},{"line_number":47,"context_line":"        \u0027compute\u0027)"},{"line_number":48,"context_line":"    del default_params_with_timeout_values[\u0027region\u0027]"},{"line_number":49,"context_line":"    del default_params_with_timeout_values[\u0027endpoint_type\u0027]"},{"line_number":50,"context_line":"    del default_params_with_timeout_values[\u0027catalog_type\u0027]"},{"line_number":51,"context_line":"    default_params_with_timeout_values.update(default_params)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_ccea8f74","line":48,"in_reply_to":"3aaa91ec_e024df60","updated":"2016-07-01 13:20:55.000000000","message":"Actually, since I moved the default logic to the config helper, this is only needed by baremetal and data_processing clients...","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            \u0027service\u0027: self.parameters[\u0027network\u0027][\u0027catalog_type\u0027],"},{"line_number":120,"context_line":"            \u0027region\u0027: self.parameters[\u0027network\u0027][\u0027region\u0027]"},{"line_number":121,"context_line":"        }"},{"line_number":122,"context_line":"        # Optional parameters"},{"line_number":123,"context_line":"        for _key in (\u0027endpoint_type\u0027, \u0027build_interval\u0027, \u0027build_timeout\u0027):"},{"line_number":124,"context_line":"            _value \u003d self.parameters[\u0027network\u0027].get(_key)"},{"line_number":125,"context_line":"            if _value:"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_65c3e138","line":122,"updated":"2016-06-30 16:39:27.000000000","message":"So these params weren\u0027t optional before. The config value had a default which was used. Does this change that?","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            \u0027service\u0027: self.parameters[\u0027network\u0027][\u0027catalog_type\u0027],"},{"line_number":120,"context_line":"            \u0027region\u0027: self.parameters[\u0027network\u0027][\u0027region\u0027]"},{"line_number":121,"context_line":"        }"},{"line_number":122,"context_line":"        # Optional parameters"},{"line_number":123,"context_line":"        for _key in (\u0027endpoint_type\u0027, \u0027build_interval\u0027, \u0027build_timeout\u0027):"},{"line_number":124,"context_line":"            _value \u003d self.parameters[\u0027network\u0027].get(_key)"},{"line_number":125,"context_line":"            if _value:"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_007acb23","line":122,"in_reply_to":"3aaa91ec_65c3e138","updated":"2016-06-30 17:12:16.000000000","message":"You are right, it does - now if those are not set it will default to the compute ones. I can switch back to make them mandatory, as making them optional is not really part of this patch.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        # in endpoint_type"},{"line_number":311,"context_line":"        params_v3 \u003d params.copy()"},{"line_number":312,"context_line":"        params_v3[\u0027endpoint_type\u0027] \u003d ("},{"line_number":313,"context_line":"            self.parameters[\u0027identity\u0027][\u0027endpoint_type\u0027])"},{"line_number":314,"context_line":"        self.domains_client \u003d identity.v3.DomainsClient(self.auth_provider,"},{"line_number":315,"context_line":"                                                        **params_v3)"},{"line_number":316,"context_line":"        self.identity_v3_client \u003d identity.v3.IdentityClient("}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_45bea5ae","line":313,"updated":"2016-06-30 16:39:27.000000000","message":"Why not make this v3_endpoint_type to be a bit more clear? having catalog_type \u003d v2 and endpoint_type \u003d v3 is a little confusing","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        # in endpoint_type"},{"line_number":311,"context_line":"        params_v3 \u003d params.copy()"},{"line_number":312,"context_line":"        params_v3[\u0027endpoint_type\u0027] \u003d ("},{"line_number":313,"context_line":"            self.parameters[\u0027identity\u0027][\u0027endpoint_type\u0027])"},{"line_number":314,"context_line":"        self.domains_client \u003d identity.v3.DomainsClient(self.auth_provider,"},{"line_number":315,"context_line":"                                                        **params_v3)"},{"line_number":316,"context_line":"        self.identity_v3_client \u003d identity.v3.IdentityClient("}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_a09777ea","line":313,"in_reply_to":"3aaa91ec_45bea5ae","updated":"2016-06-30 17:12:16.000000000","message":"Yes, these endpoints from identity are a nightmare.\n\nThe reason for having endpoint_type here is that for other clients service_client_config returns a dict that can be used to initialise the client with no massaging needed. In this way it\u0027s the same at least for identity_v3.\n\nIdentity_v2 is odd, because we need two instances of the client, one with admin and one with public endpoint, and v2 is being deprecated. \n\nBut TBH I could not find any solution that wasn\u0027t confusing in some part.\nThe current approach means that config.service_client_config can be used to get valid __init__ params for all service clients except identity_v2.\n\nAn alternative would be to accept some extra param in service_client_config to handle identity_v2 clients, but I didn\u0027t want to poison the new interface only to handle a weird v2 case which is only used by a few tests.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _set_network_clients(self):"},{"line_number":124,"context_line":"        params \u003d self.parameters[\u0027network\u0027]"},{"line_number":125,"context_line":"        params.update(self.default_params)"},{"line_number":126,"context_line":"        self.network_agents_client \u003d network.AgentsClient("},{"line_number":127,"context_line":"            self.auth_provider, **params)"},{"line_number":128,"context_line":"        self.network_extensions_client \u003d network.ExtensionsClient("}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_e01bc319","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":42},"updated":"2016-07-05 06:16:26.000000000","message":"we can avoid these id default param also can be returned always in config.service_client_config","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"0451787071cb6efa383cb15d8aa45fad5796304d","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _set_network_clients(self):"},{"line_number":124,"context_line":"        params \u003d self.parameters[\u0027network\u0027]"},{"line_number":125,"context_line":"        params.update(self.default_params)"},{"line_number":126,"context_line":"        self.network_agents_client \u003d network.AgentsClient("},{"line_number":127,"context_line":"            self.auth_provider, **params)"},{"line_number":128,"context_line":"        self.network_extensions_client \u003d network.ExtensionsClient("}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_969caec1","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":42},"in_reply_to":"1aa78d24_e01bc319","updated":"2016-07-05 13:49:43.000000000","message":"Done","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _set_network_clients(self):"},{"line_number":124,"context_line":"        params \u003d self.parameters[\u0027network\u0027]"},{"line_number":125,"context_line":"        params.update(self.default_params)"},{"line_number":126,"context_line":"        self.network_agents_client \u003d network.AgentsClient("},{"line_number":127,"context_line":"            self.auth_provider, **params)"},{"line_number":128,"context_line":"        self.network_extensions_client \u003d network.ExtensionsClient("}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_f25b87f4","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":42},"in_reply_to":"1aa78d24_e01bc319","updated":"2016-07-05 11:22:22.000000000","message":"The reason I have this separated is that in future I will use ClientsFactory, which accepts default_params as parameters of the ClientsFactory and the other as client parameters.\n\nI did that because I wanted to provide a way for people to just give a default value once for those. What I could do then is to have service_client_config return all values, and use them to override the default","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    def _set_image_clients(self):"},{"line_number":156,"context_line":"        if CONF.service_available.glance:"},{"line_number":157,"context_line":"            params_v1 \u003d self.parameters[\u0027image.v1\u0027]"},{"line_number":158,"context_line":"            params_v1.update(self.default_params)"},{"line_number":159,"context_line":"            self.image_client \u003d image.v1.ImagesClient("},{"line_number":160,"context_line":"                self.auth_provider, **params_v1)"},{"line_number":161,"context_line":"            self.image_member_client \u003d image.v1.ImageMembersClient("}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_40e1f7fd","line":158,"range":{"start_line":158,"start_character":11,"end_line":158,"end_character":49},"updated":"2016-07-05 06:16:26.000000000","message":"ditto","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"0451787071cb6efa383cb15d8aa45fad5796304d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    def _set_image_clients(self):"},{"line_number":156,"context_line":"        if CONF.service_available.glance:"},{"line_number":157,"context_line":"            params_v1 \u003d self.parameters[\u0027image.v1\u0027]"},{"line_number":158,"context_line":"            params_v1.update(self.default_params)"},{"line_number":159,"context_line":"            self.image_client \u003d image.v1.ImagesClient("},{"line_number":160,"context_line":"                self.auth_provider, **params_v1)"},{"line_number":161,"context_line":"            self.image_member_client \u003d image.v1.ImageMembersClient("}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_166a7eb3","line":158,"range":{"start_line":158,"start_character":11,"end_line":158,"end_character":49},"in_reply_to":"1aa78d24_40e1f7fd","updated":"2016-07-05 13:49:43.000000000","message":"Done","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0b4ba96597d0f24079c011f45a37db5cdefc3491","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            try:"},{"line_number":117,"context_line":"                configuration[service] \u003d config.service_client_config(service)"},{"line_number":118,"context_line":"            except lib_exc.UnknownServiceClient:"},{"line_number":119,"context_line":"                LOG.warn(\u0027Could not load configuration \u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        return configuration"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1aa78d24_4e961df1","line":119,"updated":"2016-07-05 19:02:03.000000000","message":"I think you wanted to have some more in this error message :)","commit_id":"0a577a1baf8af9ebb5e779277371cbc6145fd080"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6a71cdae1e243e2dd7dd0ffc62ee92c298103b63","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            try:"},{"line_number":117,"context_line":"                configuration[service] \u003d config.service_client_config(service)"},{"line_number":118,"context_line":"            except lib_exc.UnknownServiceClient:"},{"line_number":119,"context_line":"                LOG.warn(\u0027Could not load configuration \u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        return configuration"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1aa78d24_bbdc1ce5","line":119,"in_reply_to":"1aa78d24_4e961df1","updated":"2016-07-05 20:27:33.000000000","message":"Indeed, nice catch","commit_id":"0a577a1baf8af9ebb5e779277371cbc6145fd080"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0b4ba96597d0f24079c011f45a37db5cdefc3491","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self.image_member_client \u003d image.v1.ImageMembersClient("},{"line_number":160,"context_line":"                self.auth_provider, **params_v1)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            params_v2 \u003d self.parameters[\u0027image.v2\u0027]"},{"line_number":163,"context_line":"            self.image_client_v2 \u003d image.v2.ImagesClient("},{"line_number":164,"context_line":"                self.auth_provider, **params_v2)"},{"line_number":165,"context_line":"            self.image_member_client_v2 \u003d image.v2.ImageMembersClient("}],"source_content_type":"text/x-python","patch_set":32,"id":"1aa78d24_2e991120","line":162,"updated":"2016-07-05 19:02:03.000000000","message":"Is there any difference here? v1\u0027s connection params should be the same as v1, glance doesn\u0027t have separate endpoints in the catalog for v1 vs v2. (v3 has a separate one I think, but that\u0027s not really glance)","commit_id":"0a577a1baf8af9ebb5e779277371cbc6145fd080"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"6a71cdae1e243e2dd7dd0ffc62ee92c298103b63","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self.image_member_client \u003d image.v1.ImageMembersClient("},{"line_number":160,"context_line":"                self.auth_provider, **params_v1)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            params_v2 \u003d self.parameters[\u0027image.v2\u0027]"},{"line_number":163,"context_line":"            self.image_client_v2 \u003d image.v2.ImagesClient("},{"line_number":164,"context_line":"                self.auth_provider, **params_v2)"},{"line_number":165,"context_line":"            self.image_member_client_v2 \u003d image.v2.ImageMembersClient("}],"source_content_type":"text/x-python","patch_set":32,"id":"1aa78d24_5bec188f","line":162,"in_reply_to":"1aa78d24_2e991120","updated":"2016-07-05 20:27:33.000000000","message":"No, I will change this to use unversioned service name except for identity.","commit_id":"0a577a1baf8af9ebb5e779277371cbc6145fd080"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0b4ba96597d0f24079c011f45a37db5cdefc3491","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        # Mandatory parameters (always defined)"},{"line_number":328,"context_line":"        params_v1 \u003d self.parameters[\u0027volume.v1\u0027]"},{"line_number":329,"context_line":"        params_v2 \u003d self.parameters[\u0027volume.v2\u0027]"},{"line_number":330,"context_line":"        params_v3 \u003d self.parameters[\u0027volume.v3\u0027]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.volume_qos_client \u003d volume.v1.QosSpecsClient(self.auth_provider,"},{"line_number":333,"context_line":"                                                          **params_v1)"}],"source_content_type":"text/x-python","patch_set":32,"id":"1aa78d24_8ea00545","line":330,"updated":"2016-07-05 19:02:03.000000000","message":"Same thing here, cinder doesn\u0027t have 3 catalog entries, just 1 and the 3 api versions are paths off the endpoint","commit_id":"0a577a1baf8af9ebb5e779277371cbc6145fd080"}],"tempest/config.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                           \u0027build_timeout\u0027, \u0027build_interval\u0027])"},{"line_number":1399,"context_line":"    _parameters \u003d {}"},{"line_number":1400,"context_line":"    if service_client_name not in valid_services:"},{"line_number":1401,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"},{"line_number":1402,"context_line":"    # Get the group of options first"},{"line_number":1403,"context_line":"    config_group \u003d service_client_name.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":1404,"context_line":"    options \u003d getattr(CONF, config_group)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_a5df890b","line":1401,"updated":"2016-06-30 16:39:27.000000000","message":"So this prevents this from being useful for plugin added config. Are we planning to add a mechanism for them to have a helper like this? It would be simple to do a hasattr on CONF here to check whether the name provided is valid or not. We can\u0027t assume plugins will use the same exact pattern here but if they do subscribe to the same pattern enabling them to use the same helper function would be useful I think","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                           \u0027build_timeout\u0027, \u0027build_interval\u0027])"},{"line_number":1399,"context_line":"    _parameters \u003d {}"},{"line_number":1400,"context_line":"    if service_client_name not in valid_services:"},{"line_number":1401,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"},{"line_number":1402,"context_line":"    # Get the group of options first"},{"line_number":1403,"context_line":"    config_group \u003d service_client_name.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":1404,"context_line":"    options \u003d getattr(CONF, config_group)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_2028a799","line":1401,"in_reply_to":"3aaa91ec_a5df890b","updated":"2016-06-30 17:12:16.000000000","message":"Yes I thought this would be only for Tempest own service_clients.\nI can think of a way to extend this. I have a list of registered plugins in service_clients, but I cannot have config depend on service_clients else it becomes a circular dependency. I would probably need to extend the registration of config options to extend config.SERVICES variable in config.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"        # Identity client endpoint_type is set by configuration settings with"},{"line_number":1410,"context_line":"        # a different name"},{"line_number":1411,"context_line":"        if setting \u003d\u003d \u0027endpoint_type\u0027 and service_client_name \u003d\u003d \u0027identity\u0027:"},{"line_number":1412,"context_line":"            _parameters[setting] \u003d CONF.identity.v3_endpoint_type"},{"line_number":1413,"context_line":"            continue"},{"line_number":1414,"context_line":"        # Object storage and identity groups do not have conf settings for"},{"line_number":1415,"context_line":"        # build_* parameters, and we default to compute in any case"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_85e24dd3","line":1412,"updated":"2016-06-30 16:39:27.000000000","message":"What about the v2_admin_endpoint type? That\u0027s another special case for keystone (since in v2 admin is a separate endpoint) and if a client needs access to that how is it handled?","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"        # Identity client endpoint_type is set by configuration settings with"},{"line_number":1410,"context_line":"        # a different name"},{"line_number":1411,"context_line":"        if setting \u003d\u003d \u0027endpoint_type\u0027 and service_client_name \u003d\u003d \u0027identity\u0027:"},{"line_number":1412,"context_line":"            _parameters[setting] \u003d CONF.identity.v3_endpoint_type"},{"line_number":1413,"context_line":"            continue"},{"line_number":1414,"context_line":"        # Object storage and identity groups do not have conf settings for"},{"line_number":1415,"context_line":"        # build_* parameters, and we default to compute in any case"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_8607f416","line":1412,"in_reply_to":"3aaa91ec_85e24dd3","updated":"2016-06-30 17:12:16.000000000","message":"ATM, if a client needs a v2 client that honours tempest config it has to manually override the endpoint_type with the proper one from config.\nSee my other comment.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":1348,"context_line":"    return decorator"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"def service_client_config(service_client_name\u003dNone):"},{"line_number":1352,"context_line":"    \"\"\"Return a dict with the parameters to init service clients"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    Extracts from CONF the settings specific to the service_client_name and"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_20b78bd9","line":1351,"range":{"start_line":1351,"start_character":26,"end_line":1351,"end_character":45},"updated":"2016-07-05 06:16:26.000000000","message":"just an idea, it can be enhanced further as dict of services name, so that plugin/client.manager etc can request config for set of services together.\n\nBut take this for future enhancement, do not want to put everything in same patch.","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"0451787071cb6efa383cb15d8aa45fad5796304d","unresolved":false,"context_lines":[{"line_number":1348,"context_line":"    return decorator"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":""},{"line_number":1351,"context_line":"def service_client_config(service_client_name\u003dNone):"},{"line_number":1352,"context_line":"    \"\"\"Return a dict with the parameters to init service clients"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    Extracts from CONF the settings specific to the service_client_name and"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_96eaee0d","line":1351,"range":{"start_line":1351,"start_character":26,"end_line":1351,"end_character":45},"in_reply_to":"1aa78d24_20b78bd9","updated":"2016-07-05 13:49:43.000000000","message":"Done","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"        * The `TokenClient` and `V3TokenClient` have a very different"},{"line_number":1380,"context_line":"          interface, only auth_url is needed"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"    :param service_client_name: str Name of the service. Supported values are"},{"line_number":1383,"context_line":"        \u0027compute\u0027, \u0027identity\u0027, \u0027image\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume\u0027"},{"line_number":1384,"context_line":"    :return: dictionary of __init__ parameters for the service clients"},{"line_number":1385,"context_line":"    :rtype: dict"},{"line_number":1386,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_c0720749","line":1383,"range":{"start_line":1382,"start_character":57,"end_line":1383,"end_character":77},"updated":"2016-07-05 06:16:26.000000000","message":"now it is \u0027image.v2\u0027, \u0027identity.v3\u0027, \u0027identity.v2\u0027 etc also.","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"        * The `TokenClient` and `V3TokenClient` have a very different"},{"line_number":1380,"context_line":"          interface, only auth_url is needed"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"    :param service_client_name: str Name of the service. Supported values are"},{"line_number":1383,"context_line":"        \u0027compute\u0027, \u0027identity\u0027, \u0027image\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume\u0027"},{"line_number":1384,"context_line":"    :return: dictionary of __init__ parameters for the service clients"},{"line_number":1385,"context_line":"    :rtype: dict"},{"line_number":1386,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_72683788","line":1383,"range":{"start_line":1382,"start_character":57,"end_line":1383,"end_character":77},"in_reply_to":"1aa78d24_c0720749","updated":"2016-07-05 11:22:22.000000000","message":"Heh, good catch, thanks","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":1385,"context_line":"    :rtype: dict"},{"line_number":1386,"context_line":"    \"\"\""},{"line_number":1387,"context_line":"    if service_client_name is None:"},{"line_number":1388,"context_line":"        return {"},{"line_number":1389,"context_line":"            \u0027disable_ssl_certificate_validation\u0027:"},{"line_number":1390,"context_line":"                CONF.identity.disable_ssl_certificate_validation,"},{"line_number":1391,"context_line":"            \u0027ca_certs\u0027: CONF.identity.ca_certificates_file,"},{"line_number":1392,"context_line":"            \u0027trace_requests\u0027: CONF.debug.trace_requests"},{"line_number":1393,"context_line":"        }"},{"line_number":1394,"context_line":"    _parameters \u003d {}"},{"line_number":1395,"context_line":"    # Get the group of options first, by normalising the service_group_name"},{"line_number":1396,"context_line":"    # Services with a version will have a \".\" in the name"},{"line_number":1397,"context_line":"    config_group \u003d service_client_name.split(\u0027.\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_0009afdd","line":1394,"range":{"start_line":1388,"start_character":0,"end_line":1394,"end_character":20},"updated":"2016-07-05 06:16:26.000000000","message":"How about adding those in _parameters by default and other parameter based on service_client_name. So that if service_client_name is passed then also those default param can be returned.\n\nWith that you do not need to update param with default one in each _set_*_clients","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"0451787071cb6efa383cb15d8aa45fad5796304d","unresolved":false,"context_lines":[{"line_number":1385,"context_line":"    :rtype: dict"},{"line_number":1386,"context_line":"    \"\"\""},{"line_number":1387,"context_line":"    if service_client_name is None:"},{"line_number":1388,"context_line":"        return {"},{"line_number":1389,"context_line":"            \u0027disable_ssl_certificate_validation\u0027:"},{"line_number":1390,"context_line":"                CONF.identity.disable_ssl_certificate_validation,"},{"line_number":1391,"context_line":"            \u0027ca_certs\u0027: CONF.identity.ca_certificates_file,"},{"line_number":1392,"context_line":"            \u0027trace_requests\u0027: CONF.debug.trace_requests"},{"line_number":1393,"context_line":"        }"},{"line_number":1394,"context_line":"    _parameters \u003d {}"},{"line_number":1395,"context_line":"    # Get the group of options first, by normalising the service_group_name"},{"line_number":1396,"context_line":"    # Services with a version will have a \".\" in the name"},{"line_number":1397,"context_line":"    config_group \u003d service_client_name.split(\u0027.\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_1698bebf","line":1394,"range":{"start_line":1388,"start_character":0,"end_line":1394,"end_character":20},"in_reply_to":"1aa78d24_0009afdd","updated":"2016-07-05 13:49:43.000000000","message":"Done","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"    if not hasattr(options, \u0027region\u0027) or not getattr(options, \u0027region\u0027):"},{"line_number":1425,"context_line":"        _parameters[\u0027region\u0027] \u003d CONF.identity.region"},{"line_number":1426,"context_line":"    else:"},{"line_number":1427,"context_line":"        _parameters[\u0027service\u0027] \u003d getattr(options, \u0027region\u0027)"},{"line_number":1428,"context_line":"    # Set service"},{"line_number":1429,"context_line":"    _parameters[\u0027service\u0027] \u003d getattr(options, \u0027catalog_type\u0027)"},{"line_number":1430,"context_line":"    return _parameters"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_40457715","line":1427,"range":{"start_line":1427,"start_character":21,"end_line":1427,"end_character":28},"updated":"2016-07-05 06:16:26.000000000","message":"-\u003eregion","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":1424,"context_line":"    if not hasattr(options, \u0027region\u0027) or not getattr(options, \u0027region\u0027):"},{"line_number":1425,"context_line":"        _parameters[\u0027region\u0027] \u003d CONF.identity.region"},{"line_number":1426,"context_line":"    else:"},{"line_number":1427,"context_line":"        _parameters[\u0027service\u0027] \u003d getattr(options, \u0027region\u0027)"},{"line_number":1428,"context_line":"    # Set service"},{"line_number":1429,"context_line":"    _parameters[\u0027service\u0027] \u003d getattr(options, \u0027catalog_type\u0027)"},{"line_number":1430,"context_line":"    return _parameters"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_72ff97aa","line":1427,"range":{"start_line":1427,"start_character":21,"end_line":1427,"end_character":28},"in_reply_to":"1aa78d24_40457715","updated":"2016-07-05 11:22:22.000000000","message":"upz, right, thank you","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e1972ce548608bfe69ba6a2616d31624b7366b33","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"    # NOTE(andreaf) Check if the config group exists. This allows for this"},{"line_number":1401,"context_line":"    # helper to be used for settings from registered plugins as well"},{"line_number":1402,"context_line":"    try:"},{"line_number":1403,"context_line":"        options \u003d getattr(CONF, config_group)"},{"line_number":1404,"context_line":"    except cfg.NoSuchOptError:"},{"line_number":1405,"context_line":"        # Option group not defined"},{"line_number":1406,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_dd91e0f2","line":1403,"updated":"2016-07-06 19:34:27.000000000","message":"There is a hasattr function: https://docs.python.org/2/library/functions.html#hasattr","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"414b2181fd1cfb1cec40f2e3d4254cdc2930df37","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"    # NOTE(andreaf) Check if the config group exists. This allows for this"},{"line_number":1401,"context_line":"    # helper to be used for settings from registered plugins as well"},{"line_number":1402,"context_line":"    try:"},{"line_number":1403,"context_line":"        options \u003d getattr(CONF, config_group)"},{"line_number":1404,"context_line":"    except cfg.NoSuchOptError:"},{"line_number":1405,"context_line":"        # Option group not defined"},{"line_number":1406,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_6e6c7435","line":1403,"in_reply_to":"1aa78d24_dd91e0f2","updated":"2016-07-06 20:33:55.000000000","message":"I know, but that is implemented by calling the getattr, which it will not raise the expected exception...","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e1972ce548608bfe69ba6a2616d31624b7366b33","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"    # helper to be used for settings from registered plugins as well"},{"line_number":1402,"context_line":"    try:"},{"line_number":1403,"context_line":"        options \u003d getattr(CONF, config_group)"},{"line_number":1404,"context_line":"    except cfg.NoSuchOptError:"},{"line_number":1405,"context_line":"        # Option group not defined"},{"line_number":1406,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"},{"line_number":1407,"context_line":"    # Set endpoint_type"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_bd8e94cd","line":1404,"updated":"2016-07-06 19:34:27.000000000","message":"I don\u0027t think this is right actually. We wrap the cfg object and set the group attrs manually. Do we still raise NoSuchOptError?","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"414b2181fd1cfb1cec40f2e3d4254cdc2930df37","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"    # helper to be used for settings from registered plugins as well"},{"line_number":1402,"context_line":"    try:"},{"line_number":1403,"context_line":"        options \u003d getattr(CONF, config_group)"},{"line_number":1404,"context_line":"    except cfg.NoSuchOptError:"},{"line_number":1405,"context_line":"        # Option group not defined"},{"line_number":1406,"context_line":"        raise exceptions.UnknownServiceClient(services\u003dservice_client_name)"},{"line_number":1407,"context_line":"    # Set endpoint_type"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_8ed0c020","line":1404,"in_reply_to":"1aa78d24_bd8e94cd","updated":"2016-07-06 20:33:55.000000000","message":"I have a unit test for that in https://review.openstack.org/#/c/326667/33/tempest/tests/test_config.py L85. If you see http://git.openstack.org/cgit/openstack/tempest/tree/tempest/config.py#n1270, the __getattr__ means that a missing group will be looked for into _CONF, which is cfg.CONF, which raises NoSuchOptError.\n\nThe __getattr__ there is implemented to handle options in the DEFAULT group I think.","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"}],"tempest/lib_manager.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"4f3494f8be9870f3c7102f6149ee5d1993625858","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __init__(self, credentials, identity_uri, region\u003dNone,"},{"line_number":52,"context_line":"                 scope\u003d\u0027project\u0027, disable_ssl_certificate_validation\u003dTrue,"},{"line_number":53,"context_line":"                 ca_certs\u003dNone, trace_requests\u003d\u0027\u0027, **kwargs):"},{"line_number":54,"context_line":"        \"\"\"Service Clients Manager"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        Instantiate a `Manager` object, from a set of credentials and an"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_d12ba280","line":53,"range":{"start_line":53,"start_character":50,"end_line":53,"end_character":59},"updated":"2016-06-13 16:11:41.000000000","message":"The structure of this dict is very much open a the moment, and non-discoverable. There are several ways I can overcome this before this is ready for tempest.lib.\nOne is a combination of documentation and declaration of available attributes. Another one is encapsulate this settings in some object. \nAnother one is to introduce lazy loading of clients, and stop settings all parameters in the __init__ and set them instead via helper methods with a clear interface.","commit_id":"84c1723230fd8316f255fcdea5a65bf5361eff3d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"aa891963435c0ae9b24aa1964b3e51858681407d","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        _parameters \u003d {}"},{"line_number":137,"context_line":"        for service in self.SERVICES:"},{"line_number":138,"context_line":"            # Setup a few defaults"},{"line_number":139,"context_line":"            _parameters[service] \u003d dict(catalog_type\u003dservice)"},{"line_number":140,"context_line":"            if self.region:"},{"line_number":141,"context_line":"                _parameters[service][\u0027region\u0027] \u003d self.region"},{"line_number":142,"context_line":"            # Set a few reasonable defaults for identity clients"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a9d85d2_0049eb8b","line":139,"range":{"start_line":139,"start_character":40,"end_line":139,"end_character":60},"updated":"2016-06-20 05:09:41.000000000","message":"this too, same as below comment","commit_id":"33bbc899965cdcba1f0d5ebf616284f91985876a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"aa891963435c0ae9b24aa1964b3e51858681407d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                _parameters[service][\u0027region\u0027] \u003d self.region"},{"line_number":142,"context_line":"            # Set a few reasonable defaults for identity clients"},{"line_number":143,"context_line":"            if service \u003d\u003d \u0027identity\u0027:"},{"line_number":144,"context_line":"                _parameters[service][\u0027uri\u0027] \u003d auth.replace_version("},{"line_number":145,"context_line":"                    identity_uri, \u0027v2\u0027)"},{"line_number":146,"context_line":"                _parameters[service][\u0027uri_v3\u0027] \u003d auth.replace_version("},{"line_number":147,"context_line":"                    identity_uri, \u0027v3\u0027)"},{"line_number":148,"context_line":"                _parameters[service][\u0027v2_admin_endpoint_type\u0027] \u003d \u0027adminURL\u0027"},{"line_number":149,"context_line":"                _parameters[service][\u0027v2_public_endpoint_type\u0027] \u003d \u0027publicURL\u0027"},{"line_number":150,"context_line":"            # Update defaults with specified parameters"},{"line_number":151,"context_line":"            _parameters[service].update(parameters.pop(service, {}))"},{"line_number":152,"context_line":"        # If any parameter is left, parameters for an unknown service were"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a9d85d2_808ddb7d","line":149,"range":{"start_line":144,"start_character":0,"end_line":149,"end_character":77},"updated":"2016-06-20 05:09:41.000000000","message":"I think those param should be expected from parameters and we should use those explicitly instead of defaulting few common one.\n\nIn case where it was not passed in earlier and default one worked fine but later someone just change config and do not correct code to pass those.\n\nThat will make this Manager interface difficult to use wrongly.","commit_id":"33bbc899965cdcba1f0d5ebf616284f91985876a"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"f63dc0ce0284fbb22a384695b41faf4b13324e01","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                _parameters[service][\u0027region\u0027] \u003d self.region"},{"line_number":142,"context_line":"            # Set a few reasonable defaults for identity clients"},{"line_number":143,"context_line":"            if service \u003d\u003d \u0027identity\u0027:"},{"line_number":144,"context_line":"                _parameters[service][\u0027uri\u0027] \u003d auth.replace_version("},{"line_number":145,"context_line":"                    identity_uri, \u0027v2\u0027)"},{"line_number":146,"context_line":"                _parameters[service][\u0027uri_v3\u0027] \u003d auth.replace_version("},{"line_number":147,"context_line":"                    identity_uri, \u0027v3\u0027)"},{"line_number":148,"context_line":"                _parameters[service][\u0027v2_admin_endpoint_type\u0027] \u003d \u0027adminURL\u0027"},{"line_number":149,"context_line":"                _parameters[service][\u0027v2_public_endpoint_type\u0027] \u003d \u0027publicURL\u0027"},{"line_number":150,"context_line":"            # Update defaults with specified parameters"},{"line_number":151,"context_line":"            _parameters[service].update(parameters.pop(service, {}))"},{"line_number":152,"context_line":"        # If any parameter is left, parameters for an unknown service were"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a9d85d2_8f5223dc","line":149,"range":{"start_line":144,"start_character":0,"end_line":149,"end_character":77},"in_reply_to":"5a9d85d2_808ddb7d","updated":"2016-06-20 08:47:45.000000000","message":"The reason for providing meaningful defaults is that I want the client manager to work with an empty kwargs input.\n\nEverything which is a mandatory parameter should go in the __init__ interface instead. But these are not mandatory parameters... they are only if I plan to use the identity client, which is not necessarily the case.\nMost tests will get credentials from the credential provider, and will call the API they need to test, but not really the identity api. \n\nOnce I implement lazy loading for clients, this can go away if you wish, since clients that are not used won\u0027t be initialised either. But for now I don\u0027t want a test wanting to use the designate and nova clients only, to have specify\nidentity v2 parameters.","commit_id":"33bbc899965cdcba1f0d5ebf616284f91985876a"}],"tempest/service_clients.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"e213008014533580cf4a576c6869d169b5df6e13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"5a9d85d2_71cdeb5c","updated":"2016-06-21 07:17:00.000000000","message":"If you want to vote on the name of this module please do it here: https://www.surveymonkey.co.uk/r/BZM7VMT","commit_id":"f081792f6b1cfa956f60500641c09779967da315"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"da6ede900b7304fdf4a86477a6422ecc769b8e3a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u003e\u003e\u003e from tempest import service_clients"},{"line_number":32,"context_line":"        \u003e\u003e\u003e johndoe \u003d cred_provider.get_creds_by_role([\u0027johndoe\u0027])"},{"line_number":33,"context_line":"        \u003e\u003e\u003e johndoe_clients \u003d service_clients.ServiceClients(johndoe,"},{"line_number":34,"context_line":"                                                             identity_uri)"},{"line_number":35,"context_line":"        \u003e\u003e\u003e johndoe_servers \u003d johndoe_clients.servers_client.list_servers()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_9e5185db","line":34,"updated":"2016-06-22 16:00:42.000000000","message":"where does identity_url come from?","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"acf960aa09c7d8f7627fdbe78fab886a4043d9cf","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u003e\u003e\u003e from tempest import service_clients"},{"line_number":32,"context_line":"        \u003e\u003e\u003e johndoe \u003d cred_provider.get_creds_by_role([\u0027johndoe\u0027])"},{"line_number":33,"context_line":"        \u003e\u003e\u003e johndoe_clients \u003d service_clients.ServiceClients(johndoe,"},{"line_number":34,"context_line":"                                                             identity_uri)"},{"line_number":35,"context_line":"        \u003e\u003e\u003e johndoe_servers \u003d johndoe_clients.servers_client.list_servers()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"3aaa91ec_cad4ddbe","line":34,"in_reply_to":"3aaa91ec_9e5185db","updated":"2016-06-22 21:01:14.000000000","message":"From your conf? It\u0027s the same that was used to initialise cred_provider above.","commit_id":"38b97d1d11177772e1bb3d5cc35289eb79ccff8f"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # class should only be used by tests hosted in Tempest."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    SERVICES \u003d set([\u0027compute\u0027, \u0027identity\u0027, \u0027image\u0027, \u0027network\u0027,"},{"line_number":45,"context_line":"                    \u0027object-storage\u0027, \u0027volume\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, credentials, identity_uri, region\u003dNone, scope\u003d\u0027project\u0027,"},{"line_number":48,"context_line":"                 disable_ssl_certificate_validation\u003dTrue, ca_certs\u003dNone,"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_e5aeb17f","line":45,"updated":"2016-06-30 16:39:27.000000000","message":"So is this class only going to setup are in tree clients? I\u0027m sure the plugin support comes in a later patch it\u0027s just not clear to me now how this is a good idea.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # class should only be used by tests hosted in Tempest."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    SERVICES \u003d set([\u0027compute\u0027, \u0027identity\u0027, \u0027image\u0027, \u0027network\u0027,"},{"line_number":45,"context_line":"                    \u0027object-storage\u0027, \u0027volume\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, credentials, identity_uri, region\u003dNone, scope\u003d\u0027project\u0027,"},{"line_number":48,"context_line":"                 disable_ssl_certificate_validation\u003dTrue, ca_certs\u003dNone,"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_667da86c","line":45,"in_reply_to":"3aaa91ec_e5aeb17f","updated":"2016-06-30 17:12:16.000000000","message":"You will see that registration adds to this list when clients are registered.\nThat\u0027s mostly to provide a way for test code to see what services are registered in here if they need to.\n\nI include the six core clients from start here because I can use that to setup initial parameters, and I know that all six clients are going to be registered anyways all the time.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        :param ca_certs Applies to auth and to all service clients."},{"line_number":97,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":98,"context_line":"        :param kwargs keyword parameters can be used to specify custom"},{"line_number":99,"context_line":"                      parameters for service clients"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        self.credentials \u003d credentials"},{"line_number":102,"context_line":"        self.identity_uri \u003d identity_uri"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_c5b1f5e1","line":99,"updated":"2016-06-30 16:39:27.000000000","message":"This should have more description about it. There is a specifc format expected for this. I wonder if it makes sense to make this a standalone kwargs that expects a dict in the specified format rather than jsut doing kwargs. Something like settings\u003dNone and then just pass settings to _setup_parameters()","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"a9a386dc4b0f7706a01bbf77adb1ef763f272676","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        :param ca_certs Applies to auth and to all service clients."},{"line_number":97,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":98,"context_line":"        :param kwargs keyword parameters can be used to specify custom"},{"line_number":99,"context_line":"                      parameters for service clients"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        self.credentials \u003d credentials"},{"line_number":102,"context_line":"        self.identity_uri \u003d identity_uri"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_4f9a1170","line":99,"in_reply_to":"3aaa91ec_c5b1f5e1","updated":"2016-07-01 13:27:23.000000000","message":"I don\u0027t mind much either way - I though for a test that only uses one or two services is easier to pass settings for each of them rather than passing a dict, but it\u0027s not a big difference really...","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"96ab31cf3ca1da0a58af033e5d9941dab6266ba1","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            if self.region:"},{"line_number":141,"context_line":"                _parameters[service][\u0027region\u0027] \u003d self.region"},{"line_number":142,"context_line":"            # Since the auth URI is already provided for the auth provider,"},{"line_number":143,"context_line":"            # re-use it for the identity client."},{"line_number":144,"context_line":"            if service \u003d\u003d \u0027identity\u0027:"},{"line_number":145,"context_line":"                _parameters[service][\u0027uri\u0027] \u003d auth.replace_version("},{"line_number":146,"context_line":"                    identity_uri, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_25cd5966","line":143,"updated":"2016-06-30 16:39:27.000000000","message":"I guess we\u0027re not passing this in in the parameters dict?","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"456b4de0c1a4f61ad3054ca0ef519eb9a9a3954e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            if self.region:"},{"line_number":141,"context_line":"                _parameters[service][\u0027region\u0027] \u003d self.region"},{"line_number":142,"context_line":"            # Since the auth URI is already provided for the auth provider,"},{"line_number":143,"context_line":"            # re-use it for the identity client."},{"line_number":144,"context_line":"            if service \u003d\u003d \u0027identity\u0027:"},{"line_number":145,"context_line":"                _parameters[service][\u0027uri\u0027] \u003d auth.replace_version("},{"line_number":146,"context_line":"                    identity_uri, \u0027v2\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_06bdc401","line":143,"in_reply_to":"3aaa91ec_25cd5966","updated":"2016-06-30 17:12:16.000000000","message":"Indeed. This is only needed by TokenClients anyways, and I will need to have some special logic from them in the ClientsFactory because they are the only clients that do not accept an auth_provider.","commit_id":"4a9b130233804f94d10ee7da500d76dc6991a766"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    This is needed by clients for automatic configuration of service clients."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_bb7d6ab3","line":28,"range":{"start_line":26,"start_character":17,"end_line":28,"end_character":39},"updated":"2016-07-05 06:16:26.000000000","message":"I like the ideas of having each service separate with version \n\nThis actually allow users to configuring each version clients of same service with different service catalog if anyone have on their cloud.\n\nBut auth.py is not fully expanded for that - https://github.com/openstack/tempest/blob/master/tempest/lib/auth.py#L53\nAs replace_version() logic can alter the fancy catalog (but yea we said no to fancy catalog).\n\nMy main concern here is user does not get impression that tempest started accepting the configuration per version and so fancy url.\nI am not sure where we should document it clearly, in client_parameters\u0027s doc string etc","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"864072f8aa944d3f6a8239ecdcc64224067efffa","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    This is needed by clients for automatic configuration of service clients."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_fdb96a16","line":28,"range":{"start_line":26,"start_character":17,"end_line":28,"end_character":39},"in_reply_to":"1aa78d24_6d305ae9","updated":"2016-07-06 09:50:34.000000000","message":"Yea, that is nice and am totally agree with support of separate configuration per service version if anyone want.\n\nBut our service clients which define api_version and auth.py alter the endpoints with version does not actually allow the different configuration(specially endpoints) for different version of same service. \n\nFor example - existing Image_client and auth logic does not support different endpoint for version v1 and v2 (except version string)\n\nBut again saying I am always in favor of allowing support of separate configuration per version (even fancy endpoint) in tempest :) so this change makes tempest configuration in that direction so m ok with this.","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    This is needed by clients for automatic configuration of service clients."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_6d305ae9","line":28,"range":{"start_line":26,"start_character":17,"end_line":28,"end_character":39},"in_reply_to":"1aa78d24_bb7d6ab3","updated":"2016-07-05 11:22:22.000000000","message":"This enables in principle different configuration for different versions, indeed, only our configuration does not support that yet, with the exception of identity endpoints which are different between v2 and v3. \n\nAnd the service_client_config method will ignore the version part except for identity, and return the same configuration options. Nonetheless I feel it is best to handle different versions independently. If plugins need different configuration for different versions they can do that today by fixing the configuration returned by service_client_config. Or we can extend service_client_config to support versions directly, and define some naming convention about the naming of versioned config options.\n\nRegarding https://github.com/openstack/tempest/blob/master/tempest/lib/auth.py#L53, tests can set the api_version to trigger that filter in auth, but they are not bound to do so. So if a client is built with an alternate service for a specific api version and api_version is not set on the client, the endpoint returned will be the correct one.","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":108,"context_line":"        :param client_parameters Dictionary with parameters for service"},{"line_number":109,"context_line":"            clients. Keys of the dictionary are the service client module"},{"line_number":110,"context_line":"            name, as declared in `config.CONFIGURABLE_SERVICES`."},{"line_number":111,"context_line":"            Values are dictionaries of parameters that are going to be passed"},{"line_number":112,"context_line":"            to all clients in the service client module."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_f6026908","line":110,"range":{"start_line":110,"start_character":33,"end_line":110,"end_character":63},"updated":"2016-07-05 06:16:26.000000000","message":"config.CONFIGURABLE_SERVICES ?","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":108,"context_line":"        :param client_parameters Dictionary with parameters for service"},{"line_number":109,"context_line":"            clients. Keys of the dictionary are the service client module"},{"line_number":110,"context_line":"            name, as declared in `config.CONFIGURABLE_SERVICES`."},{"line_number":111,"context_line":"            Values are dictionaries of parameters that are going to be passed"},{"line_number":112,"context_line":"            to all clients in the service client module."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_8d4ca671","line":110,"range":{"start_line":110,"start_character":33,"end_line":110,"end_character":63},"in_reply_to":"1aa78d24_f6026908","updated":"2016-07-05 11:22:22.000000000","message":"err, this should be service_clients.available_services()","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a891dc47f6445dfffd52c12fbcbbfcb65288f17b","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            _parameters[\u0027region\u0027] \u003d self.region"},{"line_number":171,"context_line":"        # Update defaults with specified parameters"},{"line_number":172,"context_line":"        _parameters.update(parameters)"},{"line_number":173,"context_line":"        # If any parameter is left, parameters for an unknown service were"},{"line_number":174,"context_line":"        # provided as input. Fail rather than ignore silently."},{"line_number":175,"context_line":"        return _parameters"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_0099af1f","line":174,"range":{"start_line":173,"start_character":8,"end_line":174,"end_character":62},"updated":"2016-07-05 06:16:26.000000000","message":"i think you forgot to remove this comment.","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"60af2af17d238fe50a7b3fab03e9c8d429d36244","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            _parameters[\u0027region\u0027] \u003d self.region"},{"line_number":171,"context_line":"        # Update defaults with specified parameters"},{"line_number":172,"context_line":"        _parameters.update(parameters)"},{"line_number":173,"context_line":"        # If any parameter is left, parameters for an unknown service were"},{"line_number":174,"context_line":"        # provided as input. Fail rather than ignore silently."},{"line_number":175,"context_line":"        return _parameters"}],"source_content_type":"text/x-python","patch_set":31,"id":"1aa78d24_0d6f16c6","line":174,"range":{"start_line":173,"start_character":8,"end_line":174,"end_character":62},"in_reply_to":"1aa78d24_0099af1f","updated":"2016-07-05 11:22:22.000000000","message":"Done","commit_id":"5100ea7d95a71971e524ddd6123f503a8a1cc940"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"e1972ce548608bfe69ba6a2616d31624b7366b33","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_7d88acc5","line":28,"updated":"2016-07-06 19:34:27.000000000","message":"Yeah I\u0027m with gmann here, this seems a bit off. I think if we modify the doc string to explain this is a list of top level client namespaces for use or something like that. Configuration in the docstring makes this a bit confusing","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d91826767541cd84335dbe9a2b7b5446e0a23518","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    This is needed by clients for automatic configuration of service clients."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_c70db4e9","line":28,"range":{"start_line":26,"start_character":15,"end_line":28,"end_character":42},"updated":"2016-07-06 10:03:44.000000000","message":"as we do not setup clients with different version configuration, do we need those?","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"414b2181fd1cfb1cec40f2e3d4254cdc2930df37","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_eef4e45b","line":28,"in_reply_to":"1aa78d24_7d88acc5","updated":"2016-07-06 20:33:55.000000000","message":"What I could do it to expose an \u0027unversioned_services\u0027 as well...","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"2db899eaaadb67f3af3f23af4a97aa447272de40","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"},{"line_number":28,"context_line":"                \u0027volume.v2\u0027, \u0027volume.v3\u0027])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def available_services():"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_53ef9c1d","line":28,"in_reply_to":"1aa78d24_eef4e45b","updated":"2016-07-06 21:54:30.000000000","message":"Like I said before just update the docstring to provide more detail on what\u0027s being returned here. Saying \u0027services available\u0027 to me implies a 1:1 mapping with CONF.service_available.* which isn\u0027t what this is. This is literally a list of top level modules from tempest.{lib,}.services","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"e11a0a4d2eecb0fcc1bf72b2be6b68e291482540","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"            \u003e\u003e\u003e identity_params \u003d config.service_client_config(\u0027identity.v3\u0027)"},{"line_number":93,"context_line":"            \u003e\u003e\u003e params \u003d {"},{"line_number":94,"context_line":"            \u003e\u003e\u003e     \u0027identity.v3\u0027: identity_params,"},{"line_number":95,"context_line":"            \u003e\u003e\u003e     \u0027compute\u0027: {\u0027region\u0027: \u0027region2\u0027}}"},{"line_number":96,"context_line":"            \u003e\u003e\u003e manager \u003d lib_manager.Manager("},{"line_number":97,"context_line":"            \u003e\u003e\u003e     my_creds, identity_uri, client_parameters\u003dparams)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_623e6e8d","line":94,"range":{"start_line":94,"start_character":21,"end_line":94,"end_character":32},"updated":"2016-07-06 10:05:23.000000000","message":"The example here should be without the version. I will include an example with multiple version in an upcoming patch","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"e11a0a4d2eecb0fcc1bf72b2be6b68e291482540","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":108,"context_line":"        :param client_parameters Dictionary with parameters for service"},{"line_number":109,"context_line":"            clients. Keys of the dictionary are the service client module"},{"line_number":110,"context_line":"            name, as declared in `service_clients.available_services()`."},{"line_number":111,"context_line":"            Values are dictionaries of parameters that are going to be passed"},{"line_number":112,"context_line":"            to all clients in the service client module."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_82d27a5a","line":110,"range":{"start_line":110,"start_character":33,"end_line":110,"end_character":71},"updated":"2016-07-06 10:05:23.000000000","message":"I should say minus the version part - I plan to fix this in an upcoming patch","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d91826767541cd84335dbe9a2b7b5446e0a23518","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        :param ca_certs Applies to auth and to all service clients."},{"line_number":107,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":108,"context_line":"        :param client_parameters Dictionary with parameters for service"},{"line_number":109,"context_line":"            clients. Keys of the dictionary are the service client module"},{"line_number":110,"context_line":"            name, as declared in `service_clients.available_services()`."},{"line_number":111,"context_line":"            Values are dictionaries of parameters that are going to be passed"},{"line_number":112,"context_line":"            to all clients in the service client module."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"1aa78d24_8228ba87","line":110,"range":{"start_line":109,"start_character":21,"end_line":110,"end_character":70},"updated":"2016-07-06 10:03:44.000000000","message":"I think we should mention here about the unversioned service expected as per L154","commit_id":"abff8f289dba43160a43b344cc7d7c13fe9699c6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4b03842ebad11973dbc8ffbf7f6aece1ff9d163a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def tempest_modules():"},{"line_number":22,"context_line":"    \"\"\"List of service client modules available in Tempest."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    Provides a list of service modules available Tempest."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    return set([\u0027compute\u0027, \u0027identity.v2\u0027, \u0027identity.v3\u0027, \u0027image.v1\u0027,"},{"line_number":27,"context_line":"                \u0027image.v2\u0027, \u0027network\u0027, \u0027object-storage\u0027, \u0027volume.v1\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1aa78d24_9cd3d1d4","line":24,"range":{"start_line":24,"start_character":48,"end_line":24,"end_character":56},"updated":"2016-07-07 00:08:33.000000000","message":"in Tempest","commit_id":"de5fb0cf583273eccd1765c80c38ed26756c013a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4b03842ebad11973dbc8ffbf7f6aece1ff9d163a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                                                  service clients."},{"line_number":106,"context_line":"        :param ca_certs Applies to auth and to all service clients."},{"line_number":107,"context_line":"        :param trace_requests Applies to auth and to all service clients."},{"line_number":108,"context_line":"        :param client_parameters Dictionary with parameters for service"},{"line_number":109,"context_line":"            clients. Keys of the dictionary are the service client service"},{"line_number":110,"context_line":"            name, as declared in `service_clients.available_modules()` except"},{"line_number":111,"context_line":"            for the version. Values are dictionaries of parameters that are"},{"line_number":112,"context_line":"            going to be passed to all clients in the service client module."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        Examples:"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            \u003e\u003e\u003e params_service_x \u003d {\u0027param_name\u0027: \u0027param_value\u0027}"},{"line_number":117,"context_line":"            \u003e\u003e\u003e client_parameters \u003d { \u0027service_x\u0027: params_service_x }"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            \u003e\u003e\u003e params_service_y \u003d config.service_client_config(\u0027service_y\u0027)"},{"line_number":120,"context_line":"            \u003e\u003e\u003e client_parameters[\u0027service_y\u0027] \u003d params_service_y"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        self.credentials \u003d credentials"}],"source_content_type":"text/x-python","patch_set":34,"id":"1aa78d24_5c37a9fe","line":120,"range":{"start_line":108,"start_character":0,"end_line":120,"end_character":65},"updated":"2016-07-07 00:08:33.000000000","message":"Thanks, How about giving more example in this to make it more clear. something- \n\n        :param client_parameters Dictionary with parameters for service\n            clients.\n            Keys of the dictionary are the service client service\n            name, as declared in `service_clients.available_modules()` except\n            for the version. like image, volume, compute etc.\n            Values are dictionaries of parameters that are\n            going to be passed to all clients in the service client module.\n\n            Examples:\n\n\n                \u003e\u003e\u003e params_service_x \u003d {\u0027param_name\u0027: \u0027param_value\u0027}\n                \u003e\u003e\u003e client_parameters \u003d { \u0027service_x\u0027: params_service_x }\n\n                \u003e\u003e\u003e params_service_y \u003d config.service_client_config(\u0027service_y\u0027)\n                \u003e\u003e\u003e client_parameters[\u0027service_y\u0027] \u003d params_service_y\n\n\n                For Tempest owned service clients\n                \u003e\u003e\u003e params_compute \u003d config.service_client_config(\u0027compute\u0027)\n                \u003e\u003e\u003e params_volume \u003d config.service_client_config(\u0027volume\u0027)\n                \u003e\u003e\u003e params_image \u003d config.service_client_config(\u0027image\u0027)\n                \u003e\u003e\u003e client_parameters \u003d {\n                        \u0027compute\u0027: params_compute,\n                        \u0027volume\u0027: params_volume,\n                        \u0027image\u0027:params_image\n                    }","commit_id":"de5fb0cf583273eccd1765c80c38ed26756c013a"}]}
