)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2a9dbbfeadecd7dacf98bb024241fed02c0216bd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"and fixes VolumeDetachTask to reliably detach old volume"},{"line_number":16,"context_line":"so that new one can be immediately attached."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Bug: #1269686"},{"line_number":19,"context_line":"Change-Id: I0aee64036bf8125f76e7f427716412a326ff5eef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAWH%2F%2BNwc%3D","line":18,"updated":"2014-03-28 11:06:15.000000000","message":"Can you confirm, does this fix bug #1298350?  If so we should tag it here","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb90d1dbb6a0b02c22e9351d0f0a80d2835b749f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"and fixes VolumeDetachTask to reliably detach old volume"},{"line_number":16,"context_line":"so that new one can be immediately attached."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Bug: #1269686"},{"line_number":19,"context_line":"Change-Id: I0aee64036bf8125f76e7f427716412a326ff5eef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAWH%2F%2BNus%3D","line":18,"in_reply_to":"AAAAWH%2F%2BNwc%3D","updated":"2014-03-28 11:10:40.000000000","message":"tried this bug with this patch - the bug is still there. The reason of the problem (at least in my environment) seems Neutron - nova show .... displays fault {\"message\": \"Connection to neutron failed: Maximum attempts reached\", \"code\": 500,","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"cf3b6e3faec80d07ab320167d3ceabca11bbc683","unresolved":false,"context_lines":[{"line_number":16,"context_line":"and fixes VolumeDetachTask to reliably detach old volume"},{"line_number":17,"context_line":"so that new one can be immediately attached."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Partial-Bug: #1269686"},{"line_number":20,"context_line":"Change-Id: I0aee64036bf8125f76e7f427716412a326ff5eef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAWH%2F9iP4%3D","line":19,"updated":"2014-04-06 22:34:40.000000000","message":"Please add Closes-Bug: #1251439","commit_id":"3a146586334e10d6403830a5977adb251b3b0306"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"91a659721181933857f787979bb909e2685222d4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"and fixes VolumeDetachTask to reliably detach old volume"},{"line_number":17,"context_line":"so that new one can be immediately attached."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Partial-Bug: #1269686"},{"line_number":20,"context_line":"Change-Id: I0aee64036bf8125f76e7f427716412a326ff5eef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAWH%2F9UFA%3D","line":19,"in_reply_to":"AAAAWH%2F9iP4%3D","updated":"2014-04-07 07:00:23.000000000","message":"Done","commit_id":"3a146586334e10d6403830a5977adb251b3b0306"}],"heat/engine/resources/volume.py":[{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"fb3f07574fdedba6d510409aa6441e1d649c3a62","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                break"},{"line_number":273,"context_line":"        if not attachment_id:"},{"line_number":274,"context_line":"            logger.warning(_(\"Volume %(volume)s is not known to be \""},{"line_number":275,"context_line":"                             \"attached to the server %(server)s\") %"},{"line_number":276,"context_line":"                           {\u0027volume\u0027: self.volume_id,"},{"line_number":277,"context_line":"                            \u0027server\u0027: self.server_id})"},{"line_number":278,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2Fdi0%3D","line":275,"updated":"2014-02-26 14:00:23.000000000","message":"may be detached?","commit_id":"70702138522d90d04fe03d63bed1bf22a62408c5"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"29799330c0b9ea29136938a1c2db62317d9b5177","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                break"},{"line_number":273,"context_line":"        if not attachment_id:"},{"line_number":274,"context_line":"            logger.warning(_(\"Volume %(volume)s is not known to be \""},{"line_number":275,"context_line":"                             \"attached to the server %(server)s\") %"},{"line_number":276,"context_line":"                           {\u0027volume\u0027: self.volume_id,"},{"line_number":277,"context_line":"                            \u0027server\u0027: self.server_id})"},{"line_number":278,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2FdSk%3D","line":275,"in_reply_to":"AAAAU3%2F%2Fdi0%3D","updated":"2014-02-26 14:26:08.000000000","message":"Done","commit_id":"70702138522d90d04fe03d63bed1bf22a62408c5"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"fb3f07574fdedba6d510409aa6441e1d649c3a62","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        DEVICE: properties.Schema("},{"line_number":565,"context_line":"            properties.Schema.STRING,"},{"line_number":566,"context_line":"            _(\u0027The location where the volume is exposed on the instance. This \u0027"},{"line_number":567,"context_line":"              \u0027assignment may not be honored and it is advised that the path \u0027"},{"line_number":568,"context_line":"              \u0027/dev/disk/by-id/virtio-\u003cVolumeId\u003e be used instead.\u0027)"},{"line_number":569,"context_line":"        ),"},{"line_number":570,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2Fdig%3D","line":567,"updated":"2014-02-26 14:00:23.000000000","message":"Is it really necessary? \nAs I understand it\u0027s child of VolumeAttachment with defined values:\nupdate_allowed_keys \u003d (\u0027Properties\u0027,)\nupdate_allowed_properties \u003d (VOLUME_ID,)","commit_id":"70702138522d90d04fe03d63bed1bf22a62408c5"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"29799330c0b9ea29136938a1c2db62317d9b5177","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        DEVICE: properties.Schema("},{"line_number":565,"context_line":"            properties.Schema.STRING,"},{"line_number":566,"context_line":"            _(\u0027The location where the volume is exposed on the instance. This \u0027"},{"line_number":567,"context_line":"              \u0027assignment may not be honored and it is advised that the path \u0027"},{"line_number":568,"context_line":"              \u0027/dev/disk/by-id/virtio-\u003cVolumeId\u003e be used instead.\u0027)"},{"line_number":569,"context_line":"        ),"},{"line_number":570,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2FdVo%3D","line":567,"in_reply_to":"AAAAU3%2F%2Fdig%3D","updated":"2014-02-26 14:26:08.000000000","message":"as I understand it, it is needed since VOLUME_ID is only a convenience handle, but the actual property name is different for VolumeAttachment (\u0027VolumeId\u0027) and CinderVolumeAttachment (\u0027volume_id\u0027), and when properties are evaluated for update, the actual string name of the property is used (as key in the properties dictionary).","commit_id":"70702138522d90d04fe03d63bed1bf22a62408c5"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"94ebc39b68d5fbbd1452295af1f3a46894ec6eb3","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            # have the same id as the cinder volume it refers to"},{"line_number":401,"context_line":"            # (which is generally true), since I can not figure out"},{"line_number":402,"context_line":"            # a way to get the original stack parameters here yet."},{"line_number":403,"context_line":"            old_volume_id \u003d self.resource_id"},{"line_number":404,"context_line":"            device \u003d self.properties.get(self.DEVICE)"},{"line_number":405,"context_line":"            new_volume_id \u003d prop_diff.get(self.VOLUME_ID)"},{"line_number":406,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F5Pk%3D","line":403,"updated":"2014-03-03 15:40:07.000000000","message":"can somebody give an advise on how to access here properties of the resource as before the update? it used to work with self.properties, but recently smth changed and now self.properties in this place references already updated properties.","commit_id":"3c708838a7f10275fa84b6a2f396d4e1dbd0fdc3"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"907272682db4578529a5272fa983337359ed8083","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2FgWo%3D","side":"PARENT","line":1,"updated":"2014-03-17 14:46:21.000000000","message":"It\u0027s correct, but we have different commit for this. Also it\u0027s not related with current changes.","commit_id":"6e2412a46890b47ca8d860f780750f188e70c8ca"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"52fc336d69c6f068a97ce6c9a34175f32fffbfd5","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2Ffco%3D","side":"PARENT","line":1,"in_reply_to":"AAAAWH%2F%2FgWo%3D","updated":"2014-03-17 15:38:31.000000000","message":"Done","commit_id":"6e2412a46890b47ca8d860f780750f188e70c8ca"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"a1a73f17917d2e72c5bfad97dd3621a83d6b85ec","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            nova_vol \u003d server_api.get_server_volume(self.server_id,"},{"line_number":264,"context_line":"                                                    self.attachment_id)"},{"line_number":265,"context_line":"            vol \u003d self.clients.cinder().volumes.get(nova_vol.id)"},{"line_number":266,"context_line":"        except (clients.cinderclient.exceptions.NotFound,"},{"line_number":267,"context_line":"                clients.novaclient.exceptions.BadRequest,"},{"line_number":268,"context_line":"                clients.novaclient.exceptions.NotFound):"},{"line_number":269,"context_line":"            logger.warning(_(\u0027%s - volume not found\u0027) % str(self))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FZ8E%3D","line":266,"updated":"2014-03-18 04:25:45.000000000","message":"still need this one?","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe756ab0d91f2c59b33708b5015577d9302b799f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            nova_vol \u003d server_api.get_server_volume(self.server_id,"},{"line_number":264,"context_line":"                                                    self.attachment_id)"},{"line_number":265,"context_line":"            vol \u003d self.clients.cinder().volumes.get(nova_vol.id)"},{"line_number":266,"context_line":"        except (clients.cinderclient.exceptions.NotFound,"},{"line_number":267,"context_line":"                clients.novaclient.exceptions.BadRequest,"},{"line_number":268,"context_line":"                clients.novaclient.exceptions.NotFound):"},{"line_number":269,"context_line":"            logger.warning(_(\u0027%s - volume not found\u0027) % str(self))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FYjE%3D","line":266,"in_reply_to":"AAAAWH%2F%2FZ8E%3D","updated":"2014-03-18 08:41:42.000000000","message":"seems yes, as there is a call to cinder here in the try clause too","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b86fa96fa80cb1b73708446b151afcc2f0d34fb4","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            server_api.delete_server_volume(self.server_id, self.attachment_id)"},{"line_number":275,"context_line":"        except (clients.novaclient.exceptions.BadRequest,"},{"line_number":276,"context_line":"                clients.novaclient.exceptions.NotFound) as e:"},{"line_number":277,"context_line":"            logger.warning(\u0027%s - %s\u0027 % (str(self), str(e)))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        yield"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FV%2Bo%3D","line":277,"updated":"2014-03-18 14:02:50.000000000","message":"Could you also add i18 support here?","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"d206d0611c0aa1331f77628e6df776cec0786f1e","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            server_api.delete_server_volume(self.server_id, self.attachment_id)"},{"line_number":275,"context_line":"        except (clients.novaclient.exceptions.BadRequest,"},{"line_number":276,"context_line":"                clients.novaclient.exceptions.NotFound) as e:"},{"line_number":277,"context_line":"            logger.warning(\u0027%s - %s\u0027 % (str(self), str(e)))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        yield"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FV4M%3D","line":277,"in_reply_to":"AAAAWH%2F%2FV%2Bo%3D","updated":"2014-03-18 14:11:29.000000000","message":"no, as this string is made up only of other strings, that are internationalized in there respective places. In fact str(self) is self.__str__ that is already i18n compliant, and fixing (even if it is needed) of novaclient exceptions is out of scope of this change.","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"dd4fe5d410349fda5e7aa7562df9611ede6ac353","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            server_api.delete_server_volume(self.server_id, self.attachment_id)"},{"line_number":275,"context_line":"        except (clients.novaclient.exceptions.BadRequest,"},{"line_number":276,"context_line":"                clients.novaclient.exceptions.NotFound) as e:"},{"line_number":277,"context_line":"            logger.warning(\u0027%s - %s\u0027 % (str(self), str(e)))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        yield"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FVsY%3D","line":277,"in_reply_to":"AAAAWH%2F%2FV4M%3D","updated":"2014-03-18 14:35:49.000000000","message":"At line 246 you have fixed i18, but the rally change is related with only renaming. So I think you could do same hack here. About translation, I am not sure that exception message could be translated too, because for this you should ensure, that nova translate her error in each place.","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"a1a73f17917d2e72c5bfad97dd3621a83d6b85ec","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # check that nova already knows that the volume is detached"},{"line_number":309,"context_line":"        def volume_attached_to_server(volume_id, server):"},{"line_number":310,"context_line":"            attached \u003d getattr(server,"},{"line_number":311,"context_line":"                               \u0027os-extended-volumes:volumes_attached\u0027, [])"},{"line_number":312,"context_line":"            if volume_id in [item[\u0027id\u0027] for item in attached]:"},{"line_number":313,"context_line":"                nova_utils.refresh_server(server)"},{"line_number":314,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FZ28%3D","line":311,"updated":"2014-03-18 04:25:45.000000000","message":"get_server_volume wouldn\u0027t work here? I haven\u0027t looked into the details. But If that causes Nova to sync volume attachment status with Cinder, can we leverage that?","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe756ab0d91f2c59b33708b5015577d9302b799f","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # check that nova already knows that the volume is detached"},{"line_number":309,"context_line":"        def volume_attached_to_server(volume_id, server):"},{"line_number":310,"context_line":"            attached \u003d getattr(server,"},{"line_number":311,"context_line":"                               \u0027os-extended-volumes:volumes_attached\u0027, [])"},{"line_number":312,"context_line":"            if volume_id in [item[\u0027id\u0027] for item in attached]:"},{"line_number":313,"context_line":"                nova_utils.refresh_server(server)"},{"line_number":314,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FYi8%3D","line":311,"in_reply_to":"AAAAWH%2F%2FZ28%3D","updated":"2014-03-18 08:41:42.000000000","message":"I will look into that","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"a1a73f17917d2e72c5bfad97dd3621a83d6b85ec","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            properties.Schema.STRING,"},{"line_number":343,"context_line":"            _(\u0027The ID of the volume to be attached.\u0027),"},{"line_number":344,"context_line":"            required\u003dTrue,"},{"line_number":345,"context_line":"            update_allowed\u003dTrue"},{"line_number":346,"context_line":"        ),"},{"line_number":347,"context_line":"        DEVICE: properties.Schema("},{"line_number":348,"context_line":"            properties.Schema.STRING,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FZ1A%3D","line":345,"updated":"2014-03-18 04:25:45.000000000","message":"not a -1 thing. I know making this update_allowed is to give handle_update a chance to do the workaround, but I am also wondering what would that mean to the server as Zane pointed out on the bug page.","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe756ab0d91f2c59b33708b5015577d9302b799f","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            properties.Schema.STRING,"},{"line_number":343,"context_line":"            _(\u0027The ID of the volume to be attached.\u0027),"},{"line_number":344,"context_line":"            required\u003dTrue,"},{"line_number":345,"context_line":"            update_allowed\u003dTrue"},{"line_number":346,"context_line":"        ),"},{"line_number":347,"context_line":"        DEVICE: properties.Schema("},{"line_number":348,"context_line":"            properties.Schema.STRING,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FYf8%3D","line":345,"in_reply_to":"AAAAWH%2F%2FZ1A%3D","updated":"2014-03-18 08:41:42.000000000","message":"I am inclined to trust nova to safely detach volumes in this case, as with all other volume related stuff (Zane worries about unmounting volume first before detaching, but isn\u0027t it the same procedure / problem when deleting server? and we seem not to worry much about it).","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"0030bf863d1fd30c2038fc402e3644f970349e80","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            required\u003dTrue,"},{"line_number":554,"context_line":"            update_allowed\u003dTrue"},{"line_number":555,"context_line":"        ),"},{"line_number":556,"context_line":"        DEVICE: properties.Schema("},{"line_number":557,"context_line":"            properties.Schema.STRING,"},{"line_number":558,"context_line":"            _(\u0027The location where the volume is exposed on the instance. This \u0027"},{"line_number":559,"context_line":"              \u0027assignment may not be honored and it is advised that the path \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FaHE%3D","line":556,"updated":"2014-03-18 03:19:10.000000000","message":"I think \u0027DEVICE\u0027 should be updatable too. So you should consider the combination of \u0027VOLUME_ID\u0027 and \u0027DEVICE\u0027.","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe756ab0d91f2c59b33708b5015577d9302b799f","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            required\u003dTrue,"},{"line_number":554,"context_line":"            update_allowed\u003dTrue"},{"line_number":555,"context_line":"        ),"},{"line_number":556,"context_line":"        DEVICE: properties.Schema("},{"line_number":557,"context_line":"            properties.Schema.STRING,"},{"line_number":558,"context_line":"            _(\u0027The location where the volume is exposed on the instance. This \u0027"},{"line_number":559,"context_line":"              \u0027assignment may not be honored and it is advised that the path \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2FYfg%3D","line":556,"in_reply_to":"AAAAWH%2F%2FaHE%3D","updated":"2014-03-18 08:41:42.000000000","message":"fair. in fact it looks like original bug description is referring exactly to such case. I will update the patch","commit_id":"82fc38b35a4899961a87179b363318239a0a7457"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ac5d44ede596d904c22e5813df47cf60970ca283","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            return True"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        while server_has_attachment(self.server_id, self.attachment_id):"},{"line_number":318,"context_line":"            logger.info(_(\"Server %(srv)s still has attachment %(att)s.\") %"},{"line_number":319,"context_line":"                        {\u0027att\u0027: self.attachment_id, \u0027srv\u0027: self.server_id})"},{"line_number":320,"context_line":"            yield"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FBbA%3D","line":318,"updated":"2014-03-20 21:16:43.000000000","message":"Only question: if this detach task will be happen very long time: we will get log with a lot of messages? \nHow about make logging less frequently?","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"bc76e49d1b3df56d214e8327f0f192fe198bef44","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            return True"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        while server_has_attachment(self.server_id, self.attachment_id):"},{"line_number":318,"context_line":"            logger.info(_(\"Server %(srv)s still has attachment %(att)s.\") %"},{"line_number":319,"context_line":"                        {\u0027att\u0027: self.attachment_id, \u0027srv\u0027: self.server_id})"},{"line_number":320,"context_line":"            yield"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2B9%2BQ%3D","line":318,"in_reply_to":"AAAAWH%2F%2FBbA%3D","updated":"2014-03-21 10:29:05.000000000","message":"I doubt it will take very long time - the actual detach and checking _cinder_ that volume is detached is handled above, and this code only checks that nova has the same info already. It would seem that this code would execute once, twice at most. I had to introduce it as on single node devstack if you immediately reattach you get error from nova. With this call we kind of force nova to get in sync with cinder.","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ac5d44ede596d904c22e5813df47cf60970ca283","unresolved":false,"context_lines":[{"line_number":382,"context_line":"    def handle_update(self, json_snippet, tmpl_diff, prop_diff):"},{"line_number":383,"context_line":"        checkers \u003d []"},{"line_number":384,"context_line":"        if prop_diff:"},{"line_number":385,"context_line":"            if self.VOLUME_ID in prop_diff:"},{"line_number":386,"context_line":"                volume_id \u003d prop_diff.get(self.VOLUME_ID)"},{"line_number":387,"context_line":"            else:"},{"line_number":388,"context_line":"                volume_id \u003d self.properties.get(self.VOLUME_ID)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FBf4%3D","line":385,"updated":"2014-03-20 21:16:43.000000000","message":"I think that will be better to do it without \u0027else\u0027:\n\nvolume_id \u003d self.properties.get(self.VOLUME_ID)\n\nif self.VOLUME_ID in prop_diff:\n\n    volume_id \u003d prop_diff.get(self.VOLUME_ID)","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"bc76e49d1b3df56d214e8327f0f192fe198bef44","unresolved":false,"context_lines":[{"line_number":382,"context_line":"    def handle_update(self, json_snippet, tmpl_diff, prop_diff):"},{"line_number":383,"context_line":"        checkers \u003d []"},{"line_number":384,"context_line":"        if prop_diff:"},{"line_number":385,"context_line":"            if self.VOLUME_ID in prop_diff:"},{"line_number":386,"context_line":"                volume_id \u003d prop_diff.get(self.VOLUME_ID)"},{"line_number":387,"context_line":"            else:"},{"line_number":388,"context_line":"                volume_id \u003d self.properties.get(self.VOLUME_ID)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2B97I%3D","line":385,"in_reply_to":"AAAAWH%2F%2FBf4%3D","updated":"2014-03-21 10:29:05.000000000","message":"in fact I was guarding against bug 1291411 (so that self.properties is used only on not-updated keys), but as this bug is going to be fixed now, I can do as you say","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ac5d44ede596d904c22e5813df47cf60970ca283","unresolved":false,"context_lines":[{"line_number":387,"context_line":"            else:"},{"line_number":388,"context_line":"                volume_id \u003d self.properties.get(self.VOLUME_ID)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"            if self.DEVICE in prop_diff:"},{"line_number":391,"context_line":"                device \u003d prop_diff.get(self.DEVICE)"},{"line_number":392,"context_line":"            else:"},{"line_number":393,"context_line":"                device \u003d self.properties.get(self.DEVICE)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FBfo%3D","line":390,"updated":"2014-03-20 21:16:43.000000000","message":"Same.","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"bc76e49d1b3df56d214e8327f0f192fe198bef44","unresolved":false,"context_lines":[{"line_number":387,"context_line":"            else:"},{"line_number":388,"context_line":"                volume_id \u003d self.properties.get(self.VOLUME_ID)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"            if self.DEVICE in prop_diff:"},{"line_number":391,"context_line":"                device \u003d prop_diff.get(self.DEVICE)"},{"line_number":392,"context_line":"            else:"},{"line_number":393,"context_line":"                device \u003d self.properties.get(self.DEVICE)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2B92Y%3D","line":390,"in_reply_to":"AAAAWH%2F%2FBfo%3D","updated":"2014-03-21 10:29:05.000000000","message":"Done","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"1e65cda1a47bbab069e1cb526ee8550f9896a655","unresolved":false,"context_lines":[{"line_number":232,"context_line":"class VolumeDetachTask(object):"},{"line_number":233,"context_line":"    \"\"\"A task for detaching a volume from a Nova server.\"\"\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def __init__(self, stack, server_id, attachment_id):"},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        Initialise with the stack (for obtaining the clients), and the IDs of"},{"line_number":238,"context_line":"        the server and volume."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWH%2F%2BY0c%3D","line":235,"updated":"2014-03-27 06:06:00.000000000","message":"Is this change necessary? This might break the usage of VolumeDetachTask while deleting an instance - https://github.com/openstack/heat/blob/master/heat/engine/resources/instance.py#L600 .","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"68096813c0a14286979e7bbb3d9e56a78761a495","unresolved":false,"context_lines":[{"line_number":232,"context_line":"class VolumeDetachTask(object):"},{"line_number":233,"context_line":"    \"\"\"A task for detaching a volume from a Nova server.\"\"\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def __init__(self, stack, server_id, attachment_id):"},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        Initialise with the stack (for obtaining the clients), and the IDs of"},{"line_number":238,"context_line":"        the server and volume."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWH%2F%2BWTs%3D","line":235,"in_reply_to":"AAAAWH%2F%2BY0c%3D","updated":"2014-03-27 13:33:25.000000000","message":"this is safe (for now), as volume_attachment id is set to the volume_id it describes\nhttps://github.com/openstack/nova/blob/187748630f36170ea3d4730f8ed6f3b7fed5c950/nova/api/openstack/compute/contrib/volumes.py#L326\nalthough this is not guaranteed to last.\n\nBefore this code was relying heavily on this assumption. I made it less implicit.\nBut you are right, at some point it would be better to fix the instance code as well.\n\nI decided to use volume_attachment here as it is what actually is needed for delete_server_volume(), and as we already have resource_id of VolumeAttachment,\nit saves us an api call to convert volume_id to attachment_id.","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"1e65cda1a47bbab069e1cb526ee8550f9896a655","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            checkers[0].start()"},{"line_number":408,"context_line":"            return checkers"},{"line_number":409,"context_line":"        else:"},{"line_number":410,"context_line":"            raise resource.UpdateReplace(self.id)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def check_update_complete(self, checkers):"},{"line_number":413,"context_line":"        for checker in checkers:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWH%2F%2BZGU%3D","line":410,"updated":"2014-03-27 06:06:00.000000000","message":"It looks like the execution will never reach here, thus no need for the if else clause. If prop_diff is none handle_update will not be called.","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"68096813c0a14286979e7bbb3d9e56a78761a495","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            checkers[0].start()"},{"line_number":408,"context_line":"            return checkers"},{"line_number":409,"context_line":"        else:"},{"line_number":410,"context_line":"            raise resource.UpdateReplace(self.id)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def check_update_complete(self, checkers):"},{"line_number":413,"context_line":"        for checker in checkers:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWH%2F%2BWRU%3D","line":410,"in_reply_to":"AAAAWH%2F%2BZGU%3D","updated":"2014-03-27 13:33:25.000000000","message":"valid point, will change it in the next patch-set","commit_id":"f9509685d403fc1ab5f7ed92e3ff72ef5a5569d0"},{"author":{"_account_id":8844,"name":"Mitsuru Kanabuchi","email":"kanabuchi.mitsuru@po.ntts.co.jp","username":"kanabuchi"},"change_message_id":"076b45a1fc726ed64b353a8216e790d3dd9bd618","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        INSTANCE_ID: properties.Schema("},{"line_number":335,"context_line":"            properties.Schema.STRING,"},{"line_number":336,"context_line":"            _(\u0027The ID of the instance to which the volume attaches.\u0027),"},{"line_number":337,"context_line":"            required\u003dTrue"},{"line_number":338,"context_line":"        ),"},{"line_number":339,"context_line":"        VOLUME_ID: properties.Schema("},{"line_number":340,"context_line":"            properties.Schema.STRING,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAWH%2F%2BD5o%3D","line":337,"updated":"2014-03-31 07:41:20.000000000","message":"I guess, same problem would occur when INSTANCE_ID updated.\nBecause UpdateReplace would attach the volume to the instance that indicated new INSTANCE_ID before detaching. INSTANCE_ID also needs update_allowed.","commit_id":"565ad525febb9f5947b8791cba87c37755e2a605"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"a07e64bd1fff8e0e942419fe663b3ee58f391e03","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        INSTANCE_ID: properties.Schema("},{"line_number":335,"context_line":"            properties.Schema.STRING,"},{"line_number":336,"context_line":"            _(\u0027The ID of the instance to which the volume attaches.\u0027),"},{"line_number":337,"context_line":"            required\u003dTrue"},{"line_number":338,"context_line":"        ),"},{"line_number":339,"context_line":"        VOLUME_ID: properties.Schema("},{"line_number":340,"context_line":"            properties.Schema.STRING,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAWH%2F%2BCc0%3D","line":337,"in_reply_to":"AAAAWH%2F%2BD5o%3D","updated":"2014-03-31 11:41:55.000000000","message":"Done","commit_id":"565ad525febb9f5947b8791cba87c37755e2a605"},{"author":{"_account_id":8844,"name":"Mitsuru Kanabuchi","email":"kanabuchi.mitsuru@po.ntts.co.jp","username":"kanabuchi"},"change_message_id":"1b0050a027c77d1ddbc93922394c552528bd2ab9","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        for checker in checkers:"},{"line_number":416,"context_line":"            if not checker.started():"},{"line_number":417,"context_line":"                checker.start()"},{"line_number":418,"context_line":"            if not checker.step():"},{"line_number":419,"context_line":"                return False"},{"line_number":420,"context_line":"        self.resource_id_set(checkers[-1]._task.attachment_id)"},{"line_number":421,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9wJY%3D","line":418,"updated":"2014-04-02 11:29:08.000000000","message":"In my understanding, VolumeDetachTask and VolumeAttachTask should process serial. However, this code looks like starting those tasks as parallel. If my understanding is correct, it should change task handling to serial.","commit_id":"3a146586334e10d6403830a5977adb251b3b0306"},{"author":{"_account_id":8844,"name":"Mitsuru Kanabuchi","email":"kanabuchi.mitsuru@po.ntts.co.jp","username":"kanabuchi"},"change_message_id":"a7d2170007ddcfaca2d458fa0aaa98cf7d173c1c","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        for checker in checkers:"},{"line_number":416,"context_line":"            if not checker.started():"},{"line_number":417,"context_line":"                checker.start()"},{"line_number":418,"context_line":"            if not checker.step():"},{"line_number":419,"context_line":"                return False"},{"line_number":420,"context_line":"        self.resource_id_set(checkers[-1]._task.attachment_id)"},{"line_number":421,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9v10%3D","line":418,"in_reply_to":"AAAAWH%2F9wHU%3D","updated":"2014-04-02 12:26:09.000000000","message":"Thank you for your clarification. I understand.","commit_id":"3a146586334e10d6403830a5977adb251b3b0306"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"1c824c1ceda07abeca0ec14ff6606d0de8685140","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        for checker in checkers:"},{"line_number":416,"context_line":"            if not checker.started():"},{"line_number":417,"context_line":"                checker.start()"},{"line_number":418,"context_line":"            if not checker.step():"},{"line_number":419,"context_line":"                return False"},{"line_number":420,"context_line":"        self.resource_id_set(checkers[-1]._task.attachment_id)"},{"line_number":421,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9wHU%3D","line":418,"in_reply_to":"AAAAWH%2F9wJY%3D","updated":"2014-04-02 11:41:15.000000000","message":"No, this code actually runs checkers one by one in the order they appear in the list, that is the whole point of it - and it works. It takes the first checker, starts it if not yet started, checks it is not finished and _breaks_ out of the loop by return, so nothing is executed further. On the next call to check_update_complete if the checker is started and finished (the .step() returns True) the loop body does nothing and goes on to the next checker in the list. The last return is only reached when the last checker has finished.\n\nSee the same trick done in OS::Nova::Server\n\nhttps://github.com/openstack/heat/blob/master/heat/engine/resources/server.py#L827","commit_id":"3a146586334e10d6403830a5977adb251b3b0306"}],"heat/tests/test_volume.py":[{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"907272682db4578529a5272fa983337359ed8083","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2FgW8%3D","side":"PARENT","line":1,"updated":"2014-03-17 14:46:21.000000000","message":"Unrelated changes. Also for more details look   https://review.openstack.org/#/c/76591","commit_id":"6e2412a46890b47ca8d860f780750f188e70c8ca"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"52fc336d69c6f068a97ce6c9a34175f32fffbfd5","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2Ffck%3D","side":"PARENT","line":1,"in_reply_to":"AAAAWH%2F%2FgW8%3D","updated":"2014-03-17 15:38:31.000000000","message":"Done","commit_id":"6e2412a46890b47ca8d860f780750f188e70c8ca"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"3643584c24dea0b8adedc3f2aaee842bade1984a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"      }"},{"line_number":63,"context_line":"    },"},{"line_number":64,"context_line":"    \"DataVolume2\" : {"},{"line_number":65,"context_line":"      \"Type\" : \"AWS::EC2::Volume\","},{"line_number":66,"context_line":"      \"Properties\" : {"},{"line_number":67,"context_line":"        \"Size\" : \"2\","},{"line_number":68,"context_line":"        \"AvailabilityZone\" : {\"Fn::GetAtt\": [\"WikiDatabase\","}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FQ6A%3D","line":65,"updated":"2014-03-19 01:33:21.000000000","message":"Or may be add a OS::Cinder::Volume and OS::Cinder::VolumeAttachment resources in volume_template?","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"af9bbabd0539048b196ba16c0353ece571e47756","unresolved":false,"context_lines":[{"line_number":62,"context_line":"      }"},{"line_number":63,"context_line":"    },"},{"line_number":64,"context_line":"    \"DataVolume2\" : {"},{"line_number":65,"context_line":"      \"Type\" : \"AWS::EC2::Volume\","},{"line_number":66,"context_line":"      \"Properties\" : {"},{"line_number":67,"context_line":"        \"Size\" : \"2\","},{"line_number":68,"context_line":"        \"AvailabilityZone\" : {\"Fn::GetAtt\": [\"WikiDatabase\","}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FOcM%3D","line":65,"in_reply_to":"AAAAWH%2F%2FQ6A%3D","updated":"2014-03-19 10:02:40.000000000","message":"I would rather not, as I am not writing new test cases but simply amending/fixing existing ones. Besides, OS::CInder::VolumeAttcahment is very simple subclass of AWS:::EC2::VolumeAttachment, with only names in schema changed.","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ac5d44ede596d904c22e5813df47cf60970ca283","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        self._mock_create_server_volume_script(fva)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        fva \u003d FakeVolume(\u0027i-use\u0027, \u0027available\u0027)"},{"line_number":336,"context_line":"        # delete script"},{"line_number":337,"context_line":"        self.m.StubOutWithMock(fva, \u0027get\u0027)"},{"line_number":338,"context_line":"        fva.get().MultipleTimes()"},{"line_number":339,"context_line":"        fva.status \u003d \"in-use\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2FBZ0%3D","line":336,"updated":"2014-03-20 21:16:43.000000000","message":"moving this comment is really necessary?","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"bc76e49d1b3df56d214e8327f0f192fe198bef44","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        self._mock_create_server_volume_script(fva)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        fva \u003d FakeVolume(\u0027i-use\u0027, \u0027available\u0027)"},{"line_number":336,"context_line":"        # delete script"},{"line_number":337,"context_line":"        self.m.StubOutWithMock(fva, \u0027get\u0027)"},{"line_number":338,"context_line":"        fva.get().MultipleTimes()"},{"line_number":339,"context_line":"        fva.status \u003d \"in-use\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2B92s%3D","line":336,"in_reply_to":"AAAAWH%2F%2FBZ0%3D","updated":"2014-03-21 10:29:05.000000000","message":"Done","commit_id":"817a8c18a96172e0039baeaab5b384279f48f0fa"}]}
