)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":14,"context_line":"The extra_resources field is used to communicate an extensible set"},{"line_number":15,"context_line":"of resource capacity information to the scheduler, equivalent to"},{"line_number":16,"context_line":"the existing information for memory, disk and vcpu."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ic8930f37dd8272d3cc4506585466ce714e69e1ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAUX%2F%2FsCk%3D","line":17,"updated":"2014-02-11 14:18:25.000000000","message":"No bug? I realize it\u0027s kind of after the fact but tracking a bug would also make it show up in the release tracking for the series.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"}],"nova/objects/compute_node.py":[{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e9aad7c905c9d500328663df9aec96fd927122ea","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"},{"line_number":107,"context_line":"        }"},{"line_number":108,"context_line":"    child_versions \u003d {"},{"line_number":109,"context_line":"        \u00271.0\u0027: \u00271.3\u0027,"},{"line_number":110,"context_line":"        # NOTE(danms): ComputeNode was at 1.2 before we added this"},{"line_number":111,"context_line":"        }"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9wXU%3D","line":109,"updated":"2014-02-04 10:21:27.000000000","message":"version tracking is wrong here. If ComputeNode changes version ComputeNodeList must also change version and child_versions maps both for use in back levelling to any version.","commit_id":"0403cff5eceff7900b4dfea4a2676987a3866b6c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcf75273b0637e39d3fe78df607e736b367a21d9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027extra_resources\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2F%2FTY%3D","line":50,"updated":"2014-02-07 22:18:31.000000000","message":"Is there a way to write a unit test that makes the target_version 1.2 and then asserts the object doesn\u0027t have the extra_resources field?","commit_id":"a8a219eedde25565fbd01e6a935940e3409bbac1"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"0173f48167fb09dd903e3f6e27a087a67ef54bc8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027extra_resources\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FwRA%3D","line":50,"in_reply_to":"AAAAUX%2F%2F%2FTY%3D","updated":"2014-02-11 01:28:57.000000000","message":"done - see: _TestComputeNodeObject.test_make_compatible_1_2() in nova.tests.objects.compute_node","commit_id":"a8a219eedde25565fbd01e6a935940e3409bbac1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"22438e1b22b54541f5dae148fd164fab2e618857","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":54,"context_line":"            del primitive[\u0027extra_resources\u0027]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FoMU%3D","line":53,"updated":"2014-02-11 21:56:33.000000000","message":"Need to make sure that \u0027extra_resources\u0027 is in primitive otherwise you\u0027ll get a KeyError on the delete (since save() only saves it if set and it\u0027s an optional field).\n\nSee how the Instance object overrides obj_make_compatible for info_cache.","commit_id":"e8cb6e40224254041b817b7c379aee3c18d5e807"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"cfc27bec3c21bdafc0cad8fe528035b574ed234e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":54,"context_line":"            del primitive[\u0027extra_resources\u0027]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fnc0%3D","line":53,"in_reply_to":"AAAAUX%2F%2FoLM%3D","updated":"2014-02-12 01:11:28.000000000","message":"yes - embarrassing, thanks - done","commit_id":"e8cb6e40224254041b817b7c379aee3c18d5e807"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"949f45cbd3dcfdbfd138898f821da2061283c6d5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":54,"context_line":"            del primitive[\u0027extra_resources\u0027]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FoLM%3D","line":53,"in_reply_to":"AAAAUX%2F%2FoMU%3D","updated":"2014-02-11 21:57:42.000000000","message":"https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L214","commit_id":"e8cb6e40224254041b817b7c379aee3c18d5e807"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9bd2453ebdf97e98d7eed183dc475ad09761d004","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":53,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":54,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":55,"context_line":"        if target_version \u003c (1, 3) and \u0027stats\u0027 in primitive:"},{"line_number":56,"context_line":"            # pre 1.3 version does not have a stats field"},{"line_number":57,"context_line":"            del primitive[\u0027stats\u0027]"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FmMM%3D","line":55,"updated":"2014-02-12 05:02:44.000000000","message":"This doesn\u0027t belong here, so I posted a question in the patch that merged it:\n\nhttps://review.openstack.org/#/c/66469/6/nova/objects/compute_node.py\n\nMy understanding of how this works is maybe wrong if _from_db_object is called before this and the primitive passed in is what comes out of _from_db_object, because then a default value is set on the field and it should be in the dict.","commit_id":"33110eeebea43eaa8869dc9e9dab205b9018e0a6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ccd73b354cf23c8b0eeca81d55698e5f2dc73353","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":53,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":54,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":55,"context_line":"        if target_version \u003c (1, 3) and \u0027stats\u0027 in primitive:"},{"line_number":56,"context_line":"            # pre 1.3 version does not have a stats field"},{"line_number":57,"context_line":"            del primitive[\u0027stats\u0027]"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2FiRo%3D","line":55,"in_reply_to":"AAAAUX%2F%2Fi6E%3D","updated":"2014-02-12 14:50:04.000000000","message":"I talked to Dan Smith about it this morning and he said the code should be checking for stats because it is possible to setup the primitive for it to not be there when it\u0027s sent over RPC, so it should be checked. (what you said)\n\nSo I\u0027m OK with leaving the fix in here for stats, but please call it out in the commit message that you\u0027re also adding that missing check from the other commit (call it out by commit hash/change id for comparison in review).\n\nYour patch is better setup for this since you have a test for converting when the field is there and when it\u0027s not, Brian\u0027s patch should have had a unit test for that also.","commit_id":"33110eeebea43eaa8869dc9e9dab205b9018e0a6"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"f62e4ec985f849bb0bed3ad03af3e4773b2fd1ff","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":53,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":54,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":55,"context_line":"        if target_version \u003c (1, 3) and \u0027stats\u0027 in primitive:"},{"line_number":56,"context_line":"            # pre 1.3 version does not have a stats field"},{"line_number":57,"context_line":"            del primitive[\u0027stats\u0027]"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Fi6E%3D","line":55,"in_reply_to":"AAAAUX%2F%2FmMM%3D","updated":"2014-02-12 13:29:38.000000000","message":"This is related to serialization for messaging and is called without the db code being involved. Serialization is done by obj_to_primitive and obj_from_primitive.  obj_to_primitive has an optional target_version parameter, it creates a primitive and calls obj_make_compatible to backport it to required version before returning it. \n\nThis is used for a key step in live upgrade. When deserializating an object, if the class name is known but the version is not, the deserializer forwards the primitive form to conductor asking for a version that it does known. Conductor is assumed to be ahead in in the upgrade sequence and so will understand the version it receives (one of the reasons why it goes first in upgrade). It deserializes the object and then reserializes it in the required version and sends it back. See: nova.objects.base.NovaObjectSerializer\n\nOr for a short answer: yes you are right, the stats can be missing.\n\nThis one line should prbably go in as a bug fix.","commit_id":"33110eeebea43eaa8869dc9e9dab205b9018e0a6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ebe247c928e62aae138d045ab86ef064607071bc","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if extra_resources:"},{"line_number":78,"context_line":"            compute[\u0027extra_resources\u0027] \u003d jsonutils.loads(extra_resources)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            compute[\u0027extra_resources\u0027] \u003d {}"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        compute._context \u003d context"},{"line_number":83,"context_line":"        compute.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2BzWY%3D","line":80,"updated":"2014-02-18 23:06:33.000000000","message":"If this is nullable, why are we doing this? Nullable means it can be \u003d\u003dNone, and this ensures that it\u0027s not.","commit_id":"60214ffb0adac7368b925bd63bc18c92fee10edb"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"c4db19a830bbb270fca9ecd108395fd729d5fac6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if extra_resources:"},{"line_number":78,"context_line":"            compute[\u0027extra_resources\u0027] \u003d jsonutils.loads(extra_resources)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            compute[\u0027extra_resources\u0027] \u003d {}"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        compute._context \u003d context"},{"line_number":83,"context_line":"        compute.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAU3%2F%2F0kA%3D","line":80,"in_reply_to":"AAAAUX%2F%2BzWY%3D","updated":"2014-02-24 16:34:10.000000000","message":"Done","commit_id":"60214ffb0adac7368b925bd63bc18c92fee10edb"}],"nova/tests/objects/test_compute_node.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcf75273b0637e39d3fe78df607e736b367a21d9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \u0027metrics\u0027: \u0027\u0027,"},{"line_number":50,"context_line":"    \u0027extra_resources\u0027: fake_extra_resources"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"fake_db_compute_node \u003d {"},{"line_number":53,"context_line":"    \u0027created_at\u0027: NOW,"},{"line_number":54,"context_line":"    \u0027updated_at\u0027: None,"},{"line_number":55,"context_line":"    \u0027deleted_at\u0027: None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2F%2FUk%3D","line":52,"updated":"2014-02-07 22:18:31.000000000","message":"Can we avoid this copy/paste with just a dict update of fake_compute_node and override extra_resources?","commit_id":"a8a219eedde25565fbd01e6a935940e3409bbac1"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"0173f48167fb09dd903e3f6e27a087a67ef54bc8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \u0027metrics\u0027: \u0027\u0027,"},{"line_number":50,"context_line":"    \u0027extra_resources\u0027: fake_extra_resources"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"fake_db_compute_node \u003d {"},{"line_number":53,"context_line":"    \u0027created_at\u0027: NOW,"},{"line_number":54,"context_line":"    \u0027updated_at\u0027: None,"},{"line_number":55,"context_line":"    \u0027deleted_at\u0027: None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fwyg%3D","line":52,"in_reply_to":"AAAAUX%2F%2F%2FUk%3D","updated":"2014-02-11 01:28:57.000000000","message":"done","commit_id":"a8a219eedde25565fbd01e6a935940e3409bbac1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027cpu_info\u0027: \u0027Schmintel i786\u0027,"},{"line_number":51,"context_line":"        \u0027disk_available_least\u0027: 256,"},{"line_number":52,"context_line":"        \u0027metrics\u0027: \u0027\u0027,"},{"line_number":53,"context_line":"        \u0027extra_resources\u0027: fake_extra_resources"},{"line_number":54,"context_line":"    }"},{"line_number":55,"context_line":"    if updates:"},{"line_number":56,"context_line":"        compute.update(updates)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fr94%3D","line":53,"updated":"2014-02-11 14:18:25.000000000","message":"Don\u0027t need this - this is what updates is for now.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e1cf2bc835051f6167525c7063acd58f825f709c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027cpu_info\u0027: \u0027Schmintel i786\u0027,"},{"line_number":51,"context_line":"        \u0027disk_available_least\u0027: 256,"},{"line_number":52,"context_line":"        \u0027metrics\u0027: \u0027\u0027,"},{"line_number":53,"context_line":"        \u0027extra_resources\u0027: fake_extra_resources"},{"line_number":54,"context_line":"    }"},{"line_number":55,"context_line":"    if updates:"},{"line_number":56,"context_line":"        compute.update(updates)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fo2I%3D","line":53,"in_reply_to":"AAAAUX%2F%2Fr94%3D","updated":"2014-02-11 20:25:57.000000000","message":"extra_resources is now part of the base compute_node data structure - so its added to the fake here. The updates parameter allows us to override the base fake.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return compute"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def fake_db_compute_node(updates\u003dNone):"},{"line_number":61,"context_line":"    extra_resources \u003d jsonutils.dumps(fake_extra_resources)"},{"line_number":62,"context_line":"    compute \u003d fake_compute_node({\u0027extra_resources\u0027: extra_resources})"},{"line_number":63,"context_line":"    if updates:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fr9k%3D","line":60,"updated":"2014-02-11 14:18:25.000000000","message":"Do we need the updates parameter here?  It\u0027s not used.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e1cf2bc835051f6167525c7063acd58f825f709c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return compute"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def fake_db_compute_node(updates\u003dNone):"},{"line_number":61,"context_line":"    extra_resources \u003d jsonutils.dumps(fake_extra_resources)"},{"line_number":62,"context_line":"    compute \u003d fake_compute_node({\u0027extra_resources\u0027: extra_resources})"},{"line_number":63,"context_line":"    if updates:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fo8Q%3D","line":60,"in_reply_to":"AAAAUX%2F%2Fr9k%3D","updated":"2014-02-11 20:25:57.000000000","message":"removed the parameter","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def test_get_by_id(self):"},{"line_number":70,"context_line":"        self.mox.StubOutWithMock(db, \u0027compute_node_get\u0027)"},{"line_number":71,"context_line":"        db.compute_node_get(self.context, 123).AndReturn("},{"line_number":72,"context_line":"            fake_db_compute_node())"},{"line_number":73,"context_line":"        self.mox.ReplayAll()"},{"line_number":74,"context_line":"        compute \u003d compute_node.ComputeNode.get_by_id(self.context, 123)"},{"line_number":75,"context_line":"        self.compare_obj(compute, fake_compute_node())"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fr8w%3D","line":72,"updated":"2014-02-11 14:18:25.000000000","message":"I\u0027m not sure why all of the tests are changing now to use the two different stub methods, because they are written to essentially always be the same, so it seems that if we just want extra_resources in the stub, let\u0027s just have one stub and put the new field in it.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e1cf2bc835051f6167525c7063acd58f825f709c","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def test_get_by_id(self):"},{"line_number":70,"context_line":"        self.mox.StubOutWithMock(db, \u0027compute_node_get\u0027)"},{"line_number":71,"context_line":"        db.compute_node_get(self.context, 123).AndReturn("},{"line_number":72,"context_line":"            fake_db_compute_node())"},{"line_number":73,"context_line":"        self.mox.ReplayAll()"},{"line_number":74,"context_line":"        compute \u003d compute_node.ComputeNode.get_by_id(self.context, 123)"},{"line_number":75,"context_line":"        self.compare_obj(compute, fake_compute_node())"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fo3k%3D","line":72,"in_reply_to":"AAAAUX%2F%2Fr8w%3D","updated":"2014-02-11 20:25:57.000000000","message":"The db holds the extra_resources field as a json string. The ComputeNode converts that to a dict. Previously there was no conversion performed so the same data structure was used in the stub and in the comparison at the end. Now there is a conversion, so the db stubs return a different version of the data structure to the one that is compared with the object. The tests check that the conversion is working.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        compute.extra_resources \u003d fake_extra_resources"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        prim \u003d compute.obj_to_primitive()"},{"line_number":151,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 in prim[\u0027nova_object.data\u0027])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        prim_1_2 \u003d compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":154,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 not in prim_1_2[\u0027nova_object.data\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FsBU%3D","line":151,"updated":"2014-02-11 14:18:25.000000000","message":"Use assertIn.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e1cf2bc835051f6167525c7063acd58f825f709c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        compute.extra_resources \u003d fake_extra_resources"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        prim \u003d compute.obj_to_primitive()"},{"line_number":151,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 in prim[\u0027nova_object.data\u0027])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        prim_1_2 \u003d compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":154,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 not in prim_1_2[\u0027nova_object.data\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fo9M%3D","line":151,"in_reply_to":"AAAAUX%2F%2FsBU%3D","updated":"2014-02-11 20:25:57.000000000","message":"Done","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e095e138b1ea06be4f57366495d87539f9884f68","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 in prim[\u0027nova_object.data\u0027])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        prim_1_2 \u003d compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":154,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 not in prim_1_2[\u0027nova_object.data\u0027])"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class TestComputeNodeObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FsA4%3D","line":154,"updated":"2014-02-11 14:18:25.000000000","message":"Use assertNotIn, or equivalent testtools.matcher if that\u0027s not in py26.","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"e1cf2bc835051f6167525c7063acd58f825f709c","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 in prim[\u0027nova_object.data\u0027])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        prim_1_2 \u003d compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":154,"context_line":"        self.assertTrue(\u0027extra_resources\u0027 not in prim_1_2[\u0027nova_object.data\u0027])"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class TestComputeNodeObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2Fo9Q%3D","line":154,"in_reply_to":"AAAAUX%2F%2FsA4%3D","updated":"2014-02-11 20:25:57.000000000","message":"Done","commit_id":"4c2c26934d945def3b8df7610f5dbd34a6556704"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"22438e1b22b54541f5dae148fd164fab2e618857","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.assertEqual(1, len(computes))"},{"line_number":144,"context_line":"        self.compare_obj(computes[0], fake_compute_node())"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_make_compatible_1_2(self):"},{"line_number":147,"context_line":"        compute \u003d compute_node.ComputeNode()"},{"line_number":148,"context_line":"        compute.extra_resources \u003d fake_extra_resources"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FoL0%3D","line":146,"updated":"2014-02-11 21:56:33.000000000","message":"Given the missing check for whether or not extra_resources is in the ComputeNode object, we need a test that asserts the obj_to_primitive doesn\u0027t blow up when doing the compat call for version 1.2 but the compute node stub doesn\u0027t have an extra_resources field set.","commit_id":"e8cb6e40224254041b817b7c379aee3c18d5e807"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"cfc27bec3c21bdafc0cad8fe528035b574ed234e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.assertEqual(1, len(computes))"},{"line_number":144,"context_line":"        self.compare_obj(computes[0], fake_compute_node())"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_make_compatible_1_2(self):"},{"line_number":147,"context_line":"        compute \u003d compute_node.ComputeNode()"},{"line_number":148,"context_line":"        compute.extra_resources \u003d fake_extra_resources"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Fnck%3D","line":146,"in_reply_to":"AAAAUX%2F%2FoL0%3D","updated":"2014-02-12 01:11:28.000000000","message":"Done","commit_id":"e8cb6e40224254041b817b7c379aee3c18d5e807"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"78a9190de4b7e104039cd0caa328f866e12c7646","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # trying to make compatible with an earlier version"},{"line_number":150,"context_line":"        # (e.g. removing attributes that are not present)"},{"line_number":151,"context_line":"        compute \u003d compute_node.ComputeNode()"},{"line_number":152,"context_line":"        compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class TestComputeNodeObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FT78%3D","line":152,"updated":"2014-02-14 02:24:29.000000000","message":"Seems like you might as well add an explicit assertion that the newer attribute is removed when primitizing.","commit_id":"f35102559e433aae8e2abc2523c273ad73fa9639"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"dac4a628a33b307243a1ef4460ae3a6d688b24fa","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # trying to make compatible with an earlier version"},{"line_number":150,"context_line":"        # (e.g. removing attributes that are not present)"},{"line_number":151,"context_line":"        compute \u003d compute_node.ComputeNode()"},{"line_number":152,"context_line":"        compute.obj_to_primitive(\u00271.2\u0027)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class TestComputeNodeObject(test_objects._LocalTest,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2B4Q8%3D","line":152,"in_reply_to":"AAAAUX%2F%2FT78%3D","updated":"2014-02-18 13:14:12.000000000","message":"See the previous test method (line 145).\n\nThe purpose of this test is to see that there is no exception when the fields being removed do not exist.","commit_id":"f35102559e433aae8e2abc2523c273ad73fa9639"}]}
