)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"fe4121b82aac7abeddd1f1b9e7bda03c8506804e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"cell data out of the database and into the configuration file."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements blueprint eliminate-clear-passwords-from-cells-table."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6b18f7643ab694f5ff34206b80865c40b1ec2680"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAPn%2F%2FkTo%3D","line":22,"updated":"2013-06-27 16:49:57.000000000","message":"Add a DocImpact and describe the syntax of the URL?","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"652a7a71de0a9711180ba46062d664d31e9d2d06","unresolved":false,"context_lines":[{"line_number":19,"context_line":"cell data out of the database and into the configuration file."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements blueprint eliminate-clear-passwords-from-cells-table."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6b18f7643ab694f5ff34206b80865c40b1ec2680"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAPn%2F%2FkPo%3D","line":22,"in_reply_to":"AAAAPn%2F%2FkTo%3D","updated":"2013-06-27 17:14:24.000000000","message":"Well, this patch doesn\u0027t actually expose the transport URL in any way, yet, but I probably should add a DocImpact to the follow-up patch…","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"8b0cc3d217944e153d9582674af5d01d271354a0","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from the database entirely and store it in a configuration file."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This change adds transport URLs to cells in a very limited fashion;"},{"line_number":17,"context_line":"only rabbit URLs are recognized, and no auxiliary data is recognized."},{"line_number":18,"context_line":"This cleans up the database table, and will make it easier to move"},{"line_number":19,"context_line":"cell data out of the database and into the configuration file."},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAPn%2F%2Fb%2BM%3D","line":17,"updated":"2013-07-01 23:12:37.000000000","message":"rabbit and qpid","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"8b0cc3d217944e153d9582674af5d01d271354a0","unresolved":false,"context_lines":[{"line_number":19,"context_line":"cell data out of the database and into the configuration file."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements blueprint eliminate-clear-passwords-from-cells-table."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6b18f7643ab694f5ff34206b80865c40b1ec2680"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAPn%2F%2Fb%2BI%3D","line":22,"updated":"2013-07-01 23:12:37.000000000","message":"DocImpact","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"b799926a0d11a554540934d2e7f53e91a25ce5e4","unresolved":false,"context_lines":[{"line_number":19,"context_line":"cell data out of the database and into the configuration file."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partially implements blueprint eliminate-clear-passwords-from-cells-table."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6b18f7643ab694f5ff34206b80865c40b1ec2680"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAP3%2F%2F5pE%3D","line":22,"in_reply_to":"AAAAPn%2F%2Fb%2BI%3D","updated":"2013-07-09 15:05:49.000000000","message":"This doesn\u0027t actually affect the docs; the next patch in the series causes exposure of this, which is why I only put the DocImpact tag on it.","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"}],"nova/cells/rpc_driver.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"23c7f9a11c0c854dfcf93145f1ad1e19ecd6c159","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Make sure we understand the schema"},{"line_number":176,"context_line":"    if parsed.schema !\u003d \u0027amqp\u0027:"},{"line_number":177,"context_line":"        raise ValueError(_(\"Unable to handle non-AMQP transport URLs\"))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":180,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F7SQ%3D","line":177,"updated":"2013-06-18 05:24:01.000000000","message":"Valid schemes are rabbit, qpid, zmq - https://github.com/markmc/oslo.messaging/blob/d31ae442ca/setup.cfg#L31","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"178e4168aeec3a9326e38a5dff6481736d02849e","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Make sure we understand the schema"},{"line_number":176,"context_line":"    if parsed.schema !\u003d \u0027amqp\u0027:"},{"line_number":177,"context_line":"        raise ValueError(_(\"Unable to handle non-AMQP transport URLs\"))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":180,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F59M%3D","line":177,"in_reply_to":"AAAAPn%2F%2F5%2Fo%3D","updated":"2013-06-18 16:00:17.000000000","message":"Right, I\u0027m just saying s/amqp/rabbit/","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"dc518ce37faf9a5d0d1f7ffe358279f9d87c049a","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Make sure we understand the schema"},{"line_number":176,"context_line":"    if parsed.schema !\u003d \u0027amqp\u0027:"},{"line_number":177,"context_line":"        raise ValueError(_(\"Unable to handle non-AMQP transport URLs\"))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":180,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5ss%3D","line":177,"in_reply_to":"AAAAPn%2F%2F59M%3D","updated":"2013-06-18 17:33:53.000000000","message":"Ah, OK…","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5a60fe8c073f7b13369b605779d1139b191fce9e","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    # Make sure we understand the schema"},{"line_number":176,"context_line":"    if parsed.schema !\u003d \u0027amqp\u0027:"},{"line_number":177,"context_line":"        raise ValueError(_(\"Unable to handle non-AMQP transport URLs\"))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":180,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5%2Fo%3D","line":177,"in_reply_to":"AAAAPn%2F%2F7SQ%3D","updated":"2013-06-18 15:52:40.000000000","message":"The only scheme that current cells supports is rabbit, though…","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"23c7f9a11c0c854dfcf93145f1ad1e19ecd6c159","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F7SI%3D","line":187,"updated":"2013-06-18 05:24:01.000000000","message":"Username and password will come from netloc","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"178e4168aeec3a9326e38a5dff6481736d02849e","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F59I%3D","line":187,"in_reply_to":"AAAAPn%2F%2F5%2Fg%3D","updated":"2013-06-18 16:00:17.000000000","message":"Cool","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5a60fe8c073f7b13369b605779d1139b191fce9e","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5%2Fg%3D","line":187,"in_reply_to":"AAAAPn%2F%2F7SI%3D","updated":"2013-06-18 15:52:40.000000000","message":"Yes, they do; the \u0027username\u0027 and \u0027password\u0027 properties are derived from netloc.","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"23c7f9a11c0c854dfcf93145f1ad1e19ecd6c159","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F7SA%3D","line":188,"updated":"2013-06-18 05:24:01.000000000","message":"Currently, we have the first element of path as the exchange ... perhaps /virtual_host/exchange makes sense though - https://github.com/markmc/oslo.messaging/blob/d31ae442ca/oslo/messaging/_urls.py#L80","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"178e4168aeec3a9326e38a5dff6481736d02849e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F59A%3D","line":188,"in_reply_to":"AAAAPn%2F%2F5%2FU%3D","updated":"2013-06-18 16:00:17.000000000","message":"Come on, who ever believes a few sentences in a wiki .. the code isn\u0027t hard to read :)","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"dc518ce37faf9a5d0d1f7ffe358279f9d87c049a","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5sg%3D","line":188,"in_reply_to":"AAAAPn%2F%2F59A%3D","updated":"2013-06-18 17:33:53.000000000","message":"Hehe :)  If I can get someone to answer questions, that is typically quicker than trying to reverse-engineer someone else\u0027s code :)","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5a60fe8c073f7b13369b605779d1139b191fce9e","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    # Extract the interesting information from the URL"},{"line_number":186,"context_line":"    username \u003d parsed.username"},{"line_number":187,"context_line":"    password \u003d parsed.password"},{"line_number":188,"context_line":"    virtual_host \u003d parsed.path"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F5%2FU%3D","line":188,"in_reply_to":"AAAAPn%2F%2F7SA%3D","updated":"2013-06-18 15:52:40.000000000","message":"Hrm; I was going by the write-up.  I did ask if anything had changed :)","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"23c7f9a11c0c854dfcf93145f1ad1e19ecd6c159","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"},{"line_number":192,"context_line":"    hostname \u003d parsed.hostname"},{"line_number":193,"context_line":"    if hostname[0] \u003d\u003d \u0027[\u0027:"},{"line_number":194,"context_line":"        # If \u0027@\u0027 is present, rfind() finds its position; if it isn\u0027t,"},{"line_number":195,"context_line":"        # rfind() returns -1.  Either way, adding 1 gives us the start"},{"line_number":196,"context_line":"        # location of the host and port..."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F7Ro%3D","line":193,"updated":"2013-06-18 05:24:01.000000000","message":"Use this: https://github.com/openstack/oslo-incubator/blob/688832fd37/openstack/common/network_utils.py#L28","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"178e4168aeec3a9326e38a5dff6481736d02849e","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"},{"line_number":192,"context_line":"    hostname \u003d parsed.hostname"},{"line_number":193,"context_line":"    if hostname[0] \u003d\u003d \u0027[\u0027:"},{"line_number":194,"context_line":"        # If \u0027@\u0027 is present, rfind() finds its position; if it isn\u0027t,"},{"line_number":195,"context_line":"        # rfind() returns -1.  Either way, adding 1 gives us the start"},{"line_number":196,"context_line":"        # location of the host and port..."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F58s%3D","line":193,"in_reply_to":"AAAAPn%2F%2F59w%3D","updated":"2013-06-18 16:00:17.000000000","message":"*shrug* - a patch for IPv6 support in oslo.messaging._urls would be appreciated","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"5a60fe8c073f7b13369b605779d1139b191fce9e","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # Now we have to extract the hostname and port; unfortunately,"},{"line_number":191,"context_line":"    # urlparse in Python 2.6 doesn\u0027t understand IPv6 addresses"},{"line_number":192,"context_line":"    hostname \u003d parsed.hostname"},{"line_number":193,"context_line":"    if hostname[0] \u003d\u003d \u0027[\u0027:"},{"line_number":194,"context_line":"        # If \u0027@\u0027 is present, rfind() finds its position; if it isn\u0027t,"},{"line_number":195,"context_line":"        # rfind() returns -1.  Either way, adding 1 gives us the start"},{"line_number":196,"context_line":"        # location of the host and port..."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F59w%3D","line":193,"in_reply_to":"AAAAPn%2F%2F7Ro%3D","updated":"2013-06-18 15:52:40.000000000","message":"Honestly, I don\u0027t like this parsing.  First of all, in the linked code, you will get a TypeError raised if the \u0027]\u0027 is not present.  Second, I am used to leading underscore being a convention for a variable which is *not* used, so I have aesthetic concerns with that code.  Finally, I only have to worry about the IPv6 case here; this clause is only triggered if the URL has an IPv6 address in it and we\u0027re running on Python 2.6, where urlparse doesn\u0027t recognize IPv6 addresses in URLs.","commit_id":"76cf19c4b3fa1764b7621e0457940cadd18a9e25"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"2497eba10a324bd9dc5a52195e1bac379882c14e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    parsed \u003d urlparse.urlparse(url or \u0027\u0027)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    # Make sure we understand the scheme"},{"line_number":200,"context_line":"    if parsed.scheme !\u003d \u0027rabbit\u0027:"},{"line_number":201,"context_line":"        raise ValueError(_(\"Unable to handle transport URL scheme %s\") %"},{"line_number":202,"context_line":"                         parsed.scheme)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAPn%2F%2F1uw%3D","line":200,"updated":"2013-06-20 01:40:55.000000000","message":"qpid should be the exact same.","commit_id":"f4d1ce6ae4781c2fe5113fdfce75267cccfb8c57"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9ad5c1ffbadf9823bceb21ced5eb4becd5654a7d","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    parsed \u003d urlparse.urlparse(url or \u0027\u0027)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    # Make sure we understand the scheme"},{"line_number":200,"context_line":"    if parsed.scheme !\u003d \u0027rabbit\u0027:"},{"line_number":201,"context_line":"        raise ValueError(_(\"Unable to handle transport URL scheme %s\") %"},{"line_number":202,"context_line":"                         parsed.scheme)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAPn%2F%2F0F8%3D","line":200,"in_reply_to":"AAAAPn%2F%2F1uw%3D","updated":"2013-06-20 15:59:13.000000000","message":"So cells can talk to both rabbit and qpid without being informed of the scheme?  What about the other way, when I convert existing connection information into a transport URL?  Should I worry, or just use \u0027rabbit\u0027?\n\n(Right now, nothing explicitly sets the transport_url field; it\u0027s just inferred from information that exists.  The next step, however, will be to optionally draw this information from configuration, where the transport URL will be explicitly set…)","commit_id":"f4d1ce6ae4781c2fe5113fdfce75267cccfb8c57"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"94fe3ae04ed59b0d66b7d81deec76e02ee84e70d","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    # Make sure we understand the scheme"},{"line_number":200,"context_line":"    if parsed.scheme !\u003d \u0027rabbit\u0027:"},{"line_number":201,"context_line":"        raise ValueError(_(\"Unable to handle transport URL scheme %s\") %"},{"line_number":202,"context_line":"                         parsed.scheme)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":205,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fpqo%3D","line":202,"updated":"2013-06-25 22:25:01.000000000","message":"Not sure I understood your questions in patch set 7, but it does seem as if \u0027qpid\u0027 will work... because the rpc.cast_to_server methods work with the same params whether or not qpid or kombu is used...","commit_id":"9bfb45f4a6fd1c11b9c0c387479385ded62cbabf"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"01ef151f28a672174f1a3588546b7d1922dd813d","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    # Make sure we understand the scheme"},{"line_number":200,"context_line":"    if parsed.scheme !\u003d \u0027rabbit\u0027:"},{"line_number":201,"context_line":"        raise ValueError(_(\"Unable to handle transport URL scheme %s\") %"},{"line_number":202,"context_line":"                         parsed.scheme)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    # Make sure there\u0027s not a query string; that could identify"},{"line_number":205,"context_line":"    # requirements we can\u0027t comply with (e.g., ssl), so reject it if"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fpp4%3D","line":202,"in_reply_to":"AAAAPn%2F%2Fpqo%3D","updated":"2013-06-25 22:28:48.000000000","message":"OK, I can make both \u0027rabbit\u0027 and \u0027qpid\u0027 be allowed…","commit_id":"9bfb45f4a6fd1c11b9c0c387479385ded62cbabf"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"fe4121b82aac7abeddd1f1b9e7bda03c8506804e","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    # Extract the interesting information from the URL; this requires"},{"line_number":211,"context_line":"    # dequoting values, and ensuring empty values become None"},{"line_number":212,"context_line":"    username \u003d urllib.unquote(parsed.username) if parsed.username else None"},{"line_number":213,"context_line":"    password \u003d urllib.unquote(parsed.password) if parsed.password else None"},{"line_number":214,"context_line":"    virtual_host \u003d urllib.unquote(parsed.path[1:]) or None"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkUU%3D","line":212,"updated":"2013-06-27 16:49:57.000000000","message":"Are usernames, passwords, and vhosts actually optional in Rabbit configs?","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"652a7a71de0a9711180ba46062d664d31e9d2d06","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    # Extract the interesting information from the URL; this requires"},{"line_number":211,"context_line":"    # dequoting values, and ensuring empty values become None"},{"line_number":212,"context_line":"    username \u003d urllib.unquote(parsed.username) if parsed.username else None"},{"line_number":213,"context_line":"    password \u003d urllib.unquote(parsed.password) if parsed.password else None"},{"line_number":214,"context_line":"    virtual_host \u003d urllib.unquote(parsed.path[1:]) or None"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkPk%3D","line":212,"in_reply_to":"AAAAPn%2F%2FkUU%3D","updated":"2013-06-27 17:14:24.000000000","message":"I\u0027ve been going by the fact that the columns in the model are not marked nullable…","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"8b0cc3d217944e153d9582674af5d01d271354a0","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        netloc +\u003d \":%d\" % port"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    # Assemble the transport URL"},{"line_number":301,"context_line":"    url \u003d \"rabbit://%s/\" % netloc"},{"line_number":302,"context_line":"    if virtual_host:"},{"line_number":303,"context_line":"        url +\u003d urllib.quote(virtual_host, \u0027\u0027)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPn%2F%2Fb9c%3D","line":301,"updated":"2013-07-01 23:12:37.000000000","message":"This will break any system using qpid.\n\nHow about look at the configuration to see what rpc_backend is configured?  I can\u0027t think of a better way to pick one.  It\u0027s worth noting in the commit message if you go this route that the nova.conf on the system running nova-manage db sync needs to have this set for it to work.","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"b6570f69d4607e7158e97c23d2cbe6a5ce32568e","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        netloc +\u003d \":%d\" % port"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    # Assemble the transport URL"},{"line_number":301,"context_line":"    url \u003d \"rabbit://%s/\" % netloc"},{"line_number":302,"context_line":"    if virtual_host:"},{"line_number":303,"context_line":"        url +\u003d urllib.quote(virtual_host, \u0027\u0027)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F0i8%3D","line":301,"in_reply_to":"AAAAP3%2F%2F5og%3D","updated":"2013-07-10 22:21:12.000000000","message":"I mean the general rpc_backend.  Previously, before this patch, the cells code had no idea which driver it was using.  It was just using the general rpc API.  Now it\u0027s encoded in this URL.","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"b799926a0d11a554540934d2e7f53e91a25ce5e4","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        netloc +\u003d \":%d\" % port"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    # Assemble the transport URL"},{"line_number":301,"context_line":"    url \u003d \"rabbit://%s/\" % netloc"},{"line_number":302,"context_line":"    if virtual_host:"},{"line_number":303,"context_line":"        url +\u003d urllib.quote(virtual_host, \u0027\u0027)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F5og%3D","line":301,"in_reply_to":"AAAAPn%2F%2Fb9c%3D","updated":"2013-07-09 15:05:49.000000000","message":"There is no rpc_backend or similar option in cells; as far as I can tell, it only ever supported rabbit.  Chris always had the intention of extending it to be able to support multiple backends—see the FIXME I excised from models.py—but doing so is actually outside the scope of this patch.","commit_id":"1c419a2d6afd2c5f98946a700c9b27972e3e1109"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"7ec91b80aeed9522369b3f62b30089d03cb6fd05","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    #            basic AMQP; there is no configuration option that"},{"line_number":307,"context_line":"    #            would affect this, and no setting in the currently"},{"line_number":308,"context_line":"    #            authoritative cells model to specify the underlying"},{"line_number":309,"context_line":"    #            transport to use."},{"line_number":310,"context_line":"    url \u003d \"rabbit://%s/\" % netloc"},{"line_number":311,"context_line":"    if virtual_host:"},{"line_number":312,"context_line":"        url +\u003d urllib.quote(virtual_host, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2F0ik%3D","line":309,"updated":"2013-07-10 22:24:58.000000000","message":"The cells code just calls the rpc API and uses whatever rpc backend it is configured for.  The API calls it needs are supported by both the qpid and kombu (rabbit) drivers.  Even with this patch it\u0027s still the same.  This part of the URL is actually ignored other than basic validation in this code as far as I can tell.  It still needs to be accurate though, for when this part of the URL is actually used.\n\nIn fact, it may make more sense to use kombu in the transport URL instead of rabbit, since that is the actual driver it\u0027s referring to.","commit_id":"08efae6b642e84a1c01475f94d052fc8d9e0bccf"}],"nova/db/sqlalchemy/migrate_repo/versions/190_add_transport_url_to_cell.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"fe4121b82aac7abeddd1f1b9e7bda03c8506804e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    query \u003d select([get_column(table, c) for c in columns])"},{"line_number":102,"context_line":"    for row in [dict(zip(fields, result)) for result in query.execute()]:"},{"line_number":103,"context_line":"        # Compute the transport URL"},{"line_number":104,"context_line":"        url \u003d rpc_driver.unparse_transport_url(row)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Store the transport URL in the database"},{"line_number":107,"context_line":"        table.update().where(table.c.id \u003d\u003d row[\u0027id\u0027]).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkUA%3D","line":104,"updated":"2013-06-27 16:49:57.000000000","message":"The old cells model allowed DB nulls for the columns.  I\u0027m wondering if the migration will catch this and puke here.","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"652a7a71de0a9711180ba46062d664d31e9d2d06","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    query \u003d select([get_column(table, c) for c in columns])"},{"line_number":102,"context_line":"    for row in [dict(zip(fields, result)) for result in query.execute()]:"},{"line_number":103,"context_line":"        # Compute the transport URL"},{"line_number":104,"context_line":"        url \u003d rpc_driver.unparse_transport_url(row)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Store the transport URL in the database"},{"line_number":107,"context_line":"        table.update().where(table.c.id \u003d\u003d row[\u0027id\u0027]).\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkPU%3D","line":104,"in_reply_to":"AAAAPn%2F%2FkUA%3D","updated":"2013-06-27 17:14:24.000000000","message":"I carefully wrote unparse_transport_url() to handle the case of columns being None or even not present, so no pukey pukey :)","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"fe4121b82aac7abeddd1f1b9e7bda03c8506804e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                    continue"},{"line_number":131,"context_line":"                transport_data[field_map.get(key, key)] \u003d value"},{"line_number":132,"context_line":"        except ValueError:"},{"line_number":133,"context_line":"            # We failed to parse the transport URL, so don\u0027t set up"},{"line_number":134,"context_line":"            # any transport data"},{"line_number":135,"context_line":"            pass"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkT0%3D","line":133,"updated":"2013-06-27 16:49:57.000000000","message":"Silently skipping the row..hmmm.  Might want to print some warning here at the very least.","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"652a7a71de0a9711180ba46062d664d31e9d2d06","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                    continue"},{"line_number":131,"context_line":"                transport_data[field_map.get(key, key)] \u003d value"},{"line_number":132,"context_line":"        except ValueError:"},{"line_number":133,"context_line":"            # We failed to parse the transport URL, so don\u0027t set up"},{"line_number":134,"context_line":"            # any transport data"},{"line_number":135,"context_line":"            pass"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkPE%3D","line":133,"in_reply_to":"AAAAPn%2F%2FkT0%3D","updated":"2013-06-27 17:14:24.000000000","message":"Not a bad idea…","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"fe4121b82aac7abeddd1f1b9e7bda03c8506804e","unresolved":false,"context_lines":[{"line_number":868,"context_line":"    name \u003d Column(String(255))"},{"line_number":869,"context_line":"    api_url \u003d Column(String(255))"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"    transport_url \u003d Column(String(255))"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    weight_offset \u003d Column(Float(), default\u003d0.0)"},{"line_number":874,"context_line":"    weight_scale \u003d Column(Float(), default\u003d1.0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkTY%3D","line":871,"updated":"2013-06-27 16:49:57.000000000","message":"Should add an explict nullable\u003dFalse.  Save team Boris from having to add it later. :)","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"652a7a71de0a9711180ba46062d664d31e9d2d06","unresolved":false,"context_lines":[{"line_number":868,"context_line":"    name \u003d Column(String(255))"},{"line_number":869,"context_line":"    api_url \u003d Column(String(255))"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"    transport_url \u003d Column(String(255))"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    weight_offset \u003d Column(Float(), default\u003d0.0)"},{"line_number":874,"context_line":"    weight_scale \u003d Column(Float(), default\u003d1.0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FkOw%3D","line":871,"in_reply_to":"AAAAPn%2F%2FkTY%3D","updated":"2013-06-27 17:14:24.000000000","message":"Only reason I didn\u0027t is because I was going by the existing example that allowed all the fields to be NULL…","commit_id":"6dd10fe2da9623e11a5aa136cf53bbd6218853d8"}]}
