)]}'
{"nova/image/glance.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"7e4a65e92819dc236bd61354dddd876b01ad36dd","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        \"\"\"Create a client that will be used for one call.\"\"\""},{"line_number":228,"context_line":"        if self.api_servers is None:"},{"line_number":229,"context_line":"            self.api_servers \u003d get_api_servers()"},{"line_number":230,"context_line":"        self.host, self.port, self.use_ssl \u003d next(self.api_servers).as_tupple()"},{"line_number":231,"context_line":"        return _create_glance_client(context,"},{"line_number":232,"context_line":"                                     self.host, self.port,"},{"line_number":233,"context_line":"                                     self.use_ssl, version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_c5747937","line":230,"updated":"2015-12-07 14:21:39.000000000","message":"as_tuple #notaminusone","commit_id":"98fab44827502d34f4ad261120643fb80eed4bf1"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"7e4a65e92819dc236bd61354dddd876b01ad36dd","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":293,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def as_tupple(self):"},{"line_number":296,"context_line":"        parts \u003d urlparse.urlparse(self.url)"},{"line_number":297,"context_line":"        host \u003d parts.netloc.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":298,"context_line":"        if host[0] \u003d\u003d \u0027[\u0027 and host[-1] \u003d\u003d \u0027]\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_25a3fd9e","line":295,"updated":"2015-12-07 14:21:39.000000000","message":"as_tuple #notaminusone","commit_id":"98fab44827502d34f4ad261120643fb80eed4bf1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1234d504b28f2e0fab040f03f56ce0c9a0d8a5d","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    \"\"\""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, **kwargs):"},{"line_number":284,"context_line":"        if kwargs[\u0027url\u0027]:"},{"line_number":285,"context_line":"            self.url \u003d kwargs[\u0027url\u0027]"},{"line_number":286,"context_line":"        elif kwargs[\u0027port\u0027] and kwargs[\u0027host\u0027] and kwargs[\u0027use_ssl\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_192efaa4","line":283,"updated":"2015-12-09 10:45:46.000000000","message":"Hum thinking again to have a constructor which does not specify arguments make me feeling we should to use a factory with two static methods to build that object like \u0027from_tuple\u0027 and \u0027from_uri\u0027.\n\n  @classmethod\n  def from_tuple(cls, tuple):\n    ...\n    return cls(protocol, host, port)\n\n  @classmethod\n  def from_uri(cls, uri):\n    ...\n\n  def __init__(self, protocol, host, port):\n    ...","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"21a3a2b6dddf9747d777430cc2205020740bb01b","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    \"\"\""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, **kwargs):"},{"line_number":284,"context_line":"        if kwargs[\u0027url\u0027]:"},{"line_number":285,"context_line":"            self.url \u003d kwargs[\u0027url\u0027]"},{"line_number":286,"context_line":"        elif kwargs[\u0027port\u0027] and kwargs[\u0027host\u0027] and kwargs[\u0027use_ssl\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_54dc4474","line":283,"in_reply_to":"7a740942_192efaa4","updated":"2015-12-09 11:47:13.000000000","message":"realistically this is all very transitional, the object is going to go away once we\u0027ve got everyone speaking urls. But this let these be smaller patches.","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"baed6b47d113ea0ba0c1838c7469afd37e8d5a4b","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    \"\"\""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, **kwargs):"},{"line_number":284,"context_line":"        if kwargs[\u0027url\u0027]:"},{"line_number":285,"context_line":"            self.url \u003d kwargs[\u0027url\u0027]"},{"line_number":286,"context_line":"        elif kwargs[\u0027port\u0027] and kwargs[\u0027host\u0027] and kwargs[\u0027use_ssl\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_58ba320c","line":283,"in_reply_to":"7a740942_54dc4474","updated":"2015-12-09 13:51:32.000000000","message":"It\u0027s a lot of work to make it cleaner. Also something make me think we should is line 284. If we create an instance of GlanceEndpoint without to pass \u0027url\u0027 in kwargs, it seems for me a KeyError will be raised.","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1234d504b28f2e0fab040f03f56ce0c9a0d8a5d","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"},{"line_number":295,"context_line":"        host \u003d parts.netloc.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":296,"context_line":"        if host[0] \u003d\u003d \u0027[\u0027 and host[-1] \u003d\u003d \u0027]\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_947aaf75","line":293,"updated":"2015-12-09 10:45:46.000000000","message":"Can we build that tuple inside constructor to avoid doing that process each time we call properties like obj.host, obj.port... So we have as_tuple like:\n\n  def as_tuple(self):\n    return self._tuple","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"baed6b47d113ea0ba0c1838c7469afd37e8d5a4b","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"},{"line_number":295,"context_line":"        host \u003d parts.netloc.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":296,"context_line":"        if host[0] \u003d\u003d \u0027[\u0027 and host[-1] \u003d\u003d \u0027]\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_b5423f67","line":293,"in_reply_to":"7a740942_54ae84e8","updated":"2015-12-09 13:51:32.000000000","message":"I do not think it\u0027s an over optimization, this method is called for each endpoints when we call as_tuple, host, port, use_ssl.","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"21a3a2b6dddf9747d777430cc2205020740bb01b","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"},{"line_number":295,"context_line":"        host \u003d parts.netloc.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":296,"context_line":"        if host[0] \u003d\u003d \u0027[\u0027 and host[-1] \u003d\u003d \u0027]\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_54ae84e8","line":293,"in_reply_to":"7a740942_947aaf75","updated":"2015-12-09 11:47:13.000000000","message":"we don\u0027t call properties that often, so it seems like an over optimization.","commit_id":"fec9e8061358e288f6e0823db72896f7d7900352"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dd0c98306225892cd3facca9ef58bdfdb0ebbac9","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        return self.as_tuple()[2]"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def __str__(self):"},{"line_number":318,"context_line":"        return self.url"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"class GlanceImageService(object):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_340fd12f","line":318,"updated":"2015-12-10 22:44:49.000000000","message":"Why no tests for this? There\u0027s logic in as_tuple for handling ipv6 addresses and ssl, and differing kwargs on __init__. Seems test-worthy to me.","commit_id":"201e7f4d7bf0b008ce48f737016447968aa0fab2"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"fe14dbcfe4a800846e5e260c431dea2c78606718","unresolved":false,"context_lines":[{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    \"\"\""},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, **kwargs):"},{"line_number":284,"context_line":"        if kwargs[\u0027url\u0027]:"},{"line_number":285,"context_line":"            self.url \u003d kwargs[\u0027url\u0027]"},{"line_number":286,"context_line":"        elif kwargs[\u0027port\u0027] and kwargs[\u0027host\u0027] and kwargs[\u0027use_ssl\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_32433a44","line":283,"updated":"2015-12-11 15:45:24.000000000","message":"Ok will address something to create a factory here.","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"44362ccf73fcf7c0e6b711d530710e8ed08327f7","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_85c5f88e","line":291,"updated":"2015-12-11 20:34:08.000000000","message":"do we need add a else branch\nto guarantee self.url always exists?","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"9f2ab13ca4596be92f74368305b69b28089a852d","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_35ec998e","line":291,"in_reply_to":"3a7e1126_350d7937","updated":"2015-12-18 11:31:50.000000000","message":"On further thought, I don\u0027t believe we need an else branch, all uses of this are carefully controlled (please read the rest of the patch series). What would the else branch do except throw an exception? How would that differ from the behavior of use of this class if this wasn\u0027t set?\n\nThis all seems very much like busy work.","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0d5577c1aeef89f3890d5ec5cf2253298e8996b8","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_d03be3cf","line":291,"in_reply_to":"3a7e1126_35ec998e","updated":"2015-12-18 11:48:10.000000000","message":"Its a quick hack, and its about to die, that seems fine:\nhttps://review.openstack.org/#/c/256408/3/nova/image/glance.py","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ee5a123b012aae1df1df0872c89d3970771ecdfd","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_5e45d66d","line":291,"in_reply_to":"3a7e1126_516f1292","updated":"2015-12-18 05:13:37.000000000","message":"@mikal,\n\nI\u0027m almost of the opinion if we don\u0027t end up with a self.url this needs to raise an exception. I\u0027m ok with this being a \"real\" nova exception vs a python exception. \n\nThis is def. a weird edge case.\n\nWould moving this to a straight exception be fine? Or is it really almost not worth it if we land the next couple patches in quick succession?","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"1015d0c8f1de766aab23c1ec4f76f92e2d5b1633","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_350d7937","line":291,"in_reply_to":"3a7e1126_516f1292","updated":"2015-12-18 11:16:49.000000000","message":"Ok, this class is so narrowly used that we know every use of it and that it\u0027s always set (as seen by all the CI runs). I can have it throw an exception, but we actually know it works for the whole patch series.","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"df985641c72cf9a05d2af5a725cb9a464b225322","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_31d498ea","line":291,"in_reply_to":"3a7e1126_d03be3cf","updated":"2015-12-18 17:00:44.000000000","message":"++","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"c3b01a50344be0d54c5a41527948550b4688a68e","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.url \u003d \u0027%s://%s:%s\u0027 % ("},{"line_number":289,"context_line":"                \u0027https\u0027 if kwargs[\u0027use_ssl\u0027] else \u0027http\u0027,"},{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_516f1292","line":291,"in_reply_to":"7a740942_85c5f88e","updated":"2015-12-17 23:12:23.000000000","message":"I kind of agree. Its clearly not expected that you\u0027d fall out the bottom here without as self.url, but its very possible. An exception at least.\n\nI can see an argument that we don\u0027t much care because this is removed later in this patch series, but we also say that every commit should be deployable.","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"fe14dbcfe4a800846e5e260c431dea2c78606718","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                \u0027[\u0027 + host + \u0027]\u0027 if netutils.is_valid_ipv6(host) else host,"},{"line_number":291,"context_line":"                kwargs[\u0027port\u0027])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def as_tuple(self):"},{"line_number":294,"context_line":"        parts \u003d urlparse.urlparse(self.url)"},{"line_number":295,"context_line":"        host \u003d parts.netloc.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":296,"context_line":"        if host[0] \u003d\u003d \u0027[\u0027 and host[-1] \u003d\u003d \u0027]\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_326a5ab4","line":293,"updated":"2015-12-11 15:45:24.000000000","message":"Ok will address something to clean this part.","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"}],"nova/tests/unit/image/test_glance.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0d5577c1aeef89f3890d5ec5cf2253298e8996b8","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"                   protocol\u003d\"https\","},{"line_number":1297,"context_line":"                   port\u003d9292)"},{"line_number":1298,"context_line":"        api_servers \u003d glance.get_api_servers()"},{"line_number":1299,"context_line":"        self.assertEqual(\"https://[f000::c0de]:9292\", str(next(api_servers)))"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"class TestUpdateGlanceImage(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_f0cdbf5d","line":1299,"updated":"2015-12-18 11:48:10.000000000","message":"Not sure this is all the coverage dan was asking for, but I think the rest is covered in the existing tests anyways (apart from maybe the optional bit of the constructor that not used yet?)","commit_id":"d5fb977b0e927470ce8979e460e61b7e2233a5cf"}]}
