)]}'
{"bin/glance-replicator":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6557394b9f0cf65d130ab1602287280478341b0d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5wo%3D","line":7,"updated":"2012-05-21 11:08:10.000000000","message":"Should the last one be the only copyright notice?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5Us%3D","line":7,"in_reply_to":"AAAAHX%2F%2F5mE%3D","updated":"2012-05-22 00:08:38.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5mE%3D","line":7,"in_reply_to":"AAAAHX%2F%2F5u4%3D","updated":"2012-05-21 16:22:05.000000000","message":"Just adding your name as you did above is appropriate IMHO.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1564639d95535f6870ab493f76f3664699f338fc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"},{"line_number":8,"context_line":"# All Rights Reserved."},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5u4%3D","line":7,"in_reply_to":"AAAAHX%2F%2F5wo%3D","updated":"2012-05-21 12:47:48.000000000","message":"I\u0027m not sure. A bit of this code was lifted from the glance client, and the nova way would be to just add another copyright statement. I don\u0027t mind much either way. What\u0027s the standard way of handling this in glance?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    Set up the CLI."},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    parser.add_option(\u0027-v\u0027, \u0027--verbose\u0027, default\u003dFalse, action\u003d\"store_true\","},{"line_number":56,"context_line":"                      help\u003d\"Print more verbose output\")"},{"line_number":57,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5mA%3D","line":54,"updated":"2012-05-21 16:22:05.000000000","message":"I think PEP8 may complain about this extra line... just FYI in case.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    Set up the CLI."},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    parser.add_option(\u0027-v\u0027, \u0027--verbose\u0027, default\u003dFalse, action\u003d\"store_true\","},{"line_number":56,"context_line":"                      help\u003d\"Print more verbose output\")"},{"line_number":57,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5Uk%3D","line":54,"in_reply_to":"AAAAHX%2F%2F5mA%3D","updated":"2012-05-22 00:08:38.000000000","message":"PEP8 seems ok with this one, but I\u0027ll change it anyways.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    return command"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def replication_count(options, args):"},{"line_number":125,"context_line":"    \"\"\""},{"line_number":126,"context_line":"%(prog)s count \u003cserver:port\u003e"},{"line_number":127,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5ls%3D","line":124,"updated":"2012-05-21 16:22:05.000000000","message":"I think I\u0027d prefer to change \"count\" to \"size\", to better indicate we are returning the total byte size vs the number of images...","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    return command"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def replication_count(options, args):"},{"line_number":125,"context_line":"    \"\"\""},{"line_number":126,"context_line":"%(prog)s count \u003cserver:port\u003e"},{"line_number":127,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5Ug%3D","line":124,"in_reply_to":"AAAAHX%2F%2F5ls%3D","updated":"2012-05-22 00:08:38.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6557394b9f0cf65d130ab1602287280478341b0d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    server_port \u003d args.pop()"},{"line_number":133,"context_line":"    server, port \u003d server_port.split(\u0027:\u0027)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    print \u0027Connecting to glance at %s:%d\u0027 %(server, int(port))"},{"line_number":136,"context_line":"    master_client \u003d glance_client.Client(server, int(port))"},{"line_number":137,"context_line":"    total_size \u003d 0"},{"line_number":138,"context_line":"    count \u003d 0"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5xg%3D","line":135,"updated":"2012-05-21 11:08:10.000000000","message":"Missing whitespace after the % operator.\n\nAlso simpler to just leave port as a string and sub in as %s (instead of casting to int to match %d)","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1564639d95535f6870ab493f76f3664699f338fc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    server_port \u003d args.pop()"},{"line_number":133,"context_line":"    server, port \u003d server_port.split(\u0027:\u0027)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    print \u0027Connecting to glance at %s:%d\u0027 %(server, int(port))"},{"line_number":136,"context_line":"    master_client \u003d glance_client.Client(server, int(port))"},{"line_number":137,"context_line":"    total_size \u003d 0"},{"line_number":138,"context_line":"    count \u003d 0"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5u0%3D","line":135,"in_reply_to":"AAAAHX%2F%2F5xg%3D","updated":"2012-05-21 12:47:48.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    print \u0027Total size is %d bytes across %d images\u0027 %(total_size, count)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def replication_master(options, args):"},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"%(prog)s master \u003cserver:port\u003e \u003cpath\u003e"},{"line_number":158,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5lo%3D","line":155,"updated":"2012-05-21 16:22:05.000000000","message":"I would prefer replication_dump() over replication_master() to better indicate the purpose of the function.\n\nThoughts?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    print \u0027Total size is %d bytes across %d images\u0027 %(total_size, count)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def replication_master(options, args):"},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"%(prog)s master \u003cserver:port\u003e \u003cpath\u003e"},{"line_number":158,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5Uc%3D","line":155,"in_reply_to":"AAAAHX%2F%2F5lo%3D","updated":"2012-05-22 00:08:38.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6557394b9f0cf65d130ab1602287280478341b0d","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    server_port \u003d args.pop()"},{"line_number":166,"context_line":"    server, port \u003d server_port.split(\u0027:\u0027)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    print \u0027Connecting to glance at %s:%d\u0027 %(server, int(port))"},{"line_number":169,"context_line":"    master_client \u003d glance_client.Client(server, int(port))"},{"line_number":170,"context_line":"    for image in master_client.get_images_detailed():"},{"line_number":171,"context_line":"        _master_step(master_client, image, path)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5w0%3D","line":168,"updated":"2012-05-21 11:08:10.000000000","message":"Similarly ...","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1564639d95535f6870ab493f76f3664699f338fc","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    server_port \u003d args.pop()"},{"line_number":166,"context_line":"    server, port \u003d server_port.split(\u0027:\u0027)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    print \u0027Connecting to glance at %s:%d\u0027 %(server, int(port))"},{"line_number":169,"context_line":"    master_client \u003d glance_client.Client(server, int(port))"},{"line_number":170,"context_line":"    for image in master_client.get_images_detailed():"},{"line_number":171,"context_line":"        _master_step(master_client, image, path)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5uw%3D","line":168,"in_reply_to":"AAAAHX%2F%2F5w0%3D","updated":"2012-05-21 12:47:48.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        _master_step(master_client, image, path)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def replication_slave(options, args):"},{"line_number":175,"context_line":"    \"\"\""},{"line_number":176,"context_line":"%(prog)s slave \u003cserver:port\u003e \u003cpath\u003e"},{"line_number":177,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5lk%3D","line":174,"updated":"2012-05-21 16:22:05.000000000","message":"I would prefer replication_load() over replication_slave() to better indicate the purpose of the function.\n\nThoughts?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        _master_step(master_client, image, path)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def replication_slave(options, args):"},{"line_number":175,"context_line":"    \"\"\""},{"line_number":176,"context_line":"%(prog)s slave \u003cserver:port\u003e \u003cpath\u003e"},{"line_number":177,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5UY%3D","line":174,"in_reply_to":"AAAAHX%2F%2F5lk%3D","updated":"2012-05-22 00:08:38.000000000","message":"Done","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6557394b9f0cf65d130ab1602287280478341b0d","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                # likes to see to the end of a file before uploading it,"},{"line_number":233,"context_line":"                # which I couldn\u0027t immediately make work with a file like"},{"line_number":234,"context_line":"                # object without storing the entire image in memory. This"},{"line_number":235,"context_line":"                # can likely be re-worked."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"                _master_step(master_client, image, path)"},{"line_number":238,"context_line":"                _slave_step(slave_client, image[\u0027id\u0027], path)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5ws%3D","line":235,"updated":"2012-05-21 11:08:10.000000000","message":"Yes, we\u0027ll need to rework this to remove the impedance - it could be just a case of glance.client.V1Client._get_image_size() taking the size from the source image metadata instead of expecting it to be available as the size of a seekable file.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"f174fbd9c1f442ea4058195d8982f562275d0803","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                # likes to see to the end of a file before uploading it,"},{"line_number":233,"context_line":"                # which I couldn\u0027t immediately make work with a file like"},{"line_number":234,"context_line":"                # object without storing the entire image in memory. This"},{"line_number":235,"context_line":"                # can likely be re-worked."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"                _master_step(master_client, image, path)"},{"line_number":238,"context_line":"                _slave_step(slave_client, image[\u0027id\u0027], path)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5uM%3D","line":235,"in_reply_to":"AAAAHX%2F%2F5us%3D","updated":"2012-05-21 13:17:16.000000000","message":"Cool, that change to the client needn\u0027t block this patch.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1564639d95535f6870ab493f76f3664699f338fc","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                # likes to see to the end of a file before uploading it,"},{"line_number":233,"context_line":"                # which I couldn\u0027t immediately make work with a file like"},{"line_number":234,"context_line":"                # object without storing the entire image in memory. This"},{"line_number":235,"context_line":"                # can likely be re-worked."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"                _master_step(master_client, image, path)"},{"line_number":238,"context_line":"                _slave_step(slave_client, image[\u0027id\u0027], path)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5us%3D","line":235,"in_reply_to":"AAAAHX%2F%2F5ws%3D","updated":"2012-05-21 12:47:48.000000000","message":"Yeah, that would work. I was planning on taking a look at the API as a next step to see what could be done to resolve this. Do you want to block this code until the API has been reworked, or iterate in the code base?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  data_path \u003d os.path.join(save_dir, image[\u0027id\u0027])"},{"line_number":248,"context_line":"  if not os.path.exists(data_path):"},{"line_number":249,"context_line":"    print \u0027... storing\u0027"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    # Dump glance information"},{"line_number":252,"context_line":"    f \u003d open(data_path, \u0027w\u0027)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5lg%3D","line":249,"updated":"2012-05-21 16:22:05.000000000","message":"Hmm, wrong indent level here and continued all below... should be 4 spaces, not 2..","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  data_path \u003d os.path.join(save_dir, image[\u0027id\u0027])"},{"line_number":248,"context_line":"  if not os.path.exists(data_path):"},{"line_number":249,"context_line":"    print \u0027... storing\u0027"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    # Dump glance information"},{"line_number":252,"context_line":"    f \u003d open(data_path, \u0027w\u0027)"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5UU%3D","line":249,"in_reply_to":"AAAAHX%2F%2F5lg%3D","updated":"2012-05-22 00:08:38.000000000","message":"Sigh. This is me being in too big a rush. This script was originally written to comply with a different code style and then I ported. Sorry I missed this bit.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"6f984d1fdb2bbbd634ecf15dd45b8920db1bb72e","unresolved":false,"context_lines":[{"line_number":295,"context_line":"      print \u0027... is already present\u0027"},{"line_number":296,"context_line":"      return"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"  sys.exit(1)"},{"line_number":299,"context_line":"  meta_file \u003d open(os.path.join(save_dir, uuid + \u0027.meta\u0027))"},{"line_number":300,"context_line":"  meta \u003d json.loads(meta_file.read())"},{"line_number":301,"context_line":"  meta_file.close()"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5pQ%3D","line":298,"updated":"2012-05-21 16:32:21.000000000","message":"This is a bit alarming","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c28cef39661d093ba9e8bdf23e3274eef55a2bb5","unresolved":false,"context_lines":[{"line_number":295,"context_line":"      print \u0027... is already present\u0027"},{"line_number":296,"context_line":"      return"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"  sys.exit(1)"},{"line_number":299,"context_line":"  meta_file \u003d open(os.path.join(save_dir, uuid + \u0027.meta\u0027))"},{"line_number":300,"context_line":"  meta \u003d json.loads(meta_file.read())"},{"line_number":301,"context_line":"  meta_file.close()"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5lc%3D","line":298,"updated":"2012-05-21 16:22:05.000000000","message":"Uh... ?","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"40bcc2e31786d33cf10bdf50bc66e91f10430199","unresolved":false,"context_lines":[{"line_number":295,"context_line":"      print \u0027... is already present\u0027"},{"line_number":296,"context_line":"      return"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"  sys.exit(1)"},{"line_number":299,"context_line":"  meta_file \u003d open(os.path.join(save_dir, uuid + \u0027.meta\u0027))"},{"line_number":300,"context_line":"  meta \u003d json.loads(meta_file.read())"},{"line_number":301,"context_line":"  meta_file.close()"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAHX%2F%2F5UQ%3D","line":298,"in_reply_to":"AAAAHX%2F%2F5pQ%3D","updated":"2012-05-22 00:08:38.000000000","message":"Please ignore this silly bit of debugging code. Its gone now.","commit_id":"d00e6c2c9b8d7d1d65897d6ad539198a1c5d81ed"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B5E%3D","line":4,"updated":"2012-07-03 00:30:54.000000000","message":"Drop this and the following two lines. This is all Michael Still/Canonical so far :)","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2010 United States Government as represented by the"},{"line_number":5,"context_line":"# Administrator of the National Aeronautics and Space Administration."},{"line_number":6,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":7,"context_line":"# Copyright 2012 Michael Still and Canonical Inc"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B04%3D","line":4,"in_reply_to":"AAAAJ3%2F%2F%2B5E%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"#    under the License."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":"Glance Replicator."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Use glance API calls to implement replication between glance installations."},{"line_number":26,"context_line":"\"\"\""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B5A%3D","line":23,"updated":"2012-07-03 00:30:54.000000000","message":"This and the following blank line are adding no value.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":20,"context_line":"#    under the License."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":"Glance Replicator."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Use glance API calls to implement replication between glance installations."},{"line_number":26,"context_line":"\"\"\""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B00%3D","line":23,"in_reply_to":"AAAAJ3%2F%2F%2B5A%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"gettext.install(\u0027glance\u0027, unicode\u003d1)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from glance.common import auth"},{"line_number":47,"context_line":"from glance.common import exception"},{"line_number":48,"context_line":"from glance.common import utils"},{"line_number":49,"context_line":"from glance import version"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B30%3D","line":46,"updated":"2012-07-03 00:30:54.000000000","message":"This file doesn\u0027t need to use any of the glance code. It might even make sense to ship it as a separate deliverable.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"gettext.install(\u0027glance\u0027, unicode\u003d1)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from glance.common import auth"},{"line_number":47,"context_line":"from glance.common import exception"},{"line_number":48,"context_line":"from glance.common import utils"},{"line_number":49,"context_line":"from glance import version"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bvw%3D","line":46,"in_reply_to":"AAAAJ3%2F%2F%2B30%3D","updated":"2012-07-03 10:54:09.000000000","message":"The auth import is important. If I don\u0027t have that I\u0027d have to copy across the keystone strategy code. I\u0027m willing to do that if you strongly prefer, but I don\u0027t think its a good default plan.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from glance.common import auth"},{"line_number":47,"context_line":"from glance.common import exception"},{"line_number":48,"context_line":"from glance.common import utils"},{"line_number":49,"context_line":"from glance import version"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BvM%3D","line":49,"updated":"2012-07-03 10:54:09.000000000","message":"Version is used for the about message, but can be dropped if required.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"from glance import version"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B48%3D","line":52,"updated":"2012-07-03 00:30:54.000000000","message":"Make this configurable.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":49,"context_line":"from glance import version"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BvI%3D","line":52,"in_reply_to":"AAAAJ3%2F%2F%2B48%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B40%3D","line":53,"updated":"2012-07-03 00:30:54.000000000","message":"I\u0027d love to see this replaced with a logger. You can set up all the prints in \u0027if VERBOSE:\u0027 blocks as debug level log lines, while the rest can be info level. Then you just set the log level in your main function. You can just use a StreamHandler by default to do the same thing as your prints are doing now.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Buc%3D","line":53,"in_reply_to":"AAAAJ3%2F%2F%2B40%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class GlanceRestClient(object):"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4w%3D","line":54,"updated":"2012-07-03 00:30:54.000000000","message":"This doesn\u0027t need to be defined at the global context. You should change the flow of the script through what you call and how, but global variables.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CHUNKSIZE \u003d 65536"},{"line_number":53,"context_line":"VERBOSE \u003d False"},{"line_number":54,"context_line":"METAONLY \u003d False"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class GlanceRestClient(object):"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BvE%3D","line":54,"in_reply_to":"AAAAJ3%2F%2F%2B4w%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class GlanceRestClient(object):"},{"line_number":58,"context_line":"    \"\"\" Support for use of the Glance REST API as a client. \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4s%3D","line":58,"updated":"2012-07-03 00:30:54.000000000","message":"No need for whitespace padding in your docstrings (applies throughout the whole file).","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class GlanceRestClient(object):"},{"line_number":58,"context_line":"    \"\"\" Support for use of the Glance REST API as a client. \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BuI%3D","line":58,"in_reply_to":"AAAAJ3%2F%2F%2B4s%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\" Support for use of the Glance REST API as a client. \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."},{"line_number":62,"context_line":"        "},{"line_number":63,"context_line":"    def __init__(self, server, port, auth_token, conn\u003dNone):"},{"line_number":64,"context_line":"        self.server \u003d server"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4o%3D","line":61,"updated":"2012-07-03 00:30:54.000000000","message":"Good decision, but this NOTE doesn\u0027t need to be here. It\u0027s implied by the code you\u0027re writing.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\" Support for use of the Glance REST API as a client. \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."},{"line_number":62,"context_line":"        "},{"line_number":63,"context_line":"    def __init__(self, server, port, auth_token, conn\u003dNone):"},{"line_number":64,"context_line":"        self.server \u003d server"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BuE%3D","line":61,"in_reply_to":"AAAAJ3%2F%2F%2B4o%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."},{"line_number":62,"context_line":"        "},{"line_number":63,"context_line":"    def __init__(self, server, port, auth_token, conn\u003dNone):"},{"line_number":64,"context_line":"        self.server \u003d server"},{"line_number":65,"context_line":"        self.port \u003d int(port)"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4k%3D","line":62,"updated":"2012-07-03 00:30:54.000000000","message":"Whitespace.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # NOTE(mikal): I use httplib here because I want to provide a"},{"line_number":61,"context_line":"    # response which doesn\u0027t have to all be in memory at once."},{"line_number":62,"context_line":"        "},{"line_number":63,"context_line":"    def __init__(self, server, port, auth_token, conn\u003dNone):"},{"line_number":64,"context_line":"        self.server \u003d server"},{"line_number":65,"context_line":"        self.port \u003d int(port)"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BuA%3D","line":62,"in_reply_to":"AAAAJ3%2F%2F%2B4k%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.port \u003d int(port)"},{"line_number":66,"context_line":"        self.auth_token \u003d auth_token"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        if conn:"},{"line_number":69,"context_line":"            self.conn \u003d conn"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4g%3D","line":68,"updated":"2012-07-03 00:30:54.000000000","message":"I\u0027d prefer to require a connection be passed in.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.port \u003d int(port)"},{"line_number":66,"context_line":"        self.auth_token \u003d auth_token"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        if conn:"},{"line_number":69,"context_line":"            self.conn \u003d conn"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bt8%3D","line":68,"in_reply_to":"AAAAJ3%2F%2F%2B4g%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B3o%3D","line":73,"updated":"2012-07-03 00:30:54.000000000","message":"Two things here:\n\n1) You don\u0027t need params and headers as they aren\u0027t used in any of the calling code.\n\n2) You should never default a function param to a non-primitive. Once this code is loaded, each call to the function will end up using the same exact copy of that object. In this case, every time you call get_images, the same params dict will be used.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BrY%3D","line":73,"in_reply_to":"AAAAJ3%2F%2F%2B3o%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"},{"line_number":77,"context_line":"            url \u003d \u0027v1/images/detail\u0027"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4Y%3D","line":74,"updated":"2012-07-03 00:30:54.000000000","message":"Document params and return values as well.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self.conn \u003d httplib.HTTPConnection(self.server, self.port)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"},{"line_number":77,"context_line":"            url \u003d \u0027v1/images/detail\u0027"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BrU%3D","line":74,"in_reply_to":"AAAAJ3%2F%2F%2B4Y%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"},{"line_number":77,"context_line":"            url \u003d \u0027v1/images/detail\u0027"},{"line_number":78,"context_line":"            params[\u0027is_public\u0027] \u003d None"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4U%3D","line":75,"updated":"2012-07-03 00:30:54.000000000","message":"Don\u0027t need the extra newlines","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_images(self, params\u003d{}, headers\u003d{}):"},{"line_number":74,"context_line":"        \"\"\" Return a detailed list of images. \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        while True:"},{"line_number":77,"context_line":"            url \u003d \u0027v1/images/detail\u0027"},{"line_number":78,"context_line":"            params[\u0027is_public\u0027] \u003d None"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BrQ%3D","line":75,"in_reply_to":"AAAAJ3%2F%2F%2B4U%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                out_headers, _unused \u003d self.get_image_meta(image[\u0027id\u0027])"},{"line_number":104,"context_line":"                yield out_headers"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_image(self, image_uuid, headers\u003d{}, method\u003d\u0027GET\u0027):"},{"line_number":107,"context_line":"        \"\"\" Return an image as a file like object. \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        url \u003d \u0027v1/images/%s\u0027 % image_uuid"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B3g%3D","line":106,"updated":"2012-07-03 00:30:54.000000000","message":"1) You don\u0027t need a headers param here (and my previous comment about non-primitive defaults applies)\n\n2) I\u0027d like to see a get_image and a head_image rather than overload this method to do two different things.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                out_headers, _unused \u003d self.get_image_meta(image[\u0027id\u0027])"},{"line_number":104,"context_line":"                yield out_headers"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_image(self, image_uuid, headers\u003d{}, method\u003d\u0027GET\u0027):"},{"line_number":107,"context_line":"        \"\"\" Return an image as a file like object. \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        url \u003d \u0027v1/images/%s\u0027 % image_uuid"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bq0%3D","line":106,"in_reply_to":"AAAAJ3%2F%2F%2B3g%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \"\"\" Return an image as a file like object. \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        url \u003d \u0027v1/images/%s\u0027 % image_uuid"},{"line_number":110,"context_line":"        if self.auth_token:"},{"line_number":111,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        if VERBOSE:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B3U%3D","line":110,"updated":"2012-07-03 00:30:54.000000000","message":"The repetition here makes it obvious that you need a base http_request method.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \"\"\" Return an image as a file like object. \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        url \u003d \u0027v1/images/%s\u0027 % image_uuid"},{"line_number":110,"context_line":"        if self.auth_token:"},{"line_number":111,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        if VERBOSE:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bqw%3D","line":110,"in_reply_to":"AAAAJ3%2F%2F%2B3U%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        return self.conn.getresponse()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _header_list_to_dict(headers):"},{"line_number":121,"context_line":"        d \u003d {}"},{"line_number":122,"context_line":"        for (header, value) in headers:"},{"line_number":123,"context_line":"            d[header.replace(\u0027x-image-meta-\u0027, \u0027\u0027)] \u003d value"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4Q%3D","line":120,"updated":"2012-07-03 00:30:54.000000000","message":"You need to handle the \u0027properties\u0027 sub-dict here and in _dict_to_headers.","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        return self.conn.getresponse()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _header_list_to_dict(headers):"},{"line_number":121,"context_line":"        d \u003d {}"},{"line_number":122,"context_line":"        for (header, value) in headers:"},{"line_number":123,"context_line":"            d[header.replace(\u0027x-image-meta-\u0027, \u0027\u0027)] \u003d value"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bqs%3D","line":120,"in_reply_to":"AAAAJ3%2F%2F%2B4Q%3D","updated":"2012-07-03 10:54:09.000000000","message":"I am unaware of the properties subdict, and haven\u0027t seen one in the wild. Do you have a pointer to some docs?","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def create_options(parser):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Set up the CLI."},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":"    parser.add_option(\u0027-v\u0027, \u0027--verbose\u0027, default\u003dFalse, action\u003d\"store_true\","}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4M%3D","line":188,"updated":"2012-07-03 00:30:54.000000000","message":"Too many newlines!","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def create_options(parser):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Set up the CLI."},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":"    parser.add_option(\u0027-v\u0027, \u0027--verbose\u0027, default\u003dFalse, action\u003d\"store_true\","}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bqo%3D","line":188,"in_reply_to":"AAAAJ3%2F%2F%2B4M%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            meta_file_name \u003d os.path.join(path, uuid)"},{"line_number":372,"context_line":"            meta_file \u003d open(meta_file_name)"},{"line_number":373,"context_line":"            meta \u003d json.loads(meta_file.read())"},{"line_number":374,"context_line":"            meta_file.close()    "},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"            if _image_present(client, uuid):"},{"line_number":377,"context_line":"                # NOTE(mikal): Perhaps we just need to update the meta data?"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4I%3D","line":374,"updated":"2012-07-03 00:30:54.000000000","message":"Trailing whitespace","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            meta_file_name \u003d os.path.join(path, uuid)"},{"line_number":372,"context_line":"            meta_file \u003d open(meta_file_name)"},{"line_number":373,"context_line":"            meta \u003d json.loads(meta_file.read())"},{"line_number":374,"context_line":"            meta_file.close()    "},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"            if _image_present(client, uuid):"},{"line_number":377,"context_line":"                # NOTE(mikal): Perhaps we just need to update the meta data?"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bqg%3D","line":374,"in_reply_to":"AAAAJ3%2F%2F%2B4I%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":455,"context_line":"def _image_present(client, uuid):"},{"line_number":456,"context_line":"    headers, _unused \u003d client.get_image_meta(uuid)"},{"line_number":457,"context_line":"    return \u0027status\u0027 in headers"},{"line_number":458,"context_line":"    "},{"line_number":459,"context_line":""},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4E%3D","line":458,"updated":"2012-07-03 00:30:54.000000000","message":"Whitespace","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":455,"context_line":"def _image_present(client, uuid):"},{"line_number":456,"context_line":"    headers, _unused \u003d client.get_image_meta(uuid)"},{"line_number":457,"context_line":"    return \u0027status\u0027 in headers"},{"line_number":458,"context_line":"    "},{"line_number":459,"context_line":""},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2Bqc%3D","line":458,"in_reply_to":"AAAAJ3%2F%2F%2B4E%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"450f13dd736f68811a238a58816eaa5df6d869f1","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                                    usage\u003dusage.strip())"},{"line_number":481,"context_line":"    create_options(oparser)"},{"line_number":482,"context_line":"    (options, command, args) \u003d parse_options(oparser, sys.argv[1:])"},{"line_number":483,"context_line":"    "},{"line_number":484,"context_line":"    # Handle options"},{"line_number":485,"context_line":"    if options.verbose:"},{"line_number":486,"context_line":"        VERBOSE \u003d True"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2B4A%3D","line":483,"updated":"2012-07-03 00:30:54.000000000","message":"Whitespace","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"d87684f7bf32a638b95446030f3a603ffc916293","unresolved":false,"context_lines":[{"line_number":480,"context_line":"                                    usage\u003dusage.strip())"},{"line_number":481,"context_line":"    create_options(oparser)"},{"line_number":482,"context_line":"    (options, command, args) \u003d parse_options(oparser, sys.argv[1:])"},{"line_number":483,"context_line":"    "},{"line_number":484,"context_line":"    # Handle options"},{"line_number":485,"context_line":"    if options.verbose:"},{"line_number":486,"context_line":"        VERBOSE \u003d True"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAJ3%2F%2F%2BqQ%3D","line":483,"in_reply_to":"AAAAJ3%2F%2F%2B4A%3D","updated":"2012-07-03 10:54:09.000000000","message":"Done","commit_id":"8059b9a81bce9e9dc92451f2bdacaa0486b2a5da"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Glance Replicator."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import gettext"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FzM%3D","line":20,"updated":"2012-07-04 23:08:12.000000000","message":"By my earlier comment, I meant that the title \u0027Glance Replicator.\u0027  and the blank line could go, not the short description. But you might as well just remove this whole docstring.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#    under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Glance Replicator."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import gettext"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FyA%3D","line":20,"in_reply_to":"AAAAKH%2F%2F%2FzM%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class GlanceRestClient(object):"},{"line_number":54,"context_line":"    \"\"\"Support for use of the Glance REST API as a client.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, conn, auth_token):"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FzI%3D","line":53,"updated":"2012-07-04 23:08:12.000000000","message":"Just call this \u0027ImageService\u0027 and drop the docstring. We don\u0027t need to encode the implementation into the name. It\u0027s a class that gives us access to an image service :)","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class GlanceRestClient(object):"},{"line_number":54,"context_line":"    \"\"\"Support for use of the Glance REST API as a client.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, conn, auth_token):"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fx4%3D","line":53,"in_reply_to":"AAAAKH%2F%2F%2FzI%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":53,"context_line":"class GlanceRestClient(object):"},{"line_number":54,"context_line":"    \"\"\"Support for use of the Glance REST API as a client.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, conn, auth_token):"},{"line_number":57,"context_line":"        self.auth_token \u003d auth_token"},{"line_number":58,"context_line":"        self.conn \u003d conn"},{"line_number":59,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fyo%3D","line":56,"updated":"2012-07-04 23:08:12.000000000","message":"Document the params - it\u0027s not obvious what a conn or an auth_token are.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":53,"context_line":"class GlanceRestClient(object):"},{"line_number":54,"context_line":"    \"\"\"Support for use of the Glance REST API as a client.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, conn, auth_token):"},{"line_number":57,"context_line":"        self.auth_token \u003d auth_token"},{"line_number":58,"context_line":"        self.conn \u003d conn"},{"line_number":59,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fxo%3D","line":56,"in_reply_to":"AAAAKH%2F%2F%2Fyo%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _http_request(self, method, url, headers, body,"},{"line_number":61,"context_line":"                      ignore_result_body\u003dFalse):"},{"line_number":62,"context_line":"        \"\"\"Perform a HTTP request against the server."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        method: the HTTP method to use"},{"line_number":65,"context_line":"        url: the URL to request (not including server portion)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fyg%3D","line":62,"updated":"2012-07-04 23:08:12.000000000","message":"s/a/an/","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _http_request(self, method, url, headers, body,"},{"line_number":61,"context_line":"                      ignore_result_body\u003dFalse):"},{"line_number":62,"context_line":"        \"\"\"Perform a HTTP request against the server."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        method: the HTTP method to use"},{"line_number":65,"context_line":"        url: the URL to request (not including server portion)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fxk%3D","line":62,"in_reply_to":"AAAAKH%2F%2F%2Fyg%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns: a httplib response object"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        if not \u0027x-auth-token\u0027 in headers and self.auth_token:"},{"line_number":73,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        logging.debug(_(\u0027Request: %(method)s http://%(server)s:%(port)s/\u0027"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FzE%3D","line":72,"updated":"2012-07-04 23:08:12.000000000","message":"Reduce this to \n\n  if self.auth_token:","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns: a httplib response object"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        if not \u0027x-auth-token\u0027 in headers and self.auth_token:"},{"line_number":73,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        logging.debug(_(\u0027Request: %(method)s http://%(server)s:%(port)s/\u0027"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxY%3D","line":72,"in_reply_to":"AAAAKH%2F%2F%2FzE%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        Returns: a httplib response object"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        if not \u0027x-auth-token\u0027 in headers and self.auth_token:"},{"line_number":73,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        logging.debug(_(\u0027Request: %(method)s http://%(server)s:%(port)s/\u0027"},{"line_number":76,"context_line":"                        \u0027%(url)s with headers %(headers)s\u0027)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FzA%3D","line":73,"updated":"2012-07-04 23:08:12.000000000","message":"Change this to \n\n  headers.setdefault(\u0027x-auth-token\u0027, self.auth_token)","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        Returns: a httplib response object"},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        if not \u0027x-auth-token\u0027 in headers and self.auth_token:"},{"line_number":73,"context_line":"            headers[\u0027x-auth-token\u0027] \u003d self.auth_token"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        logging.debug(_(\u0027Request: %(method)s http://%(server)s:%(port)s/\u0027"},{"line_number":76,"context_line":"                        \u0027%(url)s with headers %(headers)s\u0027)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxU%3D","line":73,"in_reply_to":"AAAAKH%2F%2F%2FzA%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         \u0027url\u0027: url,"},{"line_number":81,"context_line":"                         \u0027headers\u0027: repr(headers)})"},{"line_number":82,"context_line":"        self.conn.request(method, url, body, headers)"},{"line_number":83,"context_line":"        "},{"line_number":84,"context_line":"        response \u003d self.conn.getresponse()"},{"line_number":85,"context_line":"        headers \u003d self._header_list_to_dict(response.getheaders())"},{"line_number":86,"context_line":"        code \u003d response.status"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fy8%3D","line":83,"updated":"2012-07-04 23:08:12.000000000","message":"Rogue whitespace.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         \u0027url\u0027: url,"},{"line_number":81,"context_line":"                         \u0027headers\u0027: repr(headers)})"},{"line_number":82,"context_line":"        self.conn.request(method, url, body, headers)"},{"line_number":83,"context_line":"        "},{"line_number":84,"context_line":"        response \u003d self.conn.getresponse()"},{"line_number":85,"context_line":"        headers \u003d self._header_list_to_dict(response.getheaders())"},{"line_number":86,"context_line":"        code \u003d response.status"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fxg%3D","line":83,"in_reply_to":"AAAAKH%2F%2F%2Fy8%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        logging.debug(_(\u0027Response status: %(code)s %(status)s\u0027)"},{"line_number":89,"context_line":"                      % {\u0027code\u0027: code,"},{"line_number":90,"context_line":"                         \u0027status\u0027: code_description})"},{"line_number":91,"context_line":"        logging.debug(_(\u0027Response headers: %(headers)s\u0027)"},{"line_number":92,"context_line":"                      % {\u0027headers\u0027: repr(headers)})"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if code in [401, 403]:"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fy4%3D","line":91,"updated":"2012-07-04 23:08:12.000000000","message":"I would prefer to see the response logged all at once. Combine this log line with the one above.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        logging.debug(_(\u0027Response status: %(code)s %(status)s\u0027)"},{"line_number":89,"context_line":"                      % {\u0027code\u0027: code,"},{"line_number":90,"context_line":"                         \u0027status\u0027: code_description})"},{"line_number":91,"context_line":"        logging.debug(_(\u0027Response headers: %(headers)s\u0027)"},{"line_number":92,"context_line":"                      % {\u0027headers\u0027: repr(headers)})"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if code in [401, 403]:"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxM%3D","line":91,"in_reply_to":"AAAAKH%2F%2F%2Fy4%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                      % {\u0027headers\u0027: repr(headers)})"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if code in [401, 403]:"},{"line_number":95,"context_line":"            raise AuthenticationException(\u0027Server returned %s %s\u0027"},{"line_number":96,"context_line":"                                          % (code, code_description))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if ignore_result_body:"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fy0%3D","line":95,"updated":"2012-07-04 23:08:12.000000000","message":"This log message is already getting logged and it isn\u0027t useful programmatically, just drop it.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                      % {\u0027headers\u0027: repr(headers)})"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if code in [401, 403]:"},{"line_number":95,"context_line":"            raise AuthenticationException(\u0027Server returned %s %s\u0027"},{"line_number":96,"context_line":"                                          % (code, code_description))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if ignore_result_body:"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxI%3D","line":95,"in_reply_to":"AAAAKH%2F%2F%2Fy0%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            raise AuthenticationException(\u0027Server returned %s %s\u0027"},{"line_number":96,"context_line":"                                          % (code, code_description))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if ignore_result_body:"},{"line_number":99,"context_line":"            response.read()"},{"line_number":100,"context_line":"        return response"},{"line_number":101,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fyw%3D","line":98,"updated":"2012-07-04 23:08:12.000000000","message":"I\u0027m not sure why this block is here. Can you explain?","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            raise AuthenticationException(\u0027Server returned %s %s\u0027"},{"line_number":96,"context_line":"                                          % (code, code_description))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if ignore_result_body:"},{"line_number":99,"context_line":"            response.read()"},{"line_number":100,"context_line":"        return response"},{"line_number":101,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxE%3D","line":98,"in_reply_to":"AAAAKH%2F%2F%2Fyw%3D","updated":"2012-07-05 01:27:53.000000000","message":"httplib requires you read the response body before you send another request over the connection. Sometimes we only care about headers, so the caller can flag that and this helper does the right thing.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def get_images(self):"},{"line_number":103,"context_line":"        \"\"\"Return a detailed list of images."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        Yields a series of images as dicts containing meta data."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        params \u003d {\u0027is_public\u0027: None}"},{"line_number":108,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fys%3D","line":105,"updated":"2012-07-04 23:08:12.000000000","message":"metadata is one word","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def get_images(self):"},{"line_number":103,"context_line":"        \"\"\"Return a detailed list of images."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        Yields a series of images as dicts containing meta data."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        params \u003d {\u0027is_public\u0027: None}"},{"line_number":108,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FxA%3D","line":105,"in_reply_to":"AAAAKH%2F%2F%2Fys%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                return"},{"line_number":120,"context_line":"            for image in result.get(\u0027images\u0027, []):"},{"line_number":121,"context_line":"                # NOTE(mikal): why do I re-request the image meta data here?"},{"line_number":122,"context_line":"                # It\u0027s because the format for get_image_meta is x-image-meta"},{"line_number":123,"context_line":"                # style headers, whereas the results from v1/images/detail are"},{"line_number":124,"context_line":"                # named differently."},{"line_number":125,"context_line":"                params[\u0027marker\u0027] \u003d image[\u0027id\u0027]"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fyc%3D","line":122,"updated":"2012-07-04 23:08:12.000000000","message":"This comment isn\u0027t a great explanation of what\u0027s going on - I don\u0027t understand why you have to do this.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                    del image[key]"},{"line_number":397,"context_line":"                if key in headers:"},{"line_number":398,"context_line":"                    del headers[key]"},{"line_number":399,"context_line":"            "},{"line_number":400,"context_line":"            if _dict_diff(image, headers):"},{"line_number":401,"context_line":"                logging.info(_(\u0027... meta data has changed\u0027))"},{"line_number":402,"context_line":"                headers, body \u003d slave_client.add_image_meta(image)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FyU%3D","line":399,"updated":"2012-07-04 23:08:12.000000000","message":"Rogue whitespace.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                    del image[key]"},{"line_number":397,"context_line":"                if key in headers:"},{"line_number":398,"context_line":"                    del headers[key]"},{"line_number":399,"context_line":"            "},{"line_number":400,"context_line":"            if _dict_diff(image, headers):"},{"line_number":401,"context_line":"                logging.info(_(\u0027... meta data has changed\u0027))"},{"line_number":402,"context_line":"                headers, body \u003d slave_client.add_image_meta(image)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fw0%3D","line":399,"in_reply_to":"AAAAKH%2F%2F%2FyU%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"9060a8a1e91f0f870b8d2e60cce20222667d4f58","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                                      \u0027slave_value\u0027: headers.get(key,"},{"line_number":450,"context_line":"                                                                 \u0027undefined\u0027)})"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"            "},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":455,"context_line":"            logging.info(_(\u0027%s: entirely missing from the destination\u0027)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2FyQ%3D","line":452,"updated":"2012-07-04 23:08:12.000000000","message":"Rogue whitespace.","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"db183ab8bbc2ee8bdd96294bddd01e00a8d9a760","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                                      \u0027slave_value\u0027: headers.get(key,"},{"line_number":450,"context_line":"                                                                 \u0027undefined\u0027)})"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"            "},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":455,"context_line":"            logging.info(_(\u0027%s: entirely missing from the destination\u0027)"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAKH%2F%2F%2Fww%3D","line":452,"in_reply_to":"AAAAKH%2F%2F%2FyQ%3D","updated":"2012-07-05 01:27:53.000000000","message":"Done","commit_id":"641bf94a90ff8e7b957cc4b8d02f8620d7a3921a"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"32a684b821dd90fbd7d8639e21d7db807491b319","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if code in [401, 403]:"},{"line_number":94,"context_line":"            raise AuthenticationException()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if ignore_result_body:"},{"line_number":97,"context_line":"            response.read()"},{"line_number":98,"context_line":"        return response"},{"line_number":99,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAKH%2F%2F%2FCY%3D","line":96,"updated":"2012-07-05 20:38:31.000000000","message":"It would be wise to put your explanation in here as a comment. If I have to ask what it does, it needs work :)","commit_id":"0f84125f6ff621afbb53e3db7f2f392ab2d94054"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"cd150a401299797bfdd5cdd2049adbdece4dd5ce","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if code in [401, 403]:"},{"line_number":94,"context_line":"            raise AuthenticationException()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        if ignore_result_body:"},{"line_number":97,"context_line":"            response.read()"},{"line_number":98,"context_line":"        return response"},{"line_number":99,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAKH%2F%2F%2B%2BQ%3D","line":96,"in_reply_to":"AAAAKH%2F%2F%2FCY%3D","updated":"2012-07-05 21:11:47.000000000","message":"Done","commit_id":"0f84125f6ff621afbb53e3db7f2f392ab2d94054"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"32a684b821dd90fbd7d8639e21d7db807491b319","unresolved":false,"context_lines":[{"line_number":625,"context_line":"    if options.syslog:"},{"line_number":626,"context_line":"        try:"},{"line_number":627,"context_line":"            facility \u003d getattr(logging.handlers.SysLogHandler,"},{"line_number":628,"context_line":"                               options.syslog_log_facility)"},{"line_number":629,"context_line":"        except AttributeError:"},{"line_number":630,"context_line":"            raise ValueError(_(\"Invalid syslog facility\"))"},{"line_number":631,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAKH%2F%2F%2FB8%3D","line":628,"updated":"2012-07-05 20:38:31.000000000","message":"This option doesn\u0027t exist.","commit_id":"0f84125f6ff621afbb53e3db7f2f392ab2d94054"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"cd150a401299797bfdd5cdd2049adbdece4dd5ce","unresolved":false,"context_lines":[{"line_number":625,"context_line":"    if options.syslog:"},{"line_number":626,"context_line":"        try:"},{"line_number":627,"context_line":"            facility \u003d getattr(logging.handlers.SysLogHandler,"},{"line_number":628,"context_line":"                               options.syslog_log_facility)"},{"line_number":629,"context_line":"        except AttributeError:"},{"line_number":630,"context_line":"            raise ValueError(_(\"Invalid syslog facility\"))"},{"line_number":631,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAKH%2F%2F%2B%2BI%3D","line":628,"in_reply_to":"AAAAKH%2F%2F%2FB8%3D","updated":"2012-07-05 21:11:47.000000000","message":"Done","commit_id":"0f84125f6ff621afbb53e3db7f2f392ab2d94054"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        params \u003d {\u0027is_public\u0027: None}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        while True:"},{"line_number":112,"context_line":"            url \u003d \u0027v1/images/detail\u0027"},{"line_number":113,"context_line":"            query \u003d urllib.urlencode(params)"},{"line_number":114,"context_line":"            if query:"},{"line_number":115,"context_line":"                url +\u003d \u0027?%s\u0027 % query"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FsY%3D","line":112,"updated":"2012-07-09 10:17:32.000000000","message":"This is fine for now, but there may be some worth in thinking about transitioning to the v2 API at some point in the future.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    total_size \u003d 0"},{"line_number":237,"context_line":"    count \u003d 0"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    client \u003d ImageService(httplib.HTTPConnection(server, port),"},{"line_number":240,"context_line":"                              options.token)"},{"line_number":241,"context_line":"    for image in client.get_images():"},{"line_number":242,"context_line":"        logging.debug(_(\u0027Considering image: %(image)s\u0027) % {\u0027image\u0027: image})"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fsc%3D","line":239,"updated":"2012-07-09 10:17:32.000000000","message":"Have you thought about https suppport? (would require a bit of jiggery-pokery around cert handling, see glance/common/client.py)","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    total_size \u003d 0"},{"line_number":237,"context_line":"    count \u003d 0"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    client \u003d ImageService(httplib.HTTPConnection(server, port),"},{"line_number":240,"context_line":"                              options.token)"},{"line_number":241,"context_line":"    for image in client.get_images():"},{"line_number":242,"context_line":"        logging.debug(_(\u0027Considering image: %(image)s\u0027) % {\u0027image\u0027: image})"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FsA%3D","line":239,"in_reply_to":"AAAAKX%2F%2F%2Fsc%3D","updated":"2012-07-09 11:23:29.000000000","message":"I think this is something we should address in a later change to be honest. This is getting big enough that its hard to get it merged as is.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            # Remove keys which don\u0027t make sense for replication"},{"line_number":273,"context_line":"            for key in options.dontreplicate.split(\u0027 \u0027):"},{"line_number":274,"context_line":"                if key in image:"},{"line_number":275,"context_line":"                    del image[key]"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            # Dump glance information"},{"line_number":278,"context_line":"            f \u003d open(data_path, \u0027w\u0027)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fsg%3D","line":275,"updated":"2012-07-09 10:17:32.000000000","message":"I wonder should we only remove the dontreplicate headers at the point of upload?\n\n(to handle that case where a disjoint set of dontreplicate headers is specified to the load command)","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            # Remove keys which don\u0027t make sense for replication"},{"line_number":273,"context_line":"            for key in options.dontreplicate.split(\u0027 \u0027):"},{"line_number":274,"context_line":"                if key in image:"},{"line_number":275,"context_line":"                    del image[key]"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            # Dump glance information"},{"line_number":278,"context_line":"            f \u003d open(data_path, \u0027w\u0027)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fr8%3D","line":275,"in_reply_to":"AAAAKX%2F%2F%2Fsg%3D","updated":"2012-07-09 11:23:29.000000000","message":"Hmmmm. I hadn\u0027t thought of that. Done.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            # Dump glance information"},{"line_number":278,"context_line":"            f \u003d open(data_path, \u0027w\u0027)"},{"line_number":279,"context_line":"            f.write(json.dumps(image))"},{"line_number":280,"context_line":"            f.close()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"            if image[\u0027status\u0027] \u003d\u003d \u0027active\u0027 and not options.metaonly:"},{"line_number":283,"context_line":"                # Now fetch the image. The metadata returned in headers here"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fsk%3D","line":280,"updated":"2012-07-09 10:17:32.000000000","message":"Neater to use with?","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            # Dump glance information"},{"line_number":278,"context_line":"            f \u003d open(data_path, \u0027w\u0027)"},{"line_number":279,"context_line":"            f.write(json.dumps(image))"},{"line_number":280,"context_line":"            f.close()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"            if image[\u0027status\u0027] \u003d\u003d \u0027active\u0027 and not options.metaonly:"},{"line_number":283,"context_line":"                # Now fetch the image. The metadata returned in headers here"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fr4%3D","line":280,"in_reply_to":"AAAAKX%2F%2F%2Fsk%3D","updated":"2012-07-09 11:23:29.000000000","message":"I don\u0027t have a strong opinion either way there -- I think this is clear, but if glance code generally uses with then I\u0027ll change it.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                              options.token)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    for ent in os.listdir(path):"},{"line_number":341,"context_line":"        if len(ent) \u003d\u003d 36:"},{"line_number":342,"context_line":"            uuid \u003d ent"},{"line_number":343,"context_line":"            logging.info(_(\u0027Considering: %s\u0027) % uuid)"},{"line_number":344,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fso%3D","line":341,"updated":"2012-07-09 10:17:32.000000000","message":"Is length a sufficient check for UUID-likeness?\n\nnova/utils.py has:\n\n  def is_uuid_like(val):\n    \"\"\"For our purposes, a UUID is a string in canonical form:\n\n        aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\n    \"\"\"\n    try:\n        uuid.UUID(val)\n        return True\n    except (TypeError, ValueError, AttributeError):\n        return False","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                              options.token)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    for ent in os.listdir(path):"},{"line_number":341,"context_line":"        if len(ent) \u003d\u003d 36:"},{"line_number":342,"context_line":"            uuid \u003d ent"},{"line_number":343,"context_line":"            logging.info(_(\u0027Considering: %s\u0027) % uuid)"},{"line_number":344,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fr0%3D","line":341,"in_reply_to":"AAAAKX%2F%2F%2Fso%3D","updated":"2012-07-09 11:23:29.000000000","message":"Good point. I even knew about that method, but I didn\u0027t think of using it here. The only catch is that we\u0027re trying to decrease dependancies for this, so I\u0027ve cut and pasted the is_uuid_like code into here instead of linking against utils.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                if _dict_diff(meta, headers):"},{"line_number":360,"context_line":"                    logging.info(_(\u0027... metadata has changed\u0027))"},{"line_number":361,"context_line":"                    headers, body \u003d client.add_image_meta(meta)"},{"line_number":362,"context_line":"                    _check_upload_response_headers(headers, body)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            else:"},{"line_number":365,"context_line":"                if not os.path.exists(os.path.join(path, uuid + \u0027.img\u0027)):"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fs0%3D","line":362,"updated":"2012-07-09 10:17:32.000000000","message":"I\u0027m a bit confused by the logic here. By removing the dontreplicate headers first (line 357 above), aren\u0027t you pretty much guaranteeing that that _dict_diff(meta, headers) is always true?\n\n(assuming that meta contains the full set of image metadata)","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                if _dict_diff(meta, headers):"},{"line_number":360,"context_line":"                    logging.info(_(\u0027... metadata has changed\u0027))"},{"line_number":361,"context_line":"                    headers, body \u003d client.add_image_meta(meta)"},{"line_number":362,"context_line":"                    _check_upload_response_headers(headers, body)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            else:"},{"line_number":365,"context_line":"                if not os.path.exists(os.path.join(path, uuid + \u0027.img\u0027)):"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Frk%3D","line":362,"in_reply_to":"AAAAKX%2F%2F%2Fs0%3D","updated":"2012-07-09 11:23:29.000000000","message":"The diff is one way... i.e. it only checks that keys in the origin dictionary against the destination, not the reverse.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                # Upload the image itself"},{"line_number":370,"context_line":"                img_file \u003d open(os.path.join(path, uuid + \u0027.img\u0027))"},{"line_number":371,"context_line":"                headers, body \u003d client.add_image(meta, img_file)"},{"line_number":372,"context_line":"                img_file.close()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"                _check_upload_response_headers(headers, body)"},{"line_number":375,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fs4%3D","line":372,"updated":"2012-07-09 10:17:32.000000000","message":"Neater using the with statement?\n\n  with open(os.path.join(path, uuid + \u0027.img\u0027)) as img_file:\n      headers, body \u003d client.add_image(meta, img_file)\n\nSimilar comment through-out on file handling code.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                # Upload the image itself"},{"line_number":370,"context_line":"                img_file \u003d open(os.path.join(path, uuid + \u0027.img\u0027))"},{"line_number":371,"context_line":"                headers, body \u003d client.add_image(meta, img_file)"},{"line_number":372,"context_line":"                img_file.close()"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"                _check_upload_response_headers(headers, body)"},{"line_number":375,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fqw%3D","line":372,"in_reply_to":"AAAAKX%2F%2F%2Fs4%3D","updated":"2012-07-09 11:23:29.000000000","message":"As I said above, I\u0027m happy enough to move these to with statements if you\u0027d like, but I wont get to it until tomorrow. Let me know either way.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                headers, body \u003d slave_client.add_image_meta(image)"},{"line_number":413,"context_line":"                _check_upload_response_headers(headers, body)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":416,"context_line":"            logging.info(_(\u0027%s is being synced\u0027) % image[\u0027id\u0027])"},{"line_number":417,"context_line":"            if not options.metaonly:"},{"line_number":418,"context_line":"                image_response \u003d master_client.get_image(image[\u0027id\u0027])"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fsw%3D","line":415,"updated":"2012-07-09 10:17:32.000000000","message":"A non-active image that\u0027s already known to the slave has its meta-data synch\u0027d, whereas a new non-active image is not replicated at all.\n\nIs that consistent?\n\nIs the logic that the non-active image could not be known to the slave, as it would never have been replicated in the first place? Does this apply if the image was replicated out-of-band, or has transitioned from active to some other state?","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                headers, body \u003d slave_client.add_image_meta(image)"},{"line_number":413,"context_line":"                _check_upload_response_headers(headers, body)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":416,"context_line":"            logging.info(_(\u0027%s is being synced\u0027) % image[\u0027id\u0027])"},{"line_number":417,"context_line":"            if not options.metaonly:"},{"line_number":418,"context_line":"                image_response \u003d master_client.get_image(image[\u0027id\u0027])"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fq0%3D","line":415,"in_reply_to":"AAAAKX%2F%2F%2Fsw%3D","updated":"2012-07-09 11:23:29.000000000","message":"There are a few cases:\n\n- there is an active image on the master which isn\u0027t present on the slave. Copy it. (implemented)\n\n- there is an inactive image on the master which is present and active on the slave. Deactivate the slave copy. (implemented)\n\n- there is an active image on the master, but an inactive image on the slave. Do not re-enable the slave, as someone must have deactivated it for a reason in some out-of-band manner. (was incorrect, now fixed)","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":457,"context_line":"                                      \u0027key\u0027: key,"},{"line_number":458,"context_line":"                                      \u0027master_value\u0027: image[key],"},{"line_number":459,"context_line":"                                      \u0027slave_value\u0027: headers.get(key,"},{"line_number":460,"context_line":"                                                                 \u0027undefined\u0027)})"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":463,"context_line":"            logging.info(_(\u0027%s: entirely missing from the destination\u0027)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fss%3D","line":460,"updated":"2012-07-09 10:17:32.000000000","message":"Would it make sense to have an else clause to report identical images? (maybe just in verbose mode)","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":457,"context_line":"                                      \u0027key\u0027: key,"},{"line_number":458,"context_line":"                                      \u0027master_value\u0027: image[key],"},{"line_number":459,"context_line":"                                      \u0027slave_value\u0027: headers.get(key,"},{"line_number":460,"context_line":"                                                                 \u0027undefined\u0027)})"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"        elif image[\u0027status\u0027] \u003d\u003d \u0027active\u0027:"},{"line_number":463,"context_line":"            logging.info(_(\u0027%s: entirely missing from the destination\u0027)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FrM%3D","line":460,"in_reply_to":"AAAAKX%2F%2F%2Fss%3D","updated":"2012-07-09 11:23:29.000000000","message":"Done","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    args: the command line"},{"line_number":531,"context_line":"    \"\"\""},{"line_number":532,"context_line":"    if len(args) !\u003d 1:"},{"line_number":533,"context_line":"        sys.exit(\"Please specify a command\")"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    parser \u003d options.__parser"},{"line_number":536,"context_line":"    command_name \u003d args.pop()"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FtA%3D","line":533,"updated":"2012-07-09 10:17:32.000000000","message":"On its own:\n\n  bin/glance-replicator help\n\nthe help command should display all the commands available (i.e. not just \"Please specify a command\")","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    args: the command line"},{"line_number":531,"context_line":"    \"\"\""},{"line_number":532,"context_line":"    if len(args) !\u003d 1:"},{"line_number":533,"context_line":"        sys.exit(\"Please specify a command\")"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    parser \u003d options.__parser"},{"line_number":536,"context_line":"    command_name \u003d args.pop()"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FrY%3D","line":533,"in_reply_to":"AAAAKX%2F%2F%2FtA%3D","updated":"2012-07-09 11:23:29.000000000","message":"Done","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        parser.print_usage()"},{"line_number":568,"context_line":"        sys.exit(_(\"Unknown command: %s\") % command_name)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    return command"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Fs8%3D","line":570,"updated":"2012-07-09 10:17:32.000000000","message":"Could any code such as the above that\u0027s been copied from bin/glance simply be promoted to a bin/utils.py module to allow sharing between the scripts?","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        parser.print_usage()"},{"line_number":568,"context_line":"        sys.exit(_(\"Unknown command: %s\") % command_name)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    return command"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Frc%3D","line":570,"in_reply_to":"AAAAKX%2F%2F%2Fs8%3D","updated":"2012-07-09 11:23:29.000000000","message":"bcwaldon has been very keen to basically eliminate the dependencies of this script on any glance code. So, if we\u0027re willing to bend that rule then sure. Otherwise, its like this.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        handler \u003d logging.handlers.SysLogHandler(address\u003d\u0027/dev/log\u0027)"},{"line_number":631,"context_line":"    elif options.logfile:"},{"line_number":632,"context_line":"        handler \u003d logging.handlers.WatchedFileHandler(options.logfile)"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    else:"},{"line_number":635,"context_line":"        handler \u003d logging.StreamHandler(sys.stdout)"},{"line_number":636,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2FtI%3D","line":633,"updated":"2012-07-09 10:17:32.000000000","message":"Stray blank line.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        handler \u003d logging.handlers.SysLogHandler(address\u003d\u0027/dev/log\u0027)"},{"line_number":631,"context_line":"    elif options.logfile:"},{"line_number":632,"context_line":"        handler \u003d logging.handlers.WatchedFileHandler(options.logfile)"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    else:"},{"line_number":635,"context_line":"        handler \u003d logging.StreamHandler(sys.stdout)"},{"line_number":636,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAKX%2F%2F%2Frg%3D","line":633,"in_reply_to":"AAAAKX%2F%2F%2FtI%3D","updated":"2012-07-09 11:23:29.000000000","message":"Done","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"}],"glance/tests/unit/test_glance_replicator.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"1220adeb8c8e33f8e89edb7d2da7603ad9834f75","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        return FakeResponse(self.reqs[self.last_req])"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"class ImageServiceTestCase(test_utils.BaseTestCase):"},{"line_number":134,"context_line":"    def test_rest_get_images(self):"},{"line_number":135,"context_line":"        c \u003d glance_replicator.ImageService(FakeHTTPConnection(), \u0027noauth\u0027)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAKX%2F%2F%2FsQ%3D","line":133,"updated":"2012-07-09 10:17:32.000000000","message":"So this is just exercising the ImageService code in bin/glance-replicator, not the command logic around that, right?\n\nMight be worth extending the test coverage in that direction.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"13a67ec4078c8f4a316307ce104047fc23efa4f7","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        return FakeResponse(self.reqs[self.last_req])"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"class ImageServiceTestCase(test_utils.BaseTestCase):"},{"line_number":134,"context_line":"    def test_rest_get_images(self):"},{"line_number":135,"context_line":"        c \u003d glance_replicator.ImageService(FakeHTTPConnection(), \u0027noauth\u0027)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAKX%2F%2F%2Fqs%3D","line":133,"in_reply_to":"AAAAKX%2F%2F%2FsQ%3D","updated":"2012-07-09 11:23:29.000000000","message":"Yeah, I feel the same way. However, I\u0027ve been getting push back about the size of this review already, so I figured I\u0027d add that in a later review.","commit_id":"c5978d44661bb9e8bbd2784d25da882e06fa916c"}]}
