)]}'
{"nova/objects/block_device.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8593ee886e19f9e29802f205c3ee2cb6440076e2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027volume_size\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027image_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027no_device\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BqRU%3D","line":40,"updated":"2013-11-21 22:14:17.000000000","message":"This is a lot of nullable fields. Can we make some of these non-nullable for clarity? What does a null bootindex mean? Can instance_uuid really be null?","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eddda3d30a282824f2691bc7ecbe136d208331d9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027volume_size\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027image_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027no_device\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BerU%3D","line":40,"in_reply_to":"AAAATn%2F%2Bn9o%3D","updated":"2013-11-25 16:47:41.000000000","message":"re: boot_index, that sounds good if it\u0027s enforced. Thanks!","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e43a8816eda7f297adf8158855c8b4c0401618b4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027volume_size\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027image_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027no_device\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Bn9o%3D","line":40,"in_reply_to":"AAAATn%2F%2BqRU%3D","updated":"2013-11-22 10:07:38.000000000","message":"I basically copied what was in the db model - but you are right - some of these fields make no sense to be nullable.\n\nNull boot_index is fine imo though - it means don\u0027t boot","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8593ee886e19f9e29802f205c3ee2cb6440076e2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @staticmethod"},{"line_number":46,"context_line":"    def _from_db_object(context, block_device, db_block_device):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BqOo%3D","line":43,"updated":"2013-11-21 22:14:17.000000000","message":"Hmm, I\u0027m not sure what you\u0027re trying to accomplish here. Why does the object need to consider legacy BDMs at all?","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eddda3d30a282824f2691bc7ecbe136d208331d9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @staticmethod"},{"line_number":46,"context_line":"    def _from_db_object(context, block_device, db_block_device):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BerQ%3D","line":43,"in_reply_to":"AAAATn%2F%2Bn%2Bs%3D","updated":"2013-11-25 16:47:41.000000000","message":"It looks (and is) easily controlled from the outside if you do it that way, so I think I\u0027d rather have it be explicit.","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e43a8816eda7f297adf8158855c8b4c0401618b4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"    }"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    legacy \u003d False  # Always use this to pass legacy"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @staticmethod"},{"line_number":46,"context_line":"    def _from_db_object(context, block_device, db_block_device):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Bn%2Bs%3D","line":43,"in_reply_to":"AAAATn%2F%2BqOo%3D","updated":"2013-11-22 10:07:38.000000000","message":"It doesn\u0027t - it should always use new style - but it\u0027s still needed in DB calls - so making it a class attr would make it more explicit and less error prone, or so I thought.","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"_BLOCK_DEVICE_OPTIONAL_JOINED_FIELD \u003d [\u0027instance\u0027]"},{"line_number":29,"context_line":"BLOCK_DEVICE_OPTIONAL_ATTRS \u003d _BLOCK_DEVICE_OPTIONAL_JOINED_FIELD"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _expected_cols(expected_attrs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGpQ%3D","line":29,"updated":"2013-12-02 15:32:22.000000000","message":"Hmm, what?","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"_BLOCK_DEVICE_OPTIONAL_JOINED_FIELD \u003d [\u0027instance\u0027]"},{"line_number":29,"context_line":"BLOCK_DEVICE_OPTIONAL_ATTRS \u003d _BLOCK_DEVICE_OPTIONAL_JOINED_FIELD"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _expected_cols(expected_attrs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9%2Bxo%3D","line":29,"in_reply_to":"AAAATn%2F%2BGpQ%3D","updated":"2013-12-03 21:01:52.000000000","message":"Well it follows suite with the other classes wrt the names and we might want to make it part of the framework in the future so I thought why not keep one private and one public that may also include non_db fields (or something) like instance does","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # NOTE (ndipanov): Always pass this as legacy param to db methods that"},{"line_number":62,"context_line":"    #                  need it. We should never use old-style in this class."},{"line_number":63,"context_line":"    #                  Remove once it\u0027s removed from DB api methods."},{"line_number":64,"context_line":"    legacy \u003d False"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _from_db_object(context, block_device,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGhw%3D","line":64,"updated":"2013-12-02 15:32:22.000000000","message":"As discussed, I think this should go away.","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # NOTE (ndipanov): Always pass this as legacy param to db methods that"},{"line_number":62,"context_line":"    #                  need it. We should never use old-style in this class."},{"line_number":63,"context_line":"    #                  Remove once it\u0027s removed from DB api methods."},{"line_number":64,"context_line":"    legacy \u003d False"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _from_db_object(context, block_device,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BB9U%3D","line":64,"in_reply_to":"AAAATn%2F%2BGhw%3D","updated":"2013-12-03 21:01:52.000000000","message":"Done","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":88,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":89,"context_line":"        # NOTE (ndipanov): We probably never want to save an instance from here"},{"line_number":90,"context_line":"        updates.pop(\u0027instance\u0027, None)"},{"line_number":91,"context_line":"        updated \u003d db.block_device_mapping_update(self._context, self.id,"},{"line_number":92,"context_line":"                                                 updates, legacy\u003dself.legacy)"},{"line_number":93,"context_line":"        self._from_db_object(context, self, updated)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGoc%3D","line":90,"updated":"2013-12-02 15:32:22.000000000","message":"I don\u0027t think there\u0027s any way that instance could become \"changed\" unless they assigned it. Perhaps we should raise an exception here to make it extremely clear that instance is not save-able?","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":88,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":89,"context_line":"        # NOTE (ndipanov): We probably never want to save an instance from here"},{"line_number":90,"context_line":"        updates.pop(\u0027instance\u0027, None)"},{"line_number":91,"context_line":"        updated \u003d db.block_device_mapping_update(self._context, self.id,"},{"line_number":92,"context_line":"                                                 updates, legacy\u003dself.legacy)"},{"line_number":93,"context_line":"        self._from_db_object(context, self, updated)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9%2Bwo%3D","line":90,"in_reply_to":"AAAATn%2F%2BGoc%3D","updated":"2013-12-03 21:01:52.000000000","message":"Done","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            expected_attrs \u003d []"},{"line_number":99,"context_line":"        db_bdm \u003d db.block_device_mapping_get_by_volume_id("},{"line_number":100,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":101,"context_line":"        return cls._from_db_object(context, cls(), db_bdm, expected_attrs)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @property"},{"line_number":104,"context_line":"    def is_root(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGnk%3D","line":101,"updated":"2013-12-02 15:32:22.000000000","message":"/me channels comstud\n\nexpected_attrs is a kwarg, can you pass it here as such?","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            expected_attrs \u003d []"},{"line_number":99,"context_line":"        db_bdm \u003d db.block_device_mapping_get_by_volume_id("},{"line_number":100,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":101,"context_line":"        return cls._from_db_object(context, cls(), db_bdm, expected_attrs)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @property"},{"line_number":104,"context_line":"    def is_root(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BB9M%3D","line":101,"in_reply_to":"AAAATn%2F%2BGnk%3D","updated":"2013-12-03 21:01:52.000000000","message":"Done","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        return self.source_type \u003d\u003d \u0027image\u0027"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def get_image_mapping(self):"},{"line_number":116,"context_line":"        return block_device.BlockDeviceDict(self).get_image_mapping()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":119,"context_line":"        if attrname not in BLOCK_DEVICE_OPTIONAL_ATTRS:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGjM%3D","line":116,"updated":"2013-12-02 15:32:22.000000000","message":"So, this is technically not a problem because it\u0027s client-side code working on the client-side object. However, I think it should be noted that, in the future, BlockDeviceDict needs to be able to understand an older format of this object, or else BlockDeviceDict needs to be a versioned thing itself.","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        return self.source_type \u003d\u003d \u0027image\u0027"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def get_image_mapping(self):"},{"line_number":116,"context_line":"        return block_device.BlockDeviceDict(self).get_image_mapping()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":119,"context_line":"        if attrname not in BLOCK_DEVICE_OPTIONAL_ATTRS:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9%2BqM%3D","line":116,"in_reply_to":"AAAATn%2F%2BGjM%3D","updated":"2013-12-03 21:01:52.000000000","message":"The idea is that we will use the dict class only in the API since we do really need to deal with dicts, due to old api versions (we deprecate those) but also block devices that are stored with images that can potentially live forever. They naturally have to be versioned because of that (which is why they were introduced in the first place, but they will never go over rpc - so no need for actual version numbers - they can just be like \u0027Object\u0027s little helpers\u0027 :)","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c8ca2c842ee415278d5489e35066b8c484ecded","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                   \u0027uuid\u0027: self.uuid,"},{"line_number":131,"context_line":"                   })"},{"line_number":132,"context_line":"        self.instance \u003d instance.Instance.get_by_uuid(self._context,"},{"line_number":133,"context_line":"                                                      self.instance_uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BGik%3D","line":133,"updated":"2013-12-02 15:32:22.000000000","message":"This should call:\n\n self.obj_reset_changes([\u0027instance\u0027])\n\nright? Otherwise instance will look like it is changed the next time the user goes to do a .save()","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7b35d9d3334e36f3adfedf774a462c2268f30cc2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                   \u0027uuid\u0027: self.uuid,"},{"line_number":131,"context_line":"                   })"},{"line_number":132,"context_line":"        self.instance \u003d instance.Instance.get_by_uuid(self._context,"},{"line_number":133,"context_line":"                                                      self.instance_uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BB80%3D","line":133,"in_reply_to":"AAAATn%2F%2BGik%3D","updated":"2013-12-03 21:01:52.000000000","message":"Ummm yeah good catch - but how come none of the odder two that override this (instance and service) attempt to do this?","commit_id":"e11c4a54332f16fc64f2740def50d871f6b15ec3"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"01d33483a7b2a500eca75adaa099609ada75a194","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                image_meta \u003d image_api.show(context, root_bdm.image_id)"},{"line_number":190,"context_line":"                return image_meta.get(\u0027properties\u0027, {})"},{"line_number":191,"context_line":"            except Exception:"},{"line_number":192,"context_line":"                raise exception.InvalidBDMImage(id\u003droot_bdm.id)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"def block_device_make_list(context, db_list, **extra_args):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9SS4%3D","line":192,"updated":"2013-12-13 03:05:10.000000000","message":"neither volume nor image, return what?","commit_id":"a1a0bac5a447f32aaf0cd58be8f91a5080554aa1"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d7d2bdbba3ea436356455c3d4fc1f314875302a0","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                image_meta \u003d image_api.show(context, root_bdm.image_id)"},{"line_number":190,"context_line":"                return image_meta.get(\u0027properties\u0027, {})"},{"line_number":191,"context_line":"            except Exception:"},{"line_number":192,"context_line":"                raise exception.InvalidBDMImage(id\u003droot_bdm.id)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"def block_device_make_list(context, db_list, **extra_args):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9RIY%3D","line":192,"in_reply_to":"AAAATn%2F9SS4%3D","updated":"2013-12-13 10:01:03.000000000","message":"Done","commit_id":"a1a0bac5a447f32aaf0cd58be8f91a5080554aa1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c019459fc31fce26be49d1f5d990f066588314bc","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if \u0027instance\u0027 in updates:"},{"line_number":87,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":88,"context_line":"                                              reason\u003d\u0027instance assigned\u0027)"},{"line_number":89,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        db_bdm \u003d db.block_device_mapping_create(context, updates, legacy\u003dFalse)"},{"line_number":92,"context_line":"        self._from_db_object(context, self, db_bdm)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9PF4%3D","line":89,"updated":"2013-12-13 17:10:35.000000000","message":"This is probably unnecessary since you bail above if it\u0027s set. It\u0027s can\u0027t be unset and in updates.","commit_id":"aedd19691093e7d4df7d13c498b496d32a7b6f36"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b84be6e4b2fd58b20fdddf6d206966d93be0c924","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    }"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @staticmethod"},{"line_number":62,"context_line":"    def _from_db_object(context, block_device,"},{"line_number":63,"context_line":"                        db_block_device, expected_attrs\u003dNone):"},{"line_number":64,"context_line":"        if expected_attrs is None:"},{"line_number":65,"context_line":"            expected_attrs \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F8Hc%3D","line":62,"updated":"2014-01-06 14:29:46.000000000","message":"maybe it is worth while changing block_device to block_device_object. It took me while to understand that...","commit_id":"898338a63ed8e559d12aadcded6d27fdc015d198"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b84be6e4b2fd58b20fdddf6d206966d93be0c924","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            my_inst \u003d instance.Instance()"},{"line_number":72,"context_line":"            instance.Instance._from_db_object("},{"line_number":73,"context_line":"                    context, my_inst, db_block_device[\u0027instance\u0027])"},{"line_number":74,"context_line":"            block_device[\u0027instance\u0027] \u003d my_inst"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        block_device._context \u003d context"},{"line_number":77,"context_line":"        block_device.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F8HQ%3D","line":74,"updated":"2014-01-06 14:29:46.000000000","message":"this should be block_device.instance","commit_id":"898338a63ed8e559d12aadcded6d27fdc015d198"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b84be6e4b2fd58b20fdddf6d206966d93be0c924","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        try:"},{"line_number":175,"context_line":"            return (bdm_obj for bdm_obj in self if bdm_obj.is_root).next()"},{"line_number":176,"context_line":"        except StopIteration:"},{"line_number":177,"context_line":"            return None"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def root_metadata(self, context, image_api, volume_api):"},{"line_number":180,"context_line":"        root_bdm \u003d self.root_bdm()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2F8G0%3D","line":177,"updated":"2014-01-06 14:29:46.000000000","message":"by default None is retruned so I guess you can just do a return here","commit_id":"898338a63ed8e559d12aadcded6d27fdc015d198"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68a2451dfa15ed58d847200c4ad8547b64aa8325","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        \u0027volume_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":56,"context_line":"        \u0027volume_size\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027image_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":58,"context_line":"        \u0027no_device\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":59,"context_line":"        \u0027connection_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2BDrM%3D","line":58,"updated":"2014-01-30 16:15:38.000000000","message":"DB model doesn\u0027t call out a default so it defaults to None which is coerced to False by the Boolean field type for objects:\n\nbool(None)\n\nSo this is OK.","commit_id":"5a7fe0023edc913b844362f6208e37b0aaa3d5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68a2451dfa15ed58d847200c4ad8547b64aa8325","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                              reason\u003d\u0027instance assigned\u0027)"},{"line_number":90,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        db_bdm \u003d db.block_device_mapping_create(context, updates, legacy\u003dFalse)"},{"line_number":93,"context_line":"        cells_api \u003d cells_rpcapi.CellsAPI()"},{"line_number":94,"context_line":"        cells_api.bdm_update_or_create_at_top(context, db_bdm, create\u003dTrue)"},{"line_number":95,"context_line":"        self._from_db_object(context, self, db_bdm)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2BDo8%3D","line":92,"updated":"2014-01-30 16:15:38.000000000","message":"legacy is currently defaulting to True in the DB API and I don\u0027t see that overridden in the compute api code, so why changing it to False here?\n\nWe don\u0027t want to support the legacy format anymore, there was a DB migration in havana so that we can do the db migration without changing everything that touches bdms, which is everything.","commit_id":"5a7fe0023edc913b844362f6208e37b0aaa3d5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68a2451dfa15ed58d847200c4ad8547b64aa8325","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        db_bdm \u003d db.block_device_mapping_create(context, updates, legacy\u003dFalse)"},{"line_number":93,"context_line":"        cells_api \u003d cells_rpcapi.CellsAPI()"},{"line_number":94,"context_line":"        cells_api.bdm_update_or_create_at_top(context, db_bdm, create\u003dTrue)"},{"line_number":95,"context_line":"        self._from_db_object(context, self, db_bdm)"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2BDmU%3D","line":93,"updated":"2014-01-30 16:15:38.000000000","message":"The cells API stuff is conditional in the instance object save method, I\u0027m not really sure what this all does, but can you explain?","commit_id":"5a7fe0023edc913b844362f6208e37b0aaa3d5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68a2451dfa15ed58d847200c4ad8547b64aa8325","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def is_image(self):"},{"line_number":143,"context_line":"        return self.source_type \u003d\u003d \u0027image\u0027"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def get_image_mapping(self):"},{"line_number":146,"context_line":"        return block_device.BlockDeviceDict(self).get_image_mapping()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2BDjE%3D","line":145,"updated":"2014-01-30 16:15:38.000000000","message":"Don\u0027t see this tested...","commit_id":"5a7fe0023edc913b844362f6208e37b0aaa3d5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68a2451dfa15ed58d847200c4ad8547b64aa8325","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            raise exception.ObjectActionError("},{"line_number":151,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"},{"line_number":152,"context_line":"                reason\u003d\u0027attribute %s not lazy-loadable\u0027 % attrname)"},{"line_number":153,"context_line":"        if not self._context:"},{"line_number":154,"context_line":"            raise exception.OrphanedObjectError(method\u003d\u0027obj_load_attr\u0027,"},{"line_number":155,"context_line":"                                                objtype\u003dself.obj_name())"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2BDiA%3D","line":153,"updated":"2014-01-30 16:15:38.000000000","message":"Not seeing this tested, not sure if there is a good way.","commit_id":"5a7fe0023edc913b844362f6208e37b0aaa3d5ad"}],"nova/tests/fake_block_device.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8593ee886e19f9e29802f205c3ee2cb6440076e2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.openstack.common import timeutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class FakeDbBlockDeviceDict(block_device.BlockDeviceDict):"},{"line_number":23,"context_line":"    \"\"\"Defaults db fields - useful for mocking database calls.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BqL8%3D","line":22,"updated":"2013-11-21 22:14:17.000000000","message":"It doesn\u0027t look like this is used at all. Did I miss it?","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e43a8816eda7f297adf8158855c8b4c0401618b4","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.openstack.common import timeutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class FakeDbBlockDeviceDict(block_device.BlockDeviceDict):"},{"line_number":23,"context_line":"    \"\"\"Defaults db fields - useful for mocking database calls.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Bn7o%3D","line":22,"in_reply_to":"AAAATn%2F%2BqL8%3D","updated":"2013-11-22 10:07:38.000000000","message":"It\u0027s used in tests.","commit_id":"55deaa9a0879a5ae2c2fab8296d050c9926493f3"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"01d33483a7b2a500eca75adaa099609ada75a194","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def __init__(self, bdm_dict\u003dNone, **kwargs):"},{"line_number":26,"context_line":"        bdm_dict \u003d bdm_dict or {}"},{"line_number":27,"context_line":"        db_id \u003d bdm_dict.pop(\u0027id\u0027, 1)"},{"line_number":28,"context_line":"        instance_uuid \u003d bdm_dict.pop(\u0027instance_uuid\u0027, str(uuid.uuid4()))"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        super(FakeDbBlockDeviceDict, self).__init__(bdm_dict\u003dbdm_dict,"},{"line_number":31,"context_line":"                                                    **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9SSM%3D","line":28,"updated":"2013-12-13 03:05:10.000000000","message":"you  probably can use nova.openstack.common.uuidutils.generate_uuid(), which is the same.","commit_id":"a1a0bac5a447f32aaf0cd58be8f91a5080554aa1"}],"nova/tests/objects/test_block_device.py":[{"author":{"_account_id":7770,"name":"Abhishek Chanda","email":"abhishek.becs@gmail.com","username":"abhishek"},"change_message_id":"cab7fc33a1dc14937f61af006303f53fef1ad7f0","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.tests.objects import test_objects"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _TestBlockDeviceMappingObject(object):"},{"line_number":25,"context_line":"    def fake_bdm(self, instance\u003dNone):"},{"line_number":26,"context_line":"        instance \u003d instance or {}"},{"line_number":27,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict({"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BB8%3D","line":24,"updated":"2013-12-03 22:08:20.000000000","message":"I would want to remove the _ from class name and not use Test. It\u0027s less confusing this way.","commit_id":"63a2b091d990734d79d7b717a6b1333dd3c66e0f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"00601f63588519b7173d9118f29829b4a991c482","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.tests.objects import test_objects"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _TestBlockDeviceMappingObject(object):"},{"line_number":25,"context_line":"    def fake_bdm(self, instance\u003dNone):"},{"line_number":26,"context_line":"        instance \u003d instance or {}"},{"line_number":27,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict({"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9ops%3D","line":24,"in_reply_to":"AAAATn%2F9%2BB8%3D","updated":"2013-12-09 13:58:12.000000000","message":"Well I followed suite with other tests from other object classes. I would leave it like this and possibly fix in all tests in a separate commit.\n\nI am personally not too bothered by it.","commit_id":"63a2b091d990734d79d7b717a6b1333dd3c66e0f"},{"author":{"_account_id":7770,"name":"Abhishek Chanda","email":"abhishek.becs@gmail.com","username":"abhishek"},"change_message_id":"cab7fc33a1dc14937f61af006303f53fef1ad7f0","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class _TestBlockDeviceMappingListObject(object):"},{"line_number":95,"context_line":"    def fake_bdm(self, bdm_id):"},{"line_number":96,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict({"},{"line_number":97,"context_line":"            \u0027id\u0027: bdm_id, \u0027instance_uuid\u0027: \u0027fake-instance\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BB0%3D","line":94,"updated":"2013-12-03 22:08:20.000000000","message":"same here","commit_id":"63a2b091d990734d79d7b717a6b1333dd3c66e0f"},{"author":{"_account_id":9046,"name":"Maithem","email":"munshedm@vmware.com","username":"Maithem"},"change_message_id":"75b9b5f6ac406ab3d100fd39381791e3d99d70ff","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import contextlib"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from nova.cells import rpcapi as cells_rpcapi"},{"line_number":19,"context_line":"from nova import db"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FCYk%3D","line":16,"updated":"2014-01-18 04:49:31.000000000","message":"contextlib is part of the standard library and mock isn\u0027t. Thus, they need to be in separate groups.","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"61c4253ed39b0162964d1803b1df7eec1de13293","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import contextlib"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from nova.cells import rpcapi as cells_rpcapi"},{"line_number":19,"context_line":"from nova import db"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FBzg%3D","line":16,"in_reply_to":"AAAAUH%2F%2FCYk%3D","updated":"2014-01-18 13:15:03.000000000","message":"Right - will do!","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":9046,"name":"Maithem","email":"munshedm@vmware.com","username":"Maithem"},"change_message_id":"75b9b5f6ac406ab3d100fd39381791e3d99d70ff","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mox.StubOutWithMock(db, \u0027block_device_mapping_get_by_volume_id\u0027)"},{"line_number":71,"context_line":"        db.block_device_mapping_get_by_volume_id("},{"line_number":72,"context_line":"                self.context, \u0027fake-volume-id\u0027, []).AndReturn(self.fake_bdm())"},{"line_number":73,"context_line":"        self.mox.ReplayAll()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        vol_bdm \u003d block_device_obj.BlockDeviceMapping.get_by_volume_id("},{"line_number":76,"context_line":"                self.context, \u0027fake-volume-id\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FCYc%3D","line":73,"updated":"2014-01-18 04:49:31.000000000","message":"Since this is a new test case, it should be written in mock. \nPlease read: https://wiki.openstack.org/wiki/ReviewChecklist\nTest Case implementation (Mock vs. Mox)","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"61c4253ed39b0162964d1803b1df7eec1de13293","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mox.StubOutWithMock(db, \u0027block_device_mapping_get_by_volume_id\u0027)"},{"line_number":71,"context_line":"        db.block_device_mapping_get_by_volume_id("},{"line_number":72,"context_line":"                self.context, \u0027fake-volume-id\u0027, []).AndReturn(self.fake_bdm())"},{"line_number":73,"context_line":"        self.mox.ReplayAll()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        vol_bdm \u003d block_device_obj.BlockDeviceMapping.get_by_volume_id("},{"line_number":76,"context_line":"                self.context, \u0027fake-volume-id\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FBzI%3D","line":73,"in_reply_to":"AAAAUH%2F%2FCYc%3D","updated":"2014-01-18 13:15:03.000000000","message":"Right, so first see the next patch in the branch (which I will likely squash in since I have to respin this for your other comments) https://review.openstack.org/#/c/67515/.\n\nSecond, I strongly believe that bringing this up as an argument for a -1 on a patch that is past revision 3 or so - is bad form. We really have no clear plan to convert to mock, (let alone py3) so blocking long standing features branches on this is counterproductive imho.","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":9046,"name":"Maithem","email":"munshedm@vmware.com","username":"Maithem"},"change_message_id":"75b9b5f6ac406ab3d100fd39381791e3d99d70ff","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        volume_meta \u003d block_device_mapping.root_metadata("},{"line_number":216,"context_line":"            self.context, None, FakeVolumeApi())"},{"line_number":217,"context_line":"        self.assertEqual(volume_meta, fake_volume[\u0027volume_image_metadata\u0027])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_root_image_metadata(self):"},{"line_number":220,"context_line":"        fake_image \u003d {\u0027properties\u0027: {\u0027img_test_key\u0027: \u0027img_test_value\u0027}}"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FCYM%3D","line":217,"updated":"2014-01-18 04:49:31.000000000","message":"Order of arguments should be (expected, observed) \nhttps://lists.launchpad.net/yahoo-eng-team/msg07845.html","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"61c4253ed39b0162964d1803b1df7eec1de13293","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        volume_meta \u003d block_device_mapping.root_metadata("},{"line_number":216,"context_line":"            self.context, None, FakeVolumeApi())"},{"line_number":217,"context_line":"        self.assertEqual(volume_meta, fake_volume[\u0027volume_image_metadata\u0027])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_root_image_metadata(self):"},{"line_number":220,"context_line":"        fake_image \u003d {\u0027properties\u0027: {\u0027img_test_key\u0027: \u0027img_test_value\u0027}}"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FBzE%3D","line":217,"in_reply_to":"AAAAUH%2F%2FCYM%3D","updated":"2014-01-18 13:15:03.000000000","message":"Done","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":9046,"name":"Maithem","email":"munshedm@vmware.com","username":"Maithem"},"change_message_id":"75b9b5f6ac406ab3d100fd39381791e3d99d70ff","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        image_meta \u003d block_device_mapping.root_metadata("},{"line_number":236,"context_line":"            self.context, FakeImageApi(), None)"},{"line_number":237,"context_line":"        self.assertEqual(image_meta, fake_image[\u0027properties\u0027])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"class TestBlockDeviceMappingListObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FCYI%3D","line":237,"updated":"2014-01-18 04:49:31.000000000","message":"ditto","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"61c4253ed39b0162964d1803b1df7eec1de13293","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        image_meta \u003d block_device_mapping.root_metadata("},{"line_number":236,"context_line":"            self.context, FakeImageApi(), None)"},{"line_number":237,"context_line":"        self.assertEqual(image_meta, fake_image[\u0027properties\u0027])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"class TestBlockDeviceMappingListObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2FBzA%3D","line":237,"in_reply_to":"AAAAUH%2F%2FCYI%3D","updated":"2014-01-18 13:15:03.000000000","message":"Done","commit_id":"386c49e36ceb74891a82e2e9f86c9a5f2a01ba0f"}]}
