)]}'
{"nova/compute/imagecache.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c757cde4adb24acf12587bf78cbc5933b7a4b5b4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    # right length to be disk images."},{"line_number":64,"context_line":"    cached_images \u003d []"},{"line_number":65,"context_line":"    for ent in os.listdir(base_dir):"},{"line_number":66,"context_line":"        if len(ent) \u003d\u003d 40 or len(ent) \u003d\u003d 43:"},{"line_number":67,"context_line":"            entpath \u003d os.path.join(base_dir, ent)"},{"line_number":68,"context_line":"            if os.path.isfile(entpath):"},{"line_number":69,"context_line":"                cached_images.append(entpath)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F20%3D","line":66,"updated":"2012-01-09 11:16:11.000000000","message":"maybe use hashlib.sha1().digestsize*2 ?","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    # right length to be disk images."},{"line_number":64,"context_line":"    cached_images \u003d []"},{"line_number":65,"context_line":"    for ent in os.listdir(base_dir):"},{"line_number":66,"context_line":"        if len(ent) \u003d\u003d 40 or len(ent) \u003d\u003d 43:"},{"line_number":67,"context_line":"            entpath \u003d os.path.join(base_dir, ent)"},{"line_number":68,"context_line":"            if os.path.isfile(entpath):"},{"line_number":69,"context_line":"                cached_images.append(entpath)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Fr8%3D","line":66,"in_reply_to":"AAAAD3%2F%2F%2F20%3D","updated":"2012-01-09 21:53:07.000000000","message":"Done","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c757cde4adb24acf12587bf78cbc5933b7a4b5b4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    for instance in instances:"},{"line_number":77,"context_line":"        local, remote, instances \u003d used_images.get(str(instance[\u0027image_ref\u0027]),"},{"line_number":78,"context_line":"                                                   (0, 0, []))"},{"line_number":79,"context_line":"        if instance[\u0027host\u0027] \u003d\u003d socket.gethostname():"},{"line_number":80,"context_line":"            local +\u003d 1"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            remote +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F2w%3D","line":79,"updated":"2012-01-09 11:16:11.000000000","message":"I\u0027d suggest moving gethostname() outside the loop","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    for instance in instances:"},{"line_number":77,"context_line":"        local, remote, instances \u003d used_images.get(str(instance[\u0027image_ref\u0027]),"},{"line_number":78,"context_line":"                                                   (0, 0, []))"},{"line_number":79,"context_line":"        if instance[\u0027host\u0027] \u003d\u003d socket.gethostname():"},{"line_number":80,"context_line":"            local +\u003d 1"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            remote +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Frw%3D","line":79,"in_reply_to":"AAAAD3%2F%2F%2F1c%3D","updated":"2012-01-09 21:53:07.000000000","message":"Done","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    for instance in instances:"},{"line_number":77,"context_line":"        local, remote, instances \u003d used_images.get(str(instance[\u0027image_ref\u0027]),"},{"line_number":78,"context_line":"                                                   (0, 0, []))"},{"line_number":79,"context_line":"        if instance[\u0027host\u0027] \u003d\u003d socket.gethostname():"},{"line_number":80,"context_line":"            local +\u003d 1"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            remote +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Fr0%3D","line":79,"in_reply_to":"AAAAD3%2F%2F%2F2w%3D","updated":"2012-01-09 21:53:07.000000000","message":"I\u0027ll move to the flag...","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5b3d525821f4748dacff5cf5820d9f85e25e750d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    for instance in instances:"},{"line_number":77,"context_line":"        local, remote, instances \u003d used_images.get(str(instance[\u0027image_ref\u0027]),"},{"line_number":78,"context_line":"                                                   (0, 0, []))"},{"line_number":79,"context_line":"        if instance[\u0027host\u0027] \u003d\u003d socket.gethostname():"},{"line_number":80,"context_line":"            local +\u003d 1"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            remote +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F1c%3D","line":79,"in_reply_to":"AAAAD3%2F%2F%2F2w%3D","updated":"2012-01-09 15:15:14.000000000","message":"or just using FLAGS.host :)","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c757cde4adb24acf12587bf78cbc5933b7a4b5b4","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                \u0027image verification failed\u0027),"},{"line_number":128,"context_line":"                              {\u0027container_format\u0027: img[\u0027container_format\u0027],"},{"line_number":129,"context_line":"                               \u0027id\u0027: img[\u0027id\u0027],"},{"line_number":130,"context_line":"                               \u0027base_file\u0027: base_file})"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"            else:"},{"line_number":133,"context_line":"                LOG.debug(_(\u0027%(container_format)s-%(id)s (%(base_file)s): \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F2s%3D","line":130,"updated":"2012-01-09 11:16:11.000000000","message":"Shouldn\u0027t this condition warrant more than debug?","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                \u0027image verification failed\u0027),"},{"line_number":128,"context_line":"                              {\u0027container_format\u0027: img[\u0027container_format\u0027],"},{"line_number":129,"context_line":"                               \u0027id\u0027: img[\u0027id\u0027],"},{"line_number":130,"context_line":"                               \u0027base_file\u0027: base_file})"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"            else:"},{"line_number":133,"context_line":"                LOG.debug(_(\u0027%(container_format)s-%(id)s (%(base_file)s): \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Fro%3D","line":130,"in_reply_to":"AAAAD3%2F%2F%2F2s%3D","updated":"2012-01-09 21:53:07.000000000","message":"Done","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"88373d1daebfe6bb39429846638a19c780bc0f12","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                  \u0027should unused base images be removed?\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def VerifyBaseImages(context):"},{"line_number":52,"context_line":"    base_dir \u003d os.path.join(FLAGS.instances_path, \u0027_base\u0027)"},{"line_number":53,"context_line":"    if not os.path.exists(base_dir):"},{"line_number":54,"context_line":"        LOG.debug(_(\u0027Skipping verification, no base directory at %s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAD3%2F%2F%2FQc%3D","line":51,"updated":"2012-01-10 22:31:22.000000000","message":"can you use verify_base_images?  This looks like a Class.\n\nAlso, this is kind of a large nasty function. If it is reasonable you should break it up a bit. That will also make it easier to test.","commit_id":"7a97bd3d4335943b6351c207e835b78431600f26"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"27c2e088a55d99736cc5ecc81c9079f2fed3b66d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                  \u0027should unused base images be removed?\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def VerifyBaseImages(context):"},{"line_number":52,"context_line":"    base_dir \u003d os.path.join(FLAGS.instances_path, \u0027_base\u0027)"},{"line_number":53,"context_line":"    if not os.path.exists(base_dir):"},{"line_number":54,"context_line":"        LOG.debug(_(\u0027Skipping verification, no base directory at %s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAD3%2F%2F%2FFw%3D","line":51,"in_reply_to":"AAAAD3%2F%2F%2FQc%3D","updated":"2012-01-11 09:39:54.000000000","message":"I\u0027ve renamed this, broken this method up and added some unit tests. You\u0027ll see those in the next upload. I haven\u0027t had time to go for 100% unit test coverage, but its a lot better than it was yesterday.","commit_id":"7a97bd3d4335943b6351c207e835b78431600f26"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e767e5ae8d4366dbe8b1583a74ac7a6c0bf28e37","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.corrupt_base_files \u003d []"},{"line_number":310,"context_line":"        self.removable_base_files \u003d []"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        images \u003d image_service.detail(context)"},{"line_number":313,"context_line":"        for img in images:"},{"line_number":314,"context_line":"            if img[\u0027container_format\u0027] !\u003d \u0027ami\u0027:"},{"line_number":315,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2BfI%3D","line":312,"updated":"2012-01-12 23:17:26.000000000","message":"By default, this will only return a single page of images. You will want to pass in a high limit parameter here to return a larger number of images. Something like this:\n\n images \u003d image_service.detail(context, limit\u003d1000)\n\nwould work.\n\nAlternately, you would have a page through multiple requests to image_service.detail(), passing in marker\u003d\u003cID\u003e.","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"a8e2f5d53d426220522a8e0b47531682da78c00b","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.corrupt_base_files \u003d []"},{"line_number":310,"context_line":"        self.removable_base_files \u003d []"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        images \u003d image_service.detail(context)"},{"line_number":313,"context_line":"        for img in images:"},{"line_number":314,"context_line":"            if img[\u0027container_format\u0027] !\u003d \u0027ami\u0027:"},{"line_number":315,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2BcA%3D","line":312,"in_reply_to":"AAAAD3%2F%2F%2BfI%3D","updated":"2012-01-13 02:26:04.000000000","message":"Done","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e767e5ae8d4366dbe8b1583a74ac7a6c0bf28e37","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        # Elements remaining in unexplained_images are not currently in"},{"line_number":323,"context_line":"        # glance. That doesn\u0027t mean that they\u0027re really not in use though"},{"line_number":324,"context_line":"        # (consider images which have been removed from glance but are still"},{"line_number":325,"context_line":"        # used by in use instances). So, we check the backing file for any"},{"line_number":326,"context_line":"        # running instances as well."},{"line_number":327,"context_line":"        if self.unexplained_images:"},{"line_number":328,"context_line":"            inuse_backing_images \u003d self._list_backing_images()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2BfE%3D","line":325,"updated":"2012-01-12 23:17:26.000000000","message":"s/used by in use/used by/","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"a8e2f5d53d426220522a8e0b47531682da78c00b","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        # Elements remaining in unexplained_images are not currently in"},{"line_number":323,"context_line":"        # glance. That doesn\u0027t mean that they\u0027re really not in use though"},{"line_number":324,"context_line":"        # (consider images which have been removed from glance but are still"},{"line_number":325,"context_line":"        # used by in use instances). So, we check the backing file for any"},{"line_number":326,"context_line":"        # running instances as well."},{"line_number":327,"context_line":"        if self.unexplained_images:"},{"line_number":328,"context_line":"            inuse_backing_images \u003d self._list_backing_images()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2Bb8%3D","line":325,"in_reply_to":"AAAAD3%2F%2F%2BfE%3D","updated":"2012-01-13 02:26:04.000000000","message":"Done","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2dc82f0ea07b43cf6f68eb7457793b7e209e4dc7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"from nova import image"},{"line_number":37,"context_line":"from nova import log as logging"},{"line_number":38,"context_line":"from nova import utils"},{"line_number":39,"context_line":"from nova.virt.libvirt import utils as virtutils"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"LOG \u003d logging.getLogger(\u0027nova.compute.imagecache\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAD3%2F%2F9%2FU%3D","line":39,"updated":"2012-01-16 04:32:35.000000000","message":"I\u0027m not a fan of having common code that depends on a specific implementation\u0027s utility module. Would it make sense to pull out the nova.virt.libvirt.utils.get_disk_backing_file up into a common place, too?","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"447fbf752c69e4c4a5d3917bed25e9c75502c196","unresolved":false,"context_lines":[{"line_number":36,"context_line":"from nova import image"},{"line_number":37,"context_line":"from nova import log as logging"},{"line_number":38,"context_line":"from nova import utils"},{"line_number":39,"context_line":"from nova.virt.libvirt import utils as virtutils"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"LOG \u003d logging.getLogger(\u0027nova.compute.imagecache\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAEH%2F%2F84Y%3D","line":39,"in_reply_to":"AAAAD3%2F%2F9%2FU%3D","updated":"2012-01-31 10:44:24.000000000","message":"So, I\u0027ve spent a bunch of time reading the code around this, and only the libvirt driver is going to benefit from the cache cleanup code... The other drivers don\u0027t use a cache in _base. I\u0027m going to refactor this so that drivers can provide a cleaner, and then that get\u0027s called by the scheduled task. You\u0027ll see this in patchset 8 when I upload it.","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2dc82f0ea07b43cf6f68eb7457793b7e209e4dc7","unresolved":false,"context_lines":[{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        # There might be more than one page of images in glance, especially"},{"line_number":316,"context_line":"        # on larger installations"},{"line_number":317,"context_line":"        limit \u003d FLAGS.image_service_fetch_size"},{"line_number":318,"context_line":"        images \u003d image_service.detail(context, limit\u003dlimit)"},{"line_number":319,"context_line":"        more_images \u003d image_service.detail(context,"},{"line_number":320,"context_line":"                                           marker\u003dimages[-1][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAD3%2F%2F9%2FQ%3D","line":317,"updated":"2012-01-16 04:32:35.000000000","message":"Pagination is actually handled for you in GlanceImageService._fetch_images. You don\u0027t need to handle it manually here. You might as well get rid of the image_service_fetch_size flag, too.","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"447fbf752c69e4c4a5d3917bed25e9c75502c196","unresolved":false,"context_lines":[{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        # There might be more than one page of images in glance, especially"},{"line_number":316,"context_line":"        # on larger installations"},{"line_number":317,"context_line":"        limit \u003d FLAGS.image_service_fetch_size"},{"line_number":318,"context_line":"        images \u003d image_service.detail(context, limit\u003dlimit)"},{"line_number":319,"context_line":"        more_images \u003d image_service.detail(context,"},{"line_number":320,"context_line":"                                           marker\u003dimages[-1][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAEH%2F%2F838%3D","line":317,"in_reply_to":"AAAAD3%2F%2F9%2FQ%3D","updated":"2012-01-31 10:44:24.000000000","message":"Done","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"}],"nova/compute/manager.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e767e5ae8d4366dbe8b1583a74ac7a6c0bf28e37","unresolved":false,"context_lines":[{"line_number":93,"context_line":"flags.DEFINE_integer(\"running_deleted_instance_poll_interval\", 30,"},{"line_number":94,"context_line":"                     \"Number of periodic scheduler ticks to wait between\""},{"line_number":95,"context_line":"                     \" runs of the cleanup task.\")"},{"line_number":96,"context_line":"flags.DEFINE_integer(\"image_cache_manager_interval\", 30,"},{"line_number":97,"context_line":"                     \"Number of periodic scheduler ticks to wait between\""},{"line_number":98,"context_line":"                     \" runs of the image cache manager.\")"},{"line_number":99,"context_line":"flags.DEFINE_string(\"running_deleted_instance_action\", \"noop\","}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2BfA%3D","line":96,"updated":"2012-01-12 23:17:26.000000000","message":"I\u0027d recommend much higher than 30 here. I think something like 3600 would be more appropriate for a non-essential cleanup job.","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"a8e2f5d53d426220522a8e0b47531682da78c00b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"flags.DEFINE_integer(\"running_deleted_instance_poll_interval\", 30,"},{"line_number":94,"context_line":"                     \"Number of periodic scheduler ticks to wait between\""},{"line_number":95,"context_line":"                     \" runs of the cleanup task.\")"},{"line_number":96,"context_line":"flags.DEFINE_integer(\"image_cache_manager_interval\", 30,"},{"line_number":97,"context_line":"                     \"Number of periodic scheduler ticks to wait between\""},{"line_number":98,"context_line":"                     \" runs of the image cache manager.\")"},{"line_number":99,"context_line":"flags.DEFINE_string(\"running_deleted_instance_action\", \"noop\","}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAD3%2F%2F%2BcI%3D","line":96,"in_reply_to":"AAAAD3%2F%2F%2BfA%3D","updated":"2012-01-13 02:26:04.000000000","message":"Done","commit_id":"ada93b7d0efa6cc3940b4103cb04ad914bcd5be4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b18f0e08a0826a688dbdc52f89e30b15e246411a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    cfg.IntOpt(\"image_cache_manager_interval\","},{"line_number":113,"context_line":"               default\u003d3600,"},{"line_number":114,"context_line":"               help\u003d\"Number of periodic scheduler ticks to wait between \""},{"line_number":115,"context_line":"                    \" runs of the image cache manager.\"),"},{"line_number":116,"context_line":"    ]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"FLAGS \u003d flags.FLAGS"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2Fos%3D","line":115,"updated":"2012-02-02 21:09:23.000000000","message":"femto-nit... you don\u0027t need the extra space at the beginning of this string...","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"265a851694b84086f579508112bcfc1d7d606b1c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    cfg.IntOpt(\"image_cache_manager_interval\","},{"line_number":113,"context_line":"               default\u003d3600,"},{"line_number":114,"context_line":"               help\u003d\"Number of periodic scheduler ticks to wait between \""},{"line_number":115,"context_line":"                    \" runs of the image cache manager.\"),"},{"line_number":116,"context_line":"    ]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"FLAGS \u003d flags.FLAGS"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2FnY%3D","line":115,"in_reply_to":"AAAAEn%2F%2F%2Fos%3D","updated":"2012-02-02 21:13:48.000000000","message":"Done","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b18f0e08a0826a688dbdc52f89e30b15e246411a","unresolved":false,"context_lines":[{"line_number":2279,"context_line":""},{"line_number":2280,"context_line":"        try:"},{"line_number":2281,"context_line":"            self.driver.manage_image_cache(context)"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"        except NotImplementedError:"},{"line_number":2284,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2Foo%3D","line":2282,"updated":"2012-02-02 21:09:23.000000000","message":"pep8 will cry about extra newline here...","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"265a851694b84086f579508112bcfc1d7d606b1c","unresolved":false,"context_lines":[{"line_number":2279,"context_line":""},{"line_number":2280,"context_line":"        try:"},{"line_number":2281,"context_line":"            self.driver.manage_image_cache(context)"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"        except NotImplementedError:"},{"line_number":2284,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2FnM%3D","line":2282,"in_reply_to":"AAAAEn%2F%2F%2Foo%3D","updated":"2012-02-02 21:13:48.000000000","message":"Done","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":475,"name":"Rick Harris","email":"rick.harris@rackspace.com","username":"rconradharris"},"change_message_id":"61643da93a9776fcc9cb5079f69610b609bd7ac0","unresolved":false,"context_lines":[{"line_number":109,"context_line":"               help\u003d\"Action to take if a running deleted instance is detected.\""},{"line_number":110,"context_line":"                    \"Valid options are \u0027noop\u0027, \u0027log\u0027 and \u0027reap\u0027. \""},{"line_number":111,"context_line":"                    \"Set to \u0027noop\u0027 to disable.\"),"},{"line_number":112,"context_line":"    cfg.IntOpt(\"image_cache_manager_interval\","},{"line_number":113,"context_line":"               default\u003d3600,"},{"line_number":114,"context_line":"               help\u003d\"Number of periodic scheduler ticks to wait between \""},{"line_number":115,"context_line":"                    \"runs of the image cache manager.\"),"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAEn%2F%2F%2Fho%3D","line":112,"updated":"2012-02-02 22:02:32.000000000","message":"Do we need a way here to turn off the image_cache_manager?\n\nFor example, should we be able to set the interval to -1 to turnoff the periodic task, or have a separate flag like `image_cache_manager_enabled`.\n\nAlso, I\u0027m wondering if we should disable the cache manager by default.","commit_id":"faa31d081a7ef9ec459cc892caa18d2b1ee4c26a"}],"nova/tests/test_imagecache.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"6e3ce9f4ecf624adc294904a77d71ae8616277a4","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            self.assertEquals(res, None)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        finally:"},{"line_number":211,"context_line":"            os.remove(fname)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_remove_base_file(self):"},{"line_number":214,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAD3%2F%2F%2FE8%3D","line":211,"updated":"2012-01-11 11:02:26.000000000","message":"what about: os.remove(\u0027%s.sha1\u0027 % fname),\nthough since there are multiple files here and to avoid dealing with ENOENT perhaps it would be better to use:\n\ntry:\n    tmpdir \u003d tempfile.mkdtemp()\n    ...\nfinally:\n    shutil.rmtree(tmpdir)","commit_id":"17c3d4267b958b4ca72d64c60343582d3754c260"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"0dedbac50d27277891d0009ae5d1bfd80a1edca3","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            self.assertEquals(res, None)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        finally:"},{"line_number":211,"context_line":"            os.remove(fname)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_remove_base_file(self):"},{"line_number":214,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAD3%2F%2F%2Bzs%3D","line":211,"in_reply_to":"AAAAD3%2F%2F%2FE8%3D","updated":"2012-01-12 01:06:29.000000000","message":"Done","commit_id":"17c3d4267b958b4ca72d64c60343582d3754c260"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"6e3ce9f4ecf624adc294904a77d71ae8616277a4","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            try:"},{"line_number":242,"context_line":"                os.remove(\u0027%s.sha1\u0027 % fname)"},{"line_number":243,"context_line":"            except:"},{"line_number":244,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAD3%2F%2F%2FE4%3D","line":244,"updated":"2012-01-11 11:02:26.000000000","message":"tmpdir here too, possibly","commit_id":"17c3d4267b958b4ca72d64c60343582d3754c260"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"0dedbac50d27277891d0009ae5d1bfd80a1edca3","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            try:"},{"line_number":242,"context_line":"                os.remove(\u0027%s.sha1\u0027 % fname)"},{"line_number":243,"context_line":"            except:"},{"line_number":244,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAD3%2F%2F%2Bzo%3D","line":244,"in_reply_to":"AAAAD3%2F%2F%2FE4%3D","updated":"2012-01-12 01:06:29.000000000","message":"Done","commit_id":"17c3d4267b958b4ca72d64c60343582d3754c260"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b18f0e08a0826a688dbdc52f89e30b15e246411a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        inuse_images \u003d image_cache_manager._list_backing_images()"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        print \u0027\u003e\u003e Found \u003d %s\u0027 % found"},{"line_number":136,"context_line":"        print \u0027\u003e\u003e Inuse \u003d %s\u0027 % repr(inuse_images)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.assertEquals(inuse_images, [found])"},{"line_number":139,"context_line":"        self.assertEquals(len(image_cache_manager.unexplained_images), 0)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2FoY%3D","line":136,"updated":"2012-02-02 21:09:23.000000000","message":"The above debug lines should be removed.","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"265a851694b84086f579508112bcfc1d7d606b1c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        inuse_images \u003d image_cache_manager._list_backing_images()"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        print \u0027\u003e\u003e Found \u003d %s\u0027 % found"},{"line_number":136,"context_line":"        print \u0027\u003e\u003e Inuse \u003d %s\u0027 % repr(inuse_images)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.assertEquals(inuse_images, [found])"},{"line_number":139,"context_line":"        self.assertEquals(len(image_cache_manager.unexplained_images), 0)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2FnA%3D","line":136,"in_reply_to":"AAAAEn%2F%2F%2FoY%3D","updated":"2012-02-02 21:13:48.000000000","message":"Huh. Thanks. I\u0027d totally missed those.","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b18f0e08a0826a688dbdc52f89e30b15e246411a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        image_cache_manager \u003d imagecache.ImageCacheManager()"},{"line_number":147,"context_line":"        res \u003d list(image_cache_manager._find_base_file(base_dir, fingerprint))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        self.assertTrue(len(res) \u003d\u003d 0)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def test_find_base_file_small(self):"},{"line_number":152,"context_line":"        self.stubs.Set(os.path, \u0027exists\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2FoU%3D","line":149,"updated":"2012-02-02 21:09:23.000000000","message":"Note that you can also do:\n\n self.assertEqual(0, len(res))\n\nWhich some folks consider a bit cleaner...","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"265a851694b84086f579508112bcfc1d7d606b1c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        image_cache_manager \u003d imagecache.ImageCacheManager()"},{"line_number":147,"context_line":"        res \u003d list(image_cache_manager._find_base_file(base_dir, fingerprint))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        self.assertTrue(len(res) \u003d\u003d 0)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def test_find_base_file_small(self):"},{"line_number":152,"context_line":"        self.stubs.Set(os.path, \u0027exists\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAEn%2F%2F%2Fm8%3D","line":149,"in_reply_to":"AAAAEn%2F%2F%2FoU%3D","updated":"2012-02-02 21:13:48.000000000","message":"Done","commit_id":"f0478f159844ebf88fba2db2725f6a68c49df48d"}],"nova/utils.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c757cde4adb24acf12587bf78cbc5933b7a4b5b4","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"        checksum.update(data)"},{"line_number":1201,"context_line":"        data \u003d f.read(4096)"},{"line_number":1202,"context_line":"    f.close()"},{"line_number":1203,"context_line":"    return checksum.hexdigest()"},{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"@contextlib.contextmanager"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F28%3D","line":1203,"updated":"2012-01-09 11:16:11.000000000","message":"It could be written functionally as follows, but that\u0027s a personal taste,\nas the bottleneck should not be python loops here, but system call overhead.\nI would increase 4096 to 32768 though, as these are going to be large files.\n\nchecksum \u003d hashlib.sha1()\nwith open(target) as f:\n    any(map(checksum.update,iter(lambda: f.read(32768), \u0027\u0027)))\nreturn checksum.hexdigest()","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"        checksum.update(data)"},{"line_number":1201,"context_line":"        data \u003d f.read(4096)"},{"line_number":1202,"context_line":"    f.close()"},{"line_number":1203,"context_line":"    return checksum.hexdigest()"},{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"@contextlib.contextmanager"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Frk%3D","line":1203,"in_reply_to":"AAAAD3%2F%2F%2F28%3D","updated":"2012-01-09 21:53:07.000000000","message":"Done","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2dc82f0ea07b43cf6f68eb7457793b7e209e4dc7","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    return cache_info[\u0027data\u0027]"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":"def hash_file(target):"},{"line_number":1203,"context_line":"    \"\"\"Generate a hash for the contents of a file.\"\"\""},{"line_number":1204,"context_line":"    checksum \u003d hashlib.sha1()"},{"line_number":1205,"context_line":"    with open(target) as f:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAD3%2F%2F9%2FY%3D","line":1202,"updated":"2012-01-16 04:32:35.000000000","message":"Please add a test for this function. It might make sense to pass in a file-like object rather than a file name to make the testing simpler.","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"447fbf752c69e4c4a5d3917bed25e9c75502c196","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    return cache_info[\u0027data\u0027]"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":"def hash_file(target):"},{"line_number":1203,"context_line":"    \"\"\"Generate a hash for the contents of a file.\"\"\""},{"line_number":1204,"context_line":"    checksum \u003d hashlib.sha1()"},{"line_number":1205,"context_line":"    with open(target) as f:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAEH%2F%2F834%3D","line":1202,"in_reply_to":"AAAAD3%2F%2F9%2FY%3D","updated":"2012-01-31 10:44:24.000000000","message":"Done","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2dc82f0ea07b43cf6f68eb7457793b7e209e4dc7","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Generate a hash for the contents of a file.\"\"\""},{"line_number":1204,"context_line":"    checksum \u003d hashlib.sha1()"},{"line_number":1205,"context_line":"    with open(target) as f:"},{"line_number":1206,"context_line":"        any(map(checksum.update, iter(lambda: f.read(32768), \u0027\u0027)))"},{"line_number":1207,"context_line":"    return checksum.hexdigest()"},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAD3%2F%2F9%2Fg%3D","line":1206,"updated":"2012-01-16 04:32:35.000000000","message":"Can you help me understand why the \u0027any\u0027 is necessary here?","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"bce2905356705cb3331455c285a9c304e5251ec6","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"    \"\"\"Generate a hash for the contents of a file.\"\"\""},{"line_number":1204,"context_line":"    checksum \u003d hashlib.sha1()"},{"line_number":1205,"context_line":"    with open(target) as f:"},{"line_number":1206,"context_line":"        any(map(checksum.update, iter(lambda: f.read(32768), \u0027\u0027)))"},{"line_number":1207,"context_line":"    return checksum.hexdigest()"},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAD3%2F%2F9%2Bs%3D","line":1206,"in_reply_to":"AAAAD3%2F%2F9%2Fg%3D","updated":"2012-01-16 10:46:59.000000000","message":"That was my fault. \"any\" will consume all entries for map(), which is required on python 3 as map is a generator there. I notice now though that this snippet is not fully python 3 compatible so this is moot. So probably just remove the any().\n\nOne could make it both python2.6 and python 3 compatible (while using a small but unbounded amount of mem for the map list on python 2) using:\n\n    with open(target,\u0027rb\u0027) as f:\n        any(map(checksum.update, iter(lambda: f.read(32768), b\u0027\u0027)))\n\nIf desired, you could bound the mem on python 2 also, by doing this\nat the top of the function:\n\n    if sys.version_info \u003c (3,):\n        import itertools\n        map \u003d itertools.map\n\nBut now we\u0027re getting back to the same number of lines as the original\niterative approach, so you might prefer to revert to that (while maintaining the 32KiB reads which is significant).","commit_id":"4304d821555ba195310fa54d21e0b14c5d0579ea"}],"nova/virt/libvirt/connection.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c757cde4adb24acf12587bf78cbc5933b7a4b5b4","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            f \u003d open(checksum_fname, \u0027w\u0027)"},{"line_number":840,"context_line":"            f.write(utils.hash_file(target))"},{"line_number":841,"context_line":"            f.close()"},{"line_number":842,"context_line":"            os.chmod(checksum_fname, 0444)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F24%3D","line":842,"updated":"2012-01-09 11:16:11.000000000","message":"To be pedantic, perhaps the checksum shouldn\u0027t be truncated on an exception generating the hash? So maybe order it like:\n\n    checksum \u003d utils.hash_file(target)\n    checksum_fname \u003d \u0027%s.sha1\u0027 % target\n\nAlso we don\u0027t care about buffering here, so one could use the lower level,\nos.open(,,, mode\u003d...), and avoid the separate and racy os.chmod call.","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            f \u003d open(checksum_fname, \u0027w\u0027)"},{"line_number":840,"context_line":"            f.write(utils.hash_file(target))"},{"line_number":841,"context_line":"            f.close()"},{"line_number":842,"context_line":"            os.chmod(checksum_fname, 0444)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2FrQ%3D","line":842,"in_reply_to":"AAAAD3%2F%2F%2F1M%3D","updated":"2012-01-09 21:53:07.000000000","message":"I don\u0027t see any other obvious uses of the \"_base\" directory elsewhere in the code base with a quick search. I\u0027ll take the time today to read the xen code to see if I can see how it is done there.","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5b3d525821f4748dacff5cf5820d9f85e25e750d","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            f \u003d open(checksum_fname, \u0027w\u0027)"},{"line_number":840,"context_line":"            f.write(utils.hash_file(target))"},{"line_number":841,"context_line":"            f.close()"},{"line_number":842,"context_line":"            os.chmod(checksum_fname, 0444)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2F1M%3D","line":842,"in_reply_to":"AAAAD3%2F%2F%2F24%3D","updated":"2012-01-09 15:15:14.000000000","message":"Also, this is specific to libvirt. Do we want to do the same for the other hypervisors supported?","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2cd9945137dec57f863ac90414921ba8510f14be","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            f \u003d open(checksum_fname, \u0027w\u0027)"},{"line_number":840,"context_line":"            f.write(utils.hash_file(target))"},{"line_number":841,"context_line":"            f.close()"},{"line_number":842,"context_line":"            os.chmod(checksum_fname, 0444)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2FrU%3D","line":842,"in_reply_to":"AAAAD3%2F%2F%2F24%3D","updated":"2012-01-09 21:53:07.000000000","message":"Done","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"f01c07a85c8c379903bc14c9fb8eddbd0374457f","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            f \u003d open(checksum_fname, \u0027w\u0027)"},{"line_number":840,"context_line":"            f.write(utils.hash_file(target))"},{"line_number":841,"context_line":"            f.close()"},{"line_number":842,"context_line":"            os.chmod(checksum_fname, 0444)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAD3%2F%2F%2Fgk%3D","line":842,"in_reply_to":"AAAAD3%2F%2F%2FrQ%3D","updated":"2012-01-10 07:48:27.000000000","message":"I\u0027ve spent some time reading code, and it appears that none of the other hypervisors do things like _base. That doesn\u0027t mean they shouldn\u0027t, but I think it would be a reasonably large amount of work to make this work for other hypervisors. If you feel strongly that there should be feature parity across the hypervisors, then I\u0027m happy to do that work, but perhaps in a separate review?","commit_id":"575703f8fb33b7a42cc242e49791b5639aa2a082"}]}
