)]}'
{"openstack/session.py":[{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"432637a635de1045be454470bede8091a69bc343","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        return rv"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_endpoint(self, auth\u003dNone, interface\u003dNone, service_type\u003dNone,"},{"line_number":125,"context_line":"                     **kwargs):"},{"line_number":126,"context_line":"        \"\"\"Override get endpoint to automate endpoint filtering"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_23f1b601","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":20},"updated":"2016-08-08 05:21:31.000000000","message":"this is becoming a little complicated, maybe we can extract some logics out as util functions.","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"25d564cf3dbe1a259e1ce53a5db6518ae89f5416","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        return rv"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_endpoint(self, auth\u003dNone, interface\u003dNone, service_type\u003dNone,"},{"line_number":125,"context_line":"                     **kwargs):"},{"line_number":126,"context_line":"        \"\"\"Override get endpoint to automate endpoint filtering"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_43c6074a","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":20},"in_reply_to":"9ad45d7e_06d10fce","updated":"2016-08-09 16:57:40.000000000","message":"Done","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"abbb74e226ce6edcd89140f99b379e5e7775223c","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        return rv"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_endpoint(self, auth\u003dNone, interface\u003dNone, service_type\u003dNone,"},{"line_number":125,"context_line":"                     **kwargs):"},{"line_number":126,"context_line":"        \"\"\"Override get endpoint to automate endpoint filtering"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_06d10fce","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":20},"in_reply_to":"bacf61ea_23f1b601","updated":"2016-08-08 12:16:53.000000000","message":"Yep, definitely. I would prefer it be split up a little more than it is in the final version so I\u0027ll rework it a little bit.","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"432637a635de1045be454470bede8091a69bc343","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        #    major version, meaning a v2 profile will never match if"},{"line_number":174,"context_line":"        #    only v3 is available on the server."},{"line_number":175,"context_line":"        #  * The search for the best match is fuzzy if needed."},{"line_number":176,"context_line":"        #    * If the profile specifies v2 and the server has"},{"line_number":177,"context_line":"        #      v2.0, v2.1, and v2.2, the match will be v2.2."},{"line_number":178,"context_line":"        #    * When an exact major/minor is specified, e.g., v2.0,"},{"line_number":179,"context_line":"        #      it will only match v2.0."},{"line_number":180,"context_line":"        for version in versions:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_dd907945","line":177,"range":{"start_line":176,"start_character":0,"end_line":177,"end_character":60},"updated":"2016-08-08 05:21:31.000000000","message":"take nova for example, their latest version could be 2.36. I\u0027m not sure SDK does support the API changes all the way from 2.0 to 2.36 yet. However, that is the exact expectations from users. If, for example, we don\u0027t yet support a particular version (e.g. 2.19), that is something we need to fix in SDK. So I agree we can assume we always support the latest version though this may create a lot of \"bugs\" to be fixed.","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"abbb74e226ce6edcd89140f99b379e5e7775223c","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        #    major version, meaning a v2 profile will never match if"},{"line_number":174,"context_line":"        #    only v3 is available on the server."},{"line_number":175,"context_line":"        #  * The search for the best match is fuzzy if needed."},{"line_number":176,"context_line":"        #    * If the profile specifies v2 and the server has"},{"line_number":177,"context_line":"        #      v2.0, v2.1, and v2.2, the match will be v2.2."},{"line_number":178,"context_line":"        #    * When an exact major/minor is specified, e.g., v2.0,"},{"line_number":179,"context_line":"        #      it will only match v2.0."},{"line_number":180,"context_line":"        for version in versions:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_c9fee804","line":177,"range":{"start_line":176,"start_character":0,"end_line":177,"end_character":60},"in_reply_to":"bacf61ea_dd907945","updated":"2016-08-08 12:16:53.000000000","message":"That\u0027s for microversion, though. This will only be looking at the \"id\" that represents the main version of the API which corresponds to the endpoint we\u0027re hitting. This could eventually be adapted to look at \"version\" to find the available microversion, but not enough services are exposing that to implement it at this time (it\u0027s an empty string in cinder, nonexistent in keystone, etc).\n\nThis is what nova gives back, and we can really only make use of the id\u003dv2.1 to get the /v2.1/ URI:\n{\"status\": \"CURRENT\", \"updated\": \"2013-07-23T11:33:21Z\", \"links\": [{\"href\": \"http://146.20.36.86:8774/v2.1/\", \"rel\": \"self\"}], \"min_version\": \"2.1\", \"version\": \"2.25\", \"id\": \"v2.1\"}]}","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"432637a635de1045be454470bede8091a69bc343","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if filt.requires_project_id:"},{"line_number":198,"context_line":"            match \u003d utils.urljoin(match, self.get_project_id())"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Messaging only returns partial links from its root, expecting you"},{"line_number":201,"context_line":"        # to match them up with the root URI on your own."},{"line_number":202,"context_line":"        if service_type \u003d\u003d \"messaging\":"},{"line_number":203,"context_line":"            match \u003d root_endpoint + match"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if match is None:"},{"line_number":206,"context_line":"            raise exceptions.EndpointNotFound("}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_036f52c4","line":203,"range":{"start_line":200,"start_character":0,"end_line":203,"end_character":41},"updated":"2016-08-08 05:21:31.000000000","message":"Senlin is also returning a partial link, i.e. the \u0027path\u0027 component from a urlsplit() call. The reason we do that is that we are not 100% sure that the end user really needs to know the netloc part of the server. There could be redirects or proxies in the middle. A relative path would suffice.\n\nMaybe we can do this?\n\n  r \u003d six.moves.urllib.parse.urlsplit(match)\n  endpoint \u003d match if r.scheme else root_endpoint + r","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"25d564cf3dbe1a259e1ce53a5db6518ae89f5416","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if filt.requires_project_id:"},{"line_number":198,"context_line":"            match \u003d utils.urljoin(match, self.get_project_id())"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Messaging only returns partial links from its root, expecting you"},{"line_number":201,"context_line":"        # to match them up with the root URI on your own."},{"line_number":202,"context_line":"        if service_type \u003d\u003d \"messaging\":"},{"line_number":203,"context_line":"            match \u003d root_endpoint + match"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if match is None:"},{"line_number":206,"context_line":"            raise exceptions.EndpointNotFound("}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_83c0ff2b","line":203,"range":{"start_line":200,"start_character":0,"end_line":203,"end_character":41},"in_reply_to":"9ad45d7e_69489c5c","updated":"2016-08-09 16:57:40.000000000","message":"Done","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8257,"name":"Brian Curtin","email":"brian@python.org","username":"briancurtin"},"change_message_id":"abbb74e226ce6edcd89140f99b379e5e7775223c","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if filt.requires_project_id:"},{"line_number":198,"context_line":"            match \u003d utils.urljoin(match, self.get_project_id())"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Messaging only returns partial links from its root, expecting you"},{"line_number":201,"context_line":"        # to match them up with the root URI on your own."},{"line_number":202,"context_line":"        if service_type \u003d\u003d \"messaging\":"},{"line_number":203,"context_line":"            match \u003d root_endpoint + match"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        if match is None:"},{"line_number":206,"context_line":"            raise exceptions.EndpointNotFound("}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_69489c5c","line":203,"range":{"start_line":200,"start_character":0,"end_line":203,"end_character":41},"in_reply_to":"bacf61ea_036f52c4","updated":"2016-08-08 12:16:53.000000000","message":"Yeah, that might work. I\u0027ll look into it.","commit_id":"71ee73b06484881d53a5a3f1d2799e2f6b643c26"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"847bad1038c91aa7d6ed09a4f8b47622aa54de8e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        anything and just take the root. We need to make a request there"},{"line_number":115,"context_line":"        to get the versions the API exposes."},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        parts \u003d parse.urlparse(endpoint)"},{"line_number":118,"context_line":"        root_endpoint \u003d \"://\".join([parts.scheme, parts.netloc])"},{"line_number":119,"context_line":"        response \u003d self.get(root_endpoint)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        # Normalize the version response. Identity nests the versions"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_21b5347d","line":118,"range":{"start_line":117,"start_character":0,"end_line":118,"end_character":64},"updated":"2016-08-12 02:29:05.000000000","message":"maybe we should leave the endpoint as is instead of doing this extra parsing. The endpoint we get from keystone should be treated as the \u0027root\u0027 endpoint.","commit_id":"d5149c9df057758aed9cfb66984856274305a666"}]}
