)]}'
{"nova/compute/resource_tracker.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"880ed1e9f7dcf73d242bb3714a84daaedbaa8a6b","unresolved":false,"context_lines":[{"line_number":552,"context_line":"                  \u0027pci_stats\u0027: pci_device_pools})"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"    def _resource_change(self, resources):"},{"line_number":555,"context_line":"        \"\"\"Check to see if any resources have changed.\"\"\""},{"line_number":556,"context_line":"        if cmp(resources, self.old_resources) !\u003d 0:"},{"line_number":557,"context_line":"            self.old_resources \u003d copy.deepcopy(resources)"},{"line_number":558,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_c63cc095","line":555,"updated":"2015-03-27 17:54:50.000000000","message":"This is unrelated to the rest of this change, right?","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"daa68bce3f40d72a0cd3e14e005b9fa832cd7ffc","unresolved":false,"context_lines":[{"line_number":552,"context_line":"                  \u0027pci_stats\u0027: pci_device_pools})"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"    def _resource_change(self, resources):"},{"line_number":555,"context_line":"        \"\"\"Check to see if any resources have changed.\"\"\""},{"line_number":556,"context_line":"        if cmp(resources, self.old_resources) !\u003d 0:"},{"line_number":557,"context_line":"            self.old_resources \u003d copy.deepcopy(resources)"},{"line_number":558,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_9e93cca3","line":555,"in_reply_to":"fa963961_c63cc095","updated":"2015-03-29 07:40:37.000000000","message":"yes, I just fixed the typo","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c3426d1bb106438e3ffb0d854025ef77682dd048","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                  \u0027pci_stats\u0027: pci_device_pools})"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    def _resource_change(self, resources):"},{"line_number":578,"context_line":"        \"\"\"Check to see if any resources have changed.\"\"\""},{"line_number":579,"context_line":"        if cmp(resources, self.old_resources) !\u003d 0:"},{"line_number":580,"context_line":"            self.old_resources \u003d copy.deepcopy(resources)"},{"line_number":581,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"da9b358b_27eeb0b4","line":578,"updated":"2015-03-31 10:52:46.000000000","message":"nit : well, technically it\u0027s not needed unless it\u0027s a specific commit, but I won\u0027t argue with a -1 against it unless you\u0027re providing a new PS.","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"70e508c334f34dc5d523033f409c98161ca540f6","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                  \u0027pci_stats\u0027: pci_device_pools})"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    def _resource_change(self, resources):"},{"line_number":578,"context_line":"        \"\"\"Check to see if any resources have changed.\"\"\""},{"line_number":579,"context_line":"        if cmp(resources, self.old_resources) !\u003d 0:"},{"line_number":580,"context_line":"            self.old_resources \u003d copy.deepcopy(resources)"},{"line_number":581,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"da9b358b_103bdf9d","line":578,"in_reply_to":"da9b358b_27eeb0b4","updated":"2015-03-31 14:25:52.000000000","message":"I will undo it in the next patchset","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"}],"nova/objects/pci_device.py":[{"author":{"_account_id":14271,"name":"Kallebe Monteiro","email":"kallebe.monteiro@lsbd.ufc.br","username":"kallebe"},"change_message_id":"5d2300af73b32380b772f94324514d3c8ace7e3b","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fieldls without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_74d5a941","line":31,"updated":"2015-03-27 14:05:56.000000000","message":"s/fieldls/fields","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"daa68bce3f40d72a0cd3e14e005b9fa832cd7ffc","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fieldls without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_3e828053","line":31,"in_reply_to":"fa963961_74d5a941","updated":"2015-03-29 07:40:37.000000000","message":"Done","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":14271,"name":"Kallebe Monteiro","email":"kallebe.monteiro@lsbd.ufc.br","username":"kallebe"},"change_message_id":"5d2300af73b32380b772f94324514d3c8ace7e3b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        set_b \u003d obj_b.obj_attr_is_set(name)"},{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute"},{"line_number":40,"context_line":"        # is such case there are equal"},{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_b473314d","line":40,"updated":"2015-03-27 14:05:56.000000000","message":"I think it is better as \"In such case they are equal\"","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"daa68bce3f40d72a0cd3e14e005b9fa832cd7ffc","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        set_b \u003d obj_b.obj_attr_is_set(name)"},{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute"},{"line_number":40,"context_line":"        # is such case there are equal"},{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_1e87bc62","line":40,"in_reply_to":"fa963961_b473314d","updated":"2015-03-29 07:40:37.000000000","message":"Done","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"880ed1e9f7dcf73d242bb3714a84daaedbaa8a6b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":44,"context_line":"                return False"},{"line_number":45,"context_line":"    return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_c165ca45","line":44,"updated":"2015-03-27 17:54:50.000000000","message":"I don\u0027t understand this logic. Why are you only comparing these if both are not None? If they\u0027re both set and set to None, they\u0027re equal, right?","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"daa68bce3f40d72a0cd3e14e005b9fa832cd7ffc","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":44,"context_line":"                return False"},{"line_number":45,"context_line":"    return True"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_be969092","line":44,"in_reply_to":"fa963961_c165ca45","updated":"2015-03-29 07:40:37.000000000","message":"right, but I want to avoid the case when obj_a has attribute with value None\nand in obj_b that attribute doesn\u0027t exist. \nIn such case I consider both objects as equal.\n\nThe real reason is to avoid a second unnecessary resources update.\nIn the first update self.old_resource is empty and we get the new resources.\nIn the second update the PciDevice in the old resources has some missing attributes like instance_uuid and request_id and these attributes in then new PciDevice exists but with None value.\nIn such case I don\u0027t think we need to update resources.","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"},{"author":{"_account_id":9423,"name":"Roey Chen","email":"roeyc@vmware.com","username":"roeyc"},"change_message_id":"0c7e655febb647d1c8a47cfc8018e2c3076c4470","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_b2924056","line":29,"updated":"2015-03-29 10:33:22.000000000","message":"maybe a better naming is needed, an action: e.g - \"compare_all_attr\" or \"is_all_attr_equal\" or \"compare_pci_device_attributes\"","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ac8518a3a2971c91e42177b47ca70d2dc1ef8450","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def all_things_equal(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_b548ea2e","line":29,"in_reply_to":"da9b358b_b2924056","updated":"2015-03-29 13:29:48.000000000","message":"I took the name form the numa.py, but I can see you point so I changed it to \ncompare_pci_device_attributes.","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":9423,"name":"Roey Chen","email":"roeyc@vmware.com","username":"roeyc"},"change_message_id":"0c7e655febb647d1c8a47cfc8018e2c3076c4470","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        set_b \u003d obj_b.obj_attr_is_set(name)"},{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_929f3c5f","line":40,"updated":"2015-03-29 10:33:22.000000000","message":"what if obj_a has attribute \u0027attr1\u0027 set to None and obj_b has attribute \u0027attr1\u0027 set to \u0027val\u0027. are they considered equal?\naccording to this, they are.","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ac8518a3a2971c91e42177b47ca70d2dc1ef8450","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        set_b \u003d obj_b.obj_attr_is_set(name)"},{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":"        if ((set_a and getattr(obj_a, name) is not None) and"},{"line_number":42,"context_line":"           (set_b and getattr(obj_b, name) is not None)):"},{"line_number":43,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_9555e6c7","line":40,"in_reply_to":"da9b358b_929f3c5f","updated":"2015-03-29 13:29:48.000000000","message":"you are right, I also updated a unit test to this case","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":9423,"name":"Roey Chen","email":"roeyc@vmware.com","username":"roeyc"},"change_message_id":"c493b0f37191ba4b6e29e05272f71d4bf85dd894","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if is_set_a !\u003d is_set_b:"},{"line_number":43,"context_line":"            if is_set_a and getattr(obj_a, name) is not None:"},{"line_number":44,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_d5f80e7f","line":41,"updated":"2015-03-29 14:30:41.000000000","message":"you can give \u0027getattr\u0027 a default value to return when attribute is not set.\nso the \u0027for\u0027 block can reduce to something like this:\n\nif getattr(obj_a, name, None) !\u003d getattr(obj_b, name, None):\n    return False","commit_id":"6a34b0b05a33b82efe11fe2bb244cd9c6b6c0935"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"fc284b83f152587c6dd71c535bbd4175b91911e0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # attribute can exist in one obj but its value is None"},{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if is_set_a !\u003d is_set_b:"},{"line_number":43,"context_line":"            if is_set_a and getattr(obj_a, name) is not None:"},{"line_number":44,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_752ca2ab","line":41,"in_reply_to":"da9b358b_d5f80e7f","updated":"2015-03-29 15:26:03.000000000","message":"I tried it and it didn\u0027t work. \nThis is because Nova Objects  properties have their own getter,setter and deleter, which applied by the NovaObjectMetaclass\n\nsee in base.py in function make_class_properties\ndef getter(self, name\u003dname):\n      attrname \u003d get_attrname(name)\n       if not hasattr(self, attrname):\n                self.obj_load_attr(name)\n        return getattr(self, attrname)\n\n\nand \nsetattr(cls, name, property(getter, setter, deleter))","commit_id":"6a34b0b05a33b82efe11fe2bb244cd9c6b6c0935"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"78c860ed1d4dd8e21cbb45a2055889cea279e0e7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if is_set_a !\u003d is_set_b:"},{"line_number":43,"context_line":"            if is_set_a and getattr(obj_a, name) is not None:"},{"line_number":44,"context_line":"                return False"},{"line_number":45,"context_line":"            elif is_set_b and getattr(obj_b, name) is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_e930eda0","line":42,"updated":"2015-04-01 14:46:11.000000000","message":"If they\u0027re not both set or both unset then they\u0027re different, right? Why not just return False here?","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"81c576e2723a21a8d6984dd548fa392770f6490a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # and second obj may not have this attribute which"},{"line_number":40,"context_line":"        # in such case they are equal"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if is_set_a !\u003d is_set_b:"},{"line_number":43,"context_line":"            if is_set_a and getattr(obj_a, name) is not None:"},{"line_number":44,"context_line":"                return False"},{"line_number":45,"context_line":"            elif is_set_b and getattr(obj_b, name) is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_7cd0f253","line":42,"in_reply_to":"baa041b7_e930eda0","updated":"2015-04-02 12:40:18.000000000","message":"Done","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"78c860ed1d4dd8e21cbb45a2055889cea279e0e7","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            elif is_set_b and getattr(obj_b, name) is not None:"},{"line_number":46,"context_line":"                return False"},{"line_number":47,"context_line":"        elif is_set_a:"},{"line_number":48,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":49,"context_line":"                return False"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_89ce0182","line":48,"updated":"2015-04-01 14:46:11.000000000","message":"If you don\u0027t provide a default, you will cause a lazy load on the object to try to resolve the value. Lines 43 and 45 will trigger this as well. Seems like this logic can be:\n\n if is_set_a !\u003d is_set_b:\n    return False\n if is_set_a:\n     return getattr(a, attr) \u003d\u003d getattr(b, attr)\n return True\n\nNo?","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"698f4804e91cc2df1c39154de451a07efd35c7e3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            elif is_set_b and getattr(obj_b, name) is not None:"},{"line_number":46,"context_line":"                return False"},{"line_number":47,"context_line":"        elif is_set_a:"},{"line_number":48,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":49,"context_line":"                return False"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_515f730e","line":48,"in_reply_to":"baa041b7_89ce0182","updated":"2015-04-01 18:51:27.000000000","message":"Agreed with Dan","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"81c576e2723a21a8d6984dd548fa392770f6490a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            elif is_set_b and getattr(obj_b, name) is not None:"},{"line_number":46,"context_line":"                return False"},{"line_number":47,"context_line":"        elif is_set_a:"},{"line_number":48,"context_line":"            if getattr(obj_a, name) !\u003d getattr(obj_b, name):"},{"line_number":49,"context_line":"                return False"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_dc481e30","line":48,"in_reply_to":"baa041b7_89ce0182","updated":"2015-04-02 12:40:18.000000000","message":"I think you mean \nif getattr(a, attr) !\u003d getattr(b, attr):\n    return False \nbecause we need to check all the attributes.","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4d6e74f138408d403def426e4007282862253e81","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.extra_info \u003d {}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __eq__(self, other):"},{"line_number":156,"context_line":"        return compare_pci_device_attributes(self, other)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __ne__(self, other):"},{"line_number":159,"context_line":"        return not (self \u003d\u003d other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da9b358b_27f8f048","line":156,"updated":"2015-03-31 10:57:37.000000000","message":"mmm, actually that reminds me a discussion I had with PaulMurray about the equality operator for a patch he was writing :\n\nhttps://review.openstack.org/#/c/165037/\n\nWe finally agreed on defining https://review.openstack.org/#/c/165037/4/nova/objects/base.py,cm instead of using __eq__\n\nCould you please mock that method within that object now and leave a big fat TODO comment saying that it would be worth calling the base operator once merged ?","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"698f4804e91cc2df1c39154de451a07efd35c7e3","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.extra_info \u003d {}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __eq__(self, other):"},{"line_number":156,"context_line":"        return compare_pci_device_attributes(self, other)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __ne__(self, other):"},{"line_number":159,"context_line":"        return not (self \u003d\u003d other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_5148935b","line":156,"in_reply_to":"baa041b7_89b0418d","updated":"2015-04-01 18:51:27.000000000","message":"Ok, after discussing on IRC, I\u0027m fine with that point, nevermind my comment","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"78c860ed1d4dd8e21cbb45a2055889cea279e0e7","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.extra_info \u003d {}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __eq__(self, other):"},{"line_number":156,"context_line":"        return compare_pci_device_attributes(self, other)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __ne__(self, other):"},{"line_number":159,"context_line":"        return not (self \u003d\u003d other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa041b7_89b0418d","line":156,"in_reply_to":"da9b358b_133be99d","updated":"2015-04-01 14:46:11.000000000","message":"It\u0027s fine to define __eq__ on an object, IMHO. Just don\u0027t do it on the base object.","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"70e508c334f34dc5d523033f409c98161ca540f6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.extra_info \u003d {}"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __eq__(self, other):"},{"line_number":156,"context_line":"        return compare_pci_device_attributes(self, other)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __ne__(self, other):"},{"line_number":159,"context_line":"        return not (self \u003d\u003d other)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da9b358b_133be99d","line":156,"in_reply_to":"da9b358b_27f8f048","updated":"2015-03-31 14:25:52.000000000","message":"1) removing the __eq__ will complicate the compare in PciDeviceStats Object, because the pool is a dict which contains mixture of primitive types and objects (PciDevice)\nmaybe we should keep the __eq__ and it will call obj_equal_prims, what do you think?\n\n\n2) the compare  obj_equal_prims return False in the scenario  below and mine return True. \nattribute can exist in one obj but its value is None\nand second obj may not have this attribute which\nin such case they are equal \n\nThe reason for this is to avoid a second unnecessary resources update. In the first update self.old_resource is empty and we get the new resources. In the second update the PciDevice in the old resources has some missing attributes like instance_uuid and request_id and these attributes in then new PciDevice exists but with None value. In such case I don\u0027t think we need to update resources.\nI can update obj_equal_prims to behave as my function, I just wandering if you agree to update it.","commit_id":"93e8edf33cf4d8f4065f97fe6d94c68a4dd12c45"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2ca79c94d86f196cc4e8623ec5d7168bd2bb7955","unresolved":false,"context_lines":[{"line_number":29,"context_line":"def compare_pci_device_attributes(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"},{"line_number":35,"context_line":"    for name in pci_fields:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa041b7_a86e2dc7","line":32,"updated":"2015-04-02 16:48:37.000000000","message":"nit: the code is self-explanatory, you don\u0027t need to put a comment like this","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b719d28afd089ce8375679e1cba617c9cdc4e427","unresolved":false,"context_lines":[{"line_number":29,"context_line":"def compare_pci_device_attributes(obj_a, obj_b):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"},{"line_number":35,"context_line":"    for name in pci_fields:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_b201783a","line":32,"in_reply_to":"baa041b7_a86e2dc7","updated":"2015-04-10 11:22:32.000000000","message":"Done","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2ca79c94d86f196cc4e8623ec5d7168bd2bb7955","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"},{"line_number":35,"context_line":"    for name in pci_fields:"},{"line_number":36,"context_line":"        is_set_a \u003d obj_a.obj_attr_is_set(name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa041b7_28dc5d11","line":33,"updated":"2015-04-02 16:48:37.000000000","message":"mmm, here the problem would be about any extra field that could be added afterwards.\n\nIf then, I think it would maybe better to call obj_fields instead and while iterating, remove the PersistentObject\n\nThat said, this is a bikeshed, so I won\u0027t -1 for it because we can modify this helper if we need to add an extra field without bumping an new version, just because it\u0027s not a remotable method.","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b719d28afd089ce8375679e1cba617c9cdc4e427","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # compare only the pci fields without the nova"},{"line_number":32,"context_line":"    # persistent fields which are timestamps"},{"line_number":33,"context_line":"    pci_fields \u003d (set(PciDevice.fields.keys()) -"},{"line_number":34,"context_line":"                  set(base.NovaPersistentObject.fields.keys()))"},{"line_number":35,"context_line":"    for name in pci_fields:"},{"line_number":36,"context_line":"        is_set_a \u003d obj_a.obj_attr_is_set(name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_a63edd25","line":33,"in_reply_to":"baa041b7_28dc5d11","updated":"2015-04-10 11:22:32.000000000","message":"Done","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"b44581ec09370a7f29b5f1da5bf015db247809b6","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        return compare_pci_device_attributes(self, other)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def __ne__(self, other):"},{"line_number":151,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @staticmethod"},{"line_number":154,"context_line":"    def _from_db_object(context, pci_device, db_dev):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_a3cd10b9","line":151,"updated":"2015-04-08 07:27:49.000000000","message":"It is little bit confessing to read and slower than just calling the module method.\n\nIt is just a note feel free to ignore.","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"}],"nova/pci/stats.py":[{"author":{"_account_id":14271,"name":"Kallebe Monteiro","email":"kallebe.monteiro@lsbd.ufc.br","username":"kallebe"},"change_message_id":"5d2300af73b32380b772f94324514d3c8ace7e3b","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        self.pools \u003d []"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def __eq__(self, other):"},{"line_number":253,"context_line":"        return cmp(self.pools, other.pools) \u003d\u003d 0"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def __ne__(self, other):"},{"line_number":256,"context_line":"        return not (self \u003d\u003d other)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_f47419d0","line":253,"updated":"2015-03-27 14:05:56.000000000","message":"I think we should consider future python 3 compatibility, but for now it is ok, I guess. See http://python3porting.com/differences.html#comparisons","commit_id":"1658b26651b531e3b8a5b00d78ec12bbdef30736"}],"nova/tests/unit/objects/test_pci_device.py":[{"author":{"_account_id":9423,"name":"Roey Chen","email":"roeyc@vmware.com","username":"roeyc"},"change_message_id":"0c7e655febb647d1c8a47cfc8018e2c3076c4470","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict2)"},{"line_number":226,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def test_pci_device_equivalent_with_none(self):"},{"line_number":229,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":230,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":231,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_32a630c2","line":228,"updated":"2015-03-29 10:33:22.000000000","message":"missing a test for a case where obj_a.instance_uuid \u003d \u0027uuid\u0027 and obj_b.instance_uuid \u003d None.","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ac8518a3a2971c91e42177b47ca70d2dc1ef8450","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict2)"},{"line_number":226,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def test_pci_device_equivalent_with_none(self):"},{"line_number":229,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":230,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":231,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_555e3eea","line":228,"in_reply_to":"da9b358b_32a630c2","updated":"2015-03-29 13:29:48.000000000","message":"Done","commit_id":"d7abed300d581a9c6acbaf0596d02340771fa13d"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"7788c16a253d3826b889ef517a30b43923e88267","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(self.dev_dict)"},{"line_number":214,"context_line":"        self.assertEqual(1, self.pci_device.numa_node)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def test_pci_device_equivalent(self):"},{"line_number":217,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":218,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":219,"context_line":"        self.assertEqual(pci_device1, pci_device2)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_de60a2a7","line":216,"updated":"2015-04-09 15:51:58.000000000","message":"I think you should also add a test in which you just modify a field from PersistentObject and test equality.","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b719d28afd089ce8375679e1cba617c9cdc4e427","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(self.dev_dict)"},{"line_number":214,"context_line":"        self.assertEqual(1, self.pci_device.numa_node)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def test_pci_device_equivalent(self):"},{"line_number":217,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":218,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":219,"context_line":"        self.assertEqual(pci_device1, pci_device2)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_1ff5c855","line":216,"in_reply_to":"9aa53dc9_86fe3eac","updated":"2015-04-10 11:22:32.000000000","message":"Done","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"7081cc5379df5c13d79a2d76187388e772046dea","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(self.dev_dict)"},{"line_number":214,"context_line":"        self.assertEqual(1, self.pci_device.numa_node)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def test_pci_device_equivalent(self):"},{"line_number":217,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":218,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":219,"context_line":"        self.assertEqual(pci_device1, pci_device2)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_86fe3eac","line":216,"in_reply_to":"9aa53dc9_de60a2a7","updated":"2015-04-10 06:24:50.000000000","message":"+1 for Claudiu\u0027s comment","commit_id":"26e20ebdda89b68483f2ed5f027811686515c16f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea6b71f0630bd0b8b8d39d093ea0fb476ae6f86f","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def test_pci_device_equivalent_with_ignore_field(self):"},{"line_number":224,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":225,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":226,"context_line":"        setattr(pci_device2, \u0027updated_at\u0027, timeutils.utcnow())"},{"line_number":227,"context_line":"        self.assertEqual(pci_device1, pci_device2)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_pci_device_not_equivalent1(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_23b92dea","line":226,"updated":"2015-04-20 19:43:47.000000000","message":"Why not pci_device2.updated_at \u003d timeutils.utcnow()?","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"22eff1f0a7a65658f7b49b29ff9ad57a4c73af31","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def test_pci_device_equivalent_with_ignore_field(self):"},{"line_number":224,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":225,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":226,"context_line":"        setattr(pci_device2, \u0027updated_at\u0027, timeutils.utcnow())"},{"line_number":227,"context_line":"        self.assertEqual(pci_device1, pci_device2)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_pci_device_not_equivalent1(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_4652ee68","line":226,"in_reply_to":"dac4157f_23b92dea","updated":"2015-04-20 20:51:56.000000000","message":"Done","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea6b71f0630bd0b8b8d39d093ea0fb476ae6f86f","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    def test_pci_device_not_equivalent2(self):"},{"line_number":237,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":238,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":239,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, \u0027aaa\u0027)"},{"line_number":240,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def test_pci_device_not_equivalent_with_none(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_e3cb3571","line":239,"updated":"2015-04-20 19:43:47.000000000","message":"ditto","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"22eff1f0a7a65658f7b49b29ff9ad57a4c73af31","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    def test_pci_device_not_equivalent2(self):"},{"line_number":237,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":238,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":239,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, \u0027aaa\u0027)"},{"line_number":240,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def test_pci_device_not_equivalent_with_none(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_c665de45","line":239,"in_reply_to":"dac4157f_c3e270d5","updated":"2015-04-20 20:51:56.000000000","message":"Done","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"081486b3a51ae399d8080ea71085016218dd8718","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    def test_pci_device_not_equivalent2(self):"},{"line_number":237,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":238,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":239,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, \u0027aaa\u0027)"},{"line_number":240,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def test_pci_device_not_equivalent_with_none(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_c3e270d5","line":239,"in_reply_to":"dac4157f_e3cb3571","updated":"2015-04-20 20:14:17.000000000","message":"It would be more interesting to delattr on pci_device2 so the hasattr check in obj_attr_is_set returns False.","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea6b71f0630bd0b8b8d39d093ea0fb476ae6f86f","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    def test_pci_device_not_equivalent_with_none(self):"},{"line_number":243,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":244,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":245,"context_line":"        setattr(pci_device1, \u0027instance_uuid\u0027, \u0027aaa\u0027)"},{"line_number":246,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, None)"},{"line_number":247,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_83a119ac","line":245,"updated":"2015-04-20 19:43:47.000000000","message":"ditto","commit_id":"40016700224efab0381408cfb80f6660f4d11692"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"22eff1f0a7a65658f7b49b29ff9ad57a4c73af31","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    def test_pci_device_not_equivalent_with_none(self):"},{"line_number":243,"context_line":"        pci_device1 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":244,"context_line":"        pci_device2 \u003d pci_device.PciDevice.create(dev_dict)"},{"line_number":245,"context_line":"        setattr(pci_device1, \u0027instance_uuid\u0027, \u0027aaa\u0027)"},{"line_number":246,"context_line":"        setattr(pci_device2, \u0027instance_uuid\u0027, None)"},{"line_number":247,"context_line":"        self.assertNotEqual(pci_device1, pci_device2)"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dac4157f_067516f8","line":245,"in_reply_to":"dac4157f_83a119ac","updated":"2015-04-20 20:51:56.000000000","message":"Done","commit_id":"40016700224efab0381408cfb80f6660f4d11692"}]}
