)]}'
{"novaclient/tests/unit/v2/test_versions.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1eb5027b00c5dbec4e0815243c2de63efe1c2dfe","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        fapi \u003d mock.Mock()"},{"line_number":81,"context_line":"        version_mgr \u003d versions.VersionManager(fapi)"},{"line_number":82,"context_line":"        version_mgr._list \u003d mock.Mock()"},{"line_number":83,"context_line":"        data \u003d ["},{"line_number":84,"context_line":"            (\"https://example.com:777/v2\", \"https://example.com:777\"),"},{"line_number":85,"context_line":"            (\"https://example.com/v2\", \"https://example.com\"),"},{"line_number":86,"context_line":"            (\"http://example.com/compute/v2\", \"http://example.com/compute\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_c071eb0e","line":83,"updated":"2017-07-07 20:26:21.000000000","message":"Can we also make sure that https://example.com/compute and https://compute.example.com/ work in here?","commit_id":"c54184ac3f40b042b988fd3e9cdb707d82b1d018"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"856dfa5dafcc0d165fe52c20229d6167e247bbf4","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        fapi \u003d mock.Mock()"},{"line_number":81,"context_line":"        version_mgr \u003d versions.VersionManager(fapi)"},{"line_number":82,"context_line":"        version_mgr._list \u003d mock.Mock()"},{"line_number":83,"context_line":"        data \u003d ["},{"line_number":84,"context_line":"            (\"https://example.com:777/v2\", \"https://example.com:777\"),"},{"line_number":85,"context_line":"            (\"https://example.com/v2\", \"https://example.com\"),"},{"line_number":86,"context_line":"            (\"http://example.com/compute/v2\", \"http://example.com/compute\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_60445775","line":83,"in_reply_to":"3f1d235d_c071eb0e","updated":"2017-07-07 20:34:00.000000000","message":"Done","commit_id":"c54184ac3f40b042b988fd3e9cdb707d82b1d018"}],"novaclient/v2/versions.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7c7c9f273cc8e531b9a3c1263c3ad8bd520f9223","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_b4569129","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"updated":"2017-07-05 15:48:02.000000000","message":"Are we sure there isn\u0027t another unversioned format like:\n\nhttp://{host}:{optional_port}/compute\n\n?","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1209ac2155eb3bc8ba81a515b1b0dfb684884207","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_9aaf3f7c","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"in_reply_to":"3f1d235d_3a494b30","updated":"2017-07-05 16:00:35.000000000","message":"Yeah this won\u0027t work if we have an unversioned endpoint with /compute at the end:\n\n\u003e\u003e\u003e from six.moves import urllib\n\u003e\u003e\u003e \n\u003e\u003e\u003e def parse_url(url):\n...     if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or\n...                 url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):\n...             path \u003d url.path[:url.path.rfind(\"/v2\")]\n...             version_url \u003d \u0027%s://%s%s\u0027 % (url.scheme, url.netloc, path)\n...     else:\n...              version_url \u003d \u0027%s://%s/\u0027 % (url.scheme, url.netloc)\n...     return version_url\n... \n\u003e\u003e\u003e parse_url(urllib.parse.urlparse(\u0027http://localhost:80/compute\u0027))\n\u0027http://localhost:80/\u0027\n\u003e\u003e\u003e","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"de3e546c4ef1c2c03af7d740d29004b5fa3db206","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_ba379bff","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"in_reply_to":"3f1d235d_9aaf3f7c","updated":"2017-07-05 16:10:02.000000000","message":"should we check that endpoint ends by \"compute\" key word? or in case of unknown format (\"else\" statement at L95) just leave the endpoint as is?","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88ddde9386665e126fa7823cef4f473bb7adc3a6","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_3a494b30","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"in_reply_to":"3f1d235d_b4569129","updated":"2017-07-05 15:54:52.000000000","message":"See this bug I had reported against the openstacksdk last year:\n\nhttps://bugs.launchpad.net/python-openstacksdk/+bug/1631480\n\nIn that case we had a network endpoint URL like this:\n\nhttp://localhost:5000/network\n\nWith no version. I\u0027m thinking the same could be true of the compute endpoint, since we support version discovery at the root:\n\nhttps://developer.openstack.org/api-ref/compute/#list-all-major-versions","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"18e7d9b594d13c1bcf937d8f912691394f7b1f7d","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_ddded10f","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"in_reply_to":"3f1d235d_ba379bff","updated":"2017-07-05 16:26:37.000000000","message":"The operator can register either versioned or unversioned endpoints in the catalog. That means the the url in the catalog could reasonably be:\n\n* https://compute.example.com/\n* https://compute.example.com/v2\n* https://compute.example.com/v2.1\n* https://example.com/compute\n* https://example.com/compute/v2\n* https://example.com/compute/v2.1\n\nIt\u0027s also worth noting that folks with older catalog entries can also still have {project_id} at the end.\n\nProperly handling and expanding this for all cases has just been added to keystoneauth. I recommend that we just update novaclient to use the methods there. I\u0027ll follow up with a patch showing that.","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"852bc78e297f43b571e99e4206f2f2de822a17de","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"},{"line_number":87,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}"},{"line_number":88,"context_line":"        #   3. under wsgi:"},{"line_number":89,"context_line":"        #       http://{host}:{optional_port}/compute/v{2 or 2.1}"},{"line_number":90,"context_line":"        if (url.path.endswith(\"v2\") or \"/v2/\" in url.path or"},{"line_number":91,"context_line":"                url.path.endswith(\"v2.1\") or \"/v2.1/\" in url.path):"},{"line_number":92,"context_line":"            # this way should handle all 3 possible formats"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_0d2f5788","line":89,"range":{"start_line":83,"start_character":8,"end_line":89,"end_character":65},"in_reply_to":"3f1d235d_ddded10f","updated":"2017-07-06 12:19:44.000000000","message":"@Monty: Thanks for describing all cases. As far ass I understand the method from keystoneauth library requires releasing, updating g-r and etc, so I prefer to hardcode cropping as for now since we have blocked CI and replace by proper call as soon as it will be possible","commit_id":"957f827a63fdb06205d48bd3992fbf279832603d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5f1ec0dfd5901f927147c96bcab63b934704cad1","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        endpoint \u003d self.api.client.get_endpoint()"},{"line_number":82,"context_line":"        url \u003d urllib.parse.urlparse(endpoint)"},{"line_number":83,"context_line":"        # NOTE(andreykurilin): endpoint URL has at least 3 formats:"},{"line_number":84,"context_line":"        #   1. the classic (legacy) endpoint:"},{"line_number":85,"context_line":"        #       http://{host}:{optional_port}/v{2 or 2.1}/{project-id}"},{"line_number":86,"context_line":"        #   2. starting from microversion 2.18 project-id is not included:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_e0574726","line":83,"updated":"2017-07-07 20:34:52.000000000","message":"Sorry but we should probably also put a TODO in here that we need to integrate with keystoneauth that will do this discovery for us.","commit_id":"bd0a2adefe5e89c4269f6589837f871764c6f1f6"}]}
