)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"serialization format."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Still to be fixed is the InstanceNUMATopology side of things. This patch"},{"line_number":27,"context_line":"only solves the ComputeNode\u0027s NUMATopology object serialization."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I2b9c9bdfc2456bb66df06e85c1d59fbd9a50ec30"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da86d52c_070d64e9","line":27,"updated":"2015-02-04 10:02:17.000000000","message":"This is absolutely not true! InstanceNUMATopology has been fixed since I0e8ca96296fb88aa7a26fae1e476275a23e0c6bb\n\nI assume that this paragraph was put in before we did the cleanup there,  and can be removed now.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"173f9084a6000e54b926ec5b7cb377986b50ed2a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"serialization format."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Still to be fixed is the InstanceNUMATopology side of things. This patch"},{"line_number":27,"context_line":"only solves the ComputeNode\u0027s NUMATopology object serialization."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I2b9c9bdfc2456bb66df06e85c1d59fbd9a50ec30"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da86d52c_7ea3f9ff","line":27,"in_reply_to":"da86d52c_070d64e9","updated":"2015-02-04 16:26:15.000000000","message":"A small correction - if this relates to obj_to_primitive being used for compatibility - then yes - this should get fixed there too, but I don\u0027t think we should move this code out of the InstanceNUMATopology object","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"}],"nova/compute/claims.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7f08c5c03d83402c262f977a9025317b924c2b13","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            pci_stats \u003d None"},{"line_number":211,"context_line":"            if pci_requests.requests:"},{"line_number":212,"context_line":"                pci_stats \u003d self.tracker.pci_tracker.stats"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            instance_topology \u003d ("},{"line_number":215,"context_line":"                    hardware.numa_fit_instance_to_host("},{"line_number":216,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab921fb_fbed4b8f","side":"PARENT","line":213,"updated":"2015-04-22 18:04:44.000000000","message":"unrelated change?","commit_id":"2141620d47c919e9cafea9846cabc323142b844e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"a93b2d8e5f7458be396f99eec223ffb7d81d393a","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            pci_stats \u003d None"},{"line_number":211,"context_line":"            if pci_requests.requests:"},{"line_number":212,"context_line":"                pci_stats \u003d self.tracker.pci_tracker.stats"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            instance_topology \u003d ("},{"line_number":215,"context_line":"                    hardware.numa_fit_instance_to_host("},{"line_number":216,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab921fb_bf5e8943","side":"PARENT","line":213,"in_reply_to":"bab921fb_fbed4b8f","updated":"2015-04-23 06:59:51.000000000","message":":)","commit_id":"2141620d47c919e9cafea9846cabc323142b844e"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        # numa topology requested :("},{"line_number":542,"context_line":"        # TODO(jaypipes): Remove this hack once the resource object"},{"line_number":543,"context_line":"        # models blueprint is implemented, which will remove the need"},{"line_number":544,"context_line":"        # to compare resource classes differently."},{"line_number":545,"context_line":"        old_top \u003d self.old_resources.get(\u0027numa_topology\u0027)"},{"line_number":546,"context_line":"        new_top \u003d resources.get(\u0027numa_topology\u0027, None)"},{"line_number":547,"context_line":"        if old_top is not None and new_top is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_aa18dd1e","line":544,"updated":"2015-02-04 10:02:17.000000000","message":"IMHO - 1) this code really belongs in objects 2) this optimization where we don\u0027t update the scheduler if there were no changes this way is crude anyway. I\u0027d rather see it gone than adding this _here_.\n\nFWIW - it would work previously (I think) since we were comparing strings.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9cb6438e00a626cdfe783a4da01d34ded31ba7af","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        # numa topology requested :("},{"line_number":542,"context_line":"        # TODO(jaypipes): Remove this hack once the resource object"},{"line_number":543,"context_line":"        # models blueprint is implemented, which will remove the need"},{"line_number":544,"context_line":"        # to compare resource classes differently."},{"line_number":545,"context_line":"        old_top \u003d self.old_resources.get(\u0027numa_topology\u0027)"},{"line_number":546,"context_line":"        new_top \u003d resources.get(\u0027numa_topology\u0027, None)"},{"line_number":547,"context_line":"        if old_top is not None and new_top is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_0dbe96ae","line":544,"in_reply_to":"da86d52c_aa18dd1e","updated":"2015-02-17 18:27:21.000000000","message":"Done","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"d3581ac8314882ec6968c5139d97a95a1bcd3bf2","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # TODO(berrange): remove this once all virt drivers are updated"},{"line_number":394,"context_line":"        # to report topology"},{"line_number":395,"context_line":"        # TODO(sahid): The attribute numa_topology should be removed"},{"line_number":396,"context_line":"        # from ComputeNode in favor of numa_topology_obj."},{"line_number":397,"context_line":"        if \"numa_topology\" not in resources:"},{"line_number":398,"context_line":"            resources[\"numa_topology_obj\"] \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_f17c2322","line":395,"updated":"2015-04-23 14:52:23.000000000","message":"I need a special attention here.\n\nPlease see: http://logs.openstack.org/89/152689/14/check/gate-nova-tox-functional/7b2859f/testr_results.html.gz","commit_id":"0c924804339f743b2797d81b27c9db354c7164f9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"dc9fdcb3955ba82e80cd1a50e614b48d0f4466c3","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # TODO(berrange): remove this once all virt drivers are updated"},{"line_number":394,"context_line":"        # to report topology"},{"line_number":395,"context_line":"        # TODO(sahid): The attribute numa_topology should be removed"},{"line_number":396,"context_line":"        # from ComputeNode in favor of numa_topology_obj."},{"line_number":397,"context_line":"        if \"numa_topology\" not in resources:"},{"line_number":398,"context_line":"            resources[\"numa_topology_obj\"] \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_ac23c9a6","line":395,"in_reply_to":"bab921fb_316dfb04","updated":"2015-04-24 07:55:12.000000000","message":"I cannot do that. The problem here is now numa_topology is an object and it will be passed to db/sqlalchemy/apy.py#compute_node_create to store a new compute node.\n\nI guess we need to convert resources to be a ComputeNode object.","commit_id":"0c924804339f743b2797d81b27c9db354c7164f9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"cea98cf57c304bdbfeff6c3b5f9d272b04f81445","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # TODO(berrange): remove this once all virt drivers are updated"},{"line_number":394,"context_line":"        # to report topology"},{"line_number":395,"context_line":"        # TODO(sahid): The attribute numa_topology should be removed"},{"line_number":396,"context_line":"        # from ComputeNode in favor of numa_topology_obj."},{"line_number":397,"context_line":"        if \"numa_topology\" not in resources:"},{"line_number":398,"context_line":"            resources[\"numa_topology_obj\"] \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_316dfb04","line":395,"in_reply_to":"bab921fb_f17c2322","updated":"2015-04-23 14:56:14.000000000","message":"Hum actually i can just make the driver libvirt to return numa_topology_obj","commit_id":"0c924804339f743b2797d81b27c9db354c7164f9"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"6824af4e73958760a80a7aeae896ae1c16dd5f68","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    convert_objects_related_datetimes(values, *datetime_keys)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"    compute_node_ref \u003d models.ComputeNode()"},{"line_number":548,"context_line":"    compute_node_ref.update(values)"},{"line_number":549,"context_line":"    compute_node_ref.save()"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    return compute_node_ref"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_7a576158","side":"PARENT","line":548,"updated":"2015-02-25 17:14:22.000000000","message":"In values we have now for the key \u0027numa_topology\u0027 an object NUMATopology. What I do not understand is why when we call the method \u0027save\u0027 we don\u0027t use the overridded one in objects/compute_node.py and so the real bug probably comes from here.","commit_id":"07d3c0d6d1172e692b6e4735c00fdc71464d76d0"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"d76f1caaa8065a8a72572774cbf5783a7e1b8da1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from oslo_db.sqlalchemy import session as db_session"},{"line_number":32,"context_line":"from oslo_db.sqlalchemy import utils as sqlalchemyutils"},{"line_number":33,"context_line":"from oslo_log import log as logging"},{"line_number":34,"context_line":"from oslo_serialization import jsonutils"},{"line_number":35,"context_line":"from oslo_utils import excutils"},{"line_number":36,"context_line":"from oslo_utils import timeutils"},{"line_number":37,"context_line":"import retrying"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_7c4d8599","line":34,"updated":"2015-02-26 10:59:06.000000000","message":"needs to be remove","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"}],"nova/objects/compute_node.py":[{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                # Older numa topology field uses the legacy JSON format"},{"line_number":88,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":89,"context_line":"                        primitive[\u0027numa_topology\u0027])"},{"line_number":90,"context_line":"                primitive[\u0027numa_topology\u0027] \u003d numa_obj._to_legacy_dict()"},{"line_number":91,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":92,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":93,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_2dddf5e0","line":90,"updated":"2015-02-04 00:15:54.000000000","message":"should we remove the numa_topology_obj if target_version \u003c 11?","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                # Older numa topology field uses the legacy JSON format"},{"line_number":88,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":89,"context_line":"                        primitive[\u0027numa_topology\u0027])"},{"line_number":90,"context_line":"                primitive[\u0027numa_topology\u0027] \u003d numa_obj._to_legacy_dict()"},{"line_number":91,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":92,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":93,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_874a3424","line":90,"in_reply_to":"da86d52c_2dddf5e0","updated":"2015-02-04 10:02:17.000000000","message":"yes we should but no big deal really","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                # Older numa topology field uses the legacy JSON format"},{"line_number":88,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":89,"context_line":"                        primitive[\u0027numa_topology\u0027])"},{"line_number":90,"context_line":"                primitive[\u0027numa_topology\u0027] \u003d numa_obj._to_legacy_dict()"},{"line_number":91,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":92,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":93,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_ff652c1e","line":90,"in_reply_to":"da86d52c_874a3424","updated":"2015-02-04 14:47:50.000000000","message":"No, it\u0027s already gone at that point because of the superclass instantiation above.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"240755b62270109df7a77ff70c2298a1d67f6789","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                # Older numa topology field uses the legacy JSON format"},{"line_number":88,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":89,"context_line":"                        primitive[\u0027numa_topology\u0027])"},{"line_number":90,"context_line":"                primitive[\u0027numa_topology\u0027] \u003d numa_obj._to_legacy_dict()"},{"line_number":91,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":92,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":93,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_f5970dea","line":90,"in_reply_to":"da86d52c_ff652c1e","updated":"2015-02-04 16:20:16.000000000","message":"Ah right - because we use the obj_relationships... was still early.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # new numa_topology_obj field. If the string coming from the DB is the"},{"line_number":162,"context_line":"        # *new* nova.objects serialized format, then we simply just load the"},{"line_number":163,"context_line":"        # NUMATopology object into the numa_topology_obj field and leave the"},{"line_number":164,"context_line":"        # numa_topology field empty."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        db_numa \u003d db_compute.get(\u0027numa_topology\u0027)"},{"line_number":167,"context_line":"        if db_numa is not None and db_numa !\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_2d25e75b","line":164,"updated":"2015-02-04 10:02:17.000000000","message":"Actually I really see no point in basically moving this code out of the NUMATopology class - what gives? Just call it\u0027s methods that already do all this stuff, same like we do for Instance and InstanceNUMATopology","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # new numa_topology_obj field. If the string coming from the DB is the"},{"line_number":162,"context_line":"        # *new* nova.objects serialized format, then we simply just load the"},{"line_number":163,"context_line":"        # NUMATopology object into the numa_topology_obj field and leave the"},{"line_number":164,"context_line":"        # numa_topology field empty."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        db_numa \u003d db_compute.get(\u0027numa_topology\u0027)"},{"line_number":167,"context_line":"        if db_numa is not None and db_numa !\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_9a127e55","line":164,"in_reply_to":"da86d52c_2d25e75b","updated":"2015-02-04 14:47:50.000000000","message":"Because changing that code will change what it stored in the DB, or how it\u0027s pulled out. These versioned objects are where we\u0027ve agreed we\u0027ll store those routines so that they\u0027re close to the rest of the versioning stuff and have the highest likelihood of having a change combined with a proper version bump.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        if db_numa is not None and db_numa !\u003d \u0027\u0027:"},{"line_number":168,"context_line":"            if \u0027nova_object.name\u0027 not in db_numa:"},{"line_number":169,"context_line":"                legacy_numa \u003d jsonutils.loads(db_numa)"},{"line_number":170,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(legacy_numa)"},{"line_number":171,"context_line":"                compute.numa_topology_obj \u003d numa_obj"},{"line_number":172,"context_line":"            else:"},{"line_number":173,"context_line":"                db_numa \u003d jsonutils.loads(db_numa)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_a81473a0","line":170,"updated":"2015-02-04 00:15:54.000000000","message":"A minor thing is, not sure if we can have api like objects.NUMATopology._from_db(), which will wrap all such legacy/new format check in the NUMATopology itself, and the caller don\u0027t need care for them? It will reduce duplicated code at host_manager, and will make easier cleanup when major version bump.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":175,"context_line":"                        db_numa, context\u003dcontext)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":178,"context_line":"                for cell in numa_obj.cells:"},{"line_number":179,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":180,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_e81e6b5e","line":177,"updated":"2015-02-04 00:15:54.000000000","message":"IMHO, I assume that if a nova object saved to DB as primitive, it should have all changes reset. Not sure if  we may mask some error if blindly reset all changes here. Waiting for Dan\u0027s input.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"2b9254cdaff0e44eaee0cdca4b2c9df69fca47b0","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":175,"context_line":"                        db_numa, context\u003dcontext)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":178,"context_line":"                for cell in numa_obj.cells:"},{"line_number":179,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":180,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_156ff392","line":177,"in_reply_to":"da86d52c_1a55aefa","updated":"2015-02-12 21:28:44.000000000","message":"Dan/sahid, why there are changes left since we  reset all changes in _convert_numa_topology_to_db_format(), which will put the data into DB.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"1a0a1207bfdab665ec8d76c58d95911ff415593c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":175,"context_line":"                        db_numa, context\u003dcontext)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":178,"context_line":"                for cell in numa_obj.cells:"},{"line_number":179,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":180,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_f6a8008f","line":177,"in_reply_to":"da86d52c_a7bc9807","updated":"2015-02-04 11:20:39.000000000","message":"Actually you have some change fields here because of default values added in the constructor of objects.NUMACell, I have fixed this issue for objects.InstanceNUMACell and I believe it could be added in my work to set a default value to the attribute mempages","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":175,"context_line":"                        db_numa, context\u003dcontext)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":178,"context_line":"                for cell in numa_obj.cells:"},{"line_number":179,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":180,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_a7bc9807","line":177,"in_reply_to":"da86d52c_e81e6b5e","updated":"2015-02-04 10:02:17.000000000","message":"Agreed see below","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                numa_obj \u003d objects.NUMATopology.obj_from_primitive("},{"line_number":175,"context_line":"                        db_numa, context\u003dcontext)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":178,"context_line":"                for cell in numa_obj.cells:"},{"line_number":179,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":180,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_1a55aefa","line":177,"in_reply_to":"da86d52c_f6a8008f","updated":"2015-02-04 14:47:50.000000000","message":"Sahid is right. Remember how I said I hated that? :)","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                        for page in cell.mempages:"},{"line_number":181,"context_line":"                            page.obj_reset_changes()"},{"line_number":182,"context_line":"                    cell.obj_reset_changes()"},{"line_number":183,"context_line":"                compute.numa_topology_obj \u003d numa_obj"},{"line_number":184,"context_line":"        else:"},{"line_number":185,"context_line":"            compute.numa_topology_obj \u003d None"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_e8566bcd","line":183,"updated":"2015-02-04 00:15:54.000000000","message":"So is the numa_topology be read_only or should not be accessed anymore? Combining this and the obj_load_attr, I think no access to the legacy numa_topology allowed anymore, right? If yes, can you please add some comments in the field definition, so that we are sure of that in future.\n\nAlso this code seems is mismatch with obj_load_attr(), which will try to translate the numa_topology_obj from numva_topology, but to me there is no chance that the numa_topology will be set at all.\n\nI must miss something.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            if self.obj_attr_is_set(\u0027numa_topology\u0027):"},{"line_number":199,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":200,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":201,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":202,"context_line":"                for cell in numa_obj.cells:"},{"line_number":203,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":204,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c87b678a","line":201,"updated":"2015-02-04 00:15:54.000000000","message":"Should we do the obj_reset_changes after setting self.numa_topology, and be obj_reset_changes([\u0027numa_topology\u0027])?","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            if self.obj_attr_is_set(\u0027numa_topology\u0027):"},{"line_number":199,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":200,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":201,"context_line":"                numa_obj.obj_reset_changes()"},{"line_number":202,"context_line":"                for cell in numa_obj.cells:"},{"line_number":203,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":204,"context_line":"                        for page in cell.mempages:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_7a986ac0","line":201,"in_reply_to":"da86d52c_c87b678a","updated":"2015-02-04 14:47:50.000000000","message":"Yes. See Instance.obj_load_attr()","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"49b4d8becf62092a94edb6ba2e040b8db01e9355","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                    if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":204,"context_line":"                        for page in cell.mempages:"},{"line_number":205,"context_line":"                            page.obj_reset_changes()"},{"line_number":206,"context_line":"                    cell.obj_reset_changes()"},{"line_number":207,"context_line":"                self.numa_topology_obj \u003d numa_obj"},{"line_number":208,"context_line":"            else:"},{"line_number":209,"context_line":"                self.numa_topology \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_286a43b3","line":206,"updated":"2015-02-04 00:15:54.000000000","message":"ditto","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":289,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools.obj_to_primitive())"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def _convert_numa_topology_to_db_format(self, updates):"},{"line_number":292,"context_line":"        if \u0027numa_topology_obj\u0027 in updates or \u0027numa_topology\u0027 in updates:"},{"line_number":293,"context_line":"            # We rely on the lazy-load of numa_topology_obj to do any"},{"line_number":294,"context_line":"            # conversion necessary"},{"line_number":295,"context_line":"            topo \u003d self.numa_topology_obj"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_0ddbc350","line":292,"updated":"2015-02-04 10:02:17.000000000","message":"Same for this here - why move it out of the NUMA object?","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":298,"context_line":"                    for page in cell.mempages:"},{"line_number":299,"context_line":"                        page.obj_reset_changes()"},{"line_number":300,"context_line":"                cell.obj_reset_changes()"},{"line_number":301,"context_line":"            topo.obj_reset_changes()"},{"line_number":302,"context_line":"            updates.pop(\u0027numa_topology_obj\u0027, None)"},{"line_number":303,"context_line":"            updates[\u0027numa_topology\u0027] \u003d jsonutils.dumps(topo.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c7e26c2e","line":300,"updated":"2015-02-04 10:02:17.000000000","message":"I am not sure how useful keeping track of changes is for objects that get saved as json.\n\nSo I propose to either add a flag that will allow NovaObject subclasses to not track this at all if they don\u0027t care. or additionally - make obj_reset_changes recurse into subobjects like obj_what_changed does.\n\nBut having this code here for the sake of being pedantic seems wrong to me.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"240755b62270109df7a77ff70c2298a1d67f6789","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":298,"context_line":"                    for page in cell.mempages:"},{"line_number":299,"context_line":"                        page.obj_reset_changes()"},{"line_number":300,"context_line":"                cell.obj_reset_changes()"},{"line_number":301,"context_line":"            topo.obj_reset_changes()"},{"line_number":302,"context_line":"            updates.pop(\u0027numa_topology_obj\u0027, None)"},{"line_number":303,"context_line":"            updates[\u0027numa_topology\u0027] \u003d jsonutils.dumps(topo.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_1b8e8fd0","line":300,"in_reply_to":"da86d52c_5a456615","updated":"2015-02-04 16:20:16.000000000","message":"My problem with this is twofold 1) that we are now doing the internal bookkeeping of NUMA object here - but as discussed on IRC - I\u0027m cool with this whole method going there.\n\n2) is that even if we don\u0027t save them, we either have to do all the resets in all the right places (if we want to use them for debugging for example) or they may be wrong at any point, which makes me wander why have them at all\n\nBut it does not have to be part of this patch really - the best would be to just get rid of saving them here, and keep all the resets in the right places (but not outside of the NUMA object) and then decide what to do in a different patch","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                if cell.obj_attr_is_set(\u0027mempages\u0027):"},{"line_number":298,"context_line":"                    for page in cell.mempages:"},{"line_number":299,"context_line":"                        page.obj_reset_changes()"},{"line_number":300,"context_line":"                cell.obj_reset_changes()"},{"line_number":301,"context_line":"            topo.obj_reset_changes()"},{"line_number":302,"context_line":"            updates.pop(\u0027numa_topology_obj\u0027, None)"},{"line_number":303,"context_line":"            updates[\u0027numa_topology\u0027] \u003d jsonutils.dumps(topo.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_5a456615","line":300,"in_reply_to":"da86d52c_c7e26c2e","updated":"2015-02-04 14:47:50.000000000","message":"There\u0027s a patch up for the recursion option. I don\u0027t see any reason not to track such things, we just don\u0027t want/need to persist them in the database.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"92a1443b08988d64b11921c425e33205abcf15f9","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        compute.pci_device_pools \u003d pci_device_pool.from_pci_stats(pci_stats)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        db_numa \u003d db_compute.get(\u0027numa_topology\u0027)"},{"line_number":162,"context_line":"        LOG.error(\"In ComputeNode._from_db_object(), db_compute[\u0027numa_topology\u0027] is %r\", db_numa)"},{"line_number":163,"context_line":"        numa_obj \u003d objects.NUMATopology._from_db_object(context, db_numa)"},{"line_number":164,"context_line":"        compute.numa_topology_obj \u003d numa_obj"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_16902749","line":162,"updated":"2015-02-24 23:04:31.000000000","message":"Will you remove this LOG finally?\n\nOne thing come to my mind but I\u0027m not quite sure is, do we need to set the numa_topology field here also? For example, when the format in DB is primitive model, we should translate to legacy_dict and save it in the numa_topology field.","commit_id":"cc8b4d08475c657e4dce6347e7389477348a5935"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e0a0d383f238e936282c5af1214e185fb942d517","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        compute.pci_device_pools \u003d pci_device_pool.from_pci_stats(pci_stats)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        db_numa \u003d db_compute.get(\u0027numa_topology\u0027)"},{"line_number":162,"context_line":"        LOG.error(\"In ComputeNode._from_db_object(), db_compute[\u0027numa_topology\u0027] is %r\", db_numa)"},{"line_number":163,"context_line":"        numa_obj \u003d objects.NUMATopology._from_db_object(context, db_numa)"},{"line_number":164,"context_line":"        compute.numa_topology_obj \u003d numa_obj"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_2f268d68","line":162,"in_reply_to":"ba7be1f8_16902749","updated":"2015-02-25 16:47:38.000000000","message":"Hi Yunhong, yeah the LOG.error statements are trying to help us debug what\u0027s going on in the test failures...\n\nAs for your second question, yes, that is the point of the code above on lines 88-93.\n\nBest,\n\n-jay","commit_id":"cc8b4d08475c657e4dce6347e7389477348a5935"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"ec90c4f338e7b447777e30a0d1c0c590b70ce8f7","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        compute.pci_device_pools \u003d pci_device_pool.from_pci_stats(pci_stats)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        db_numa \u003d db_compute.get(\u0027numa_topology\u0027)"},{"line_number":162,"context_line":"        LOG.error(\"In ComputeNode._from_db_object(), db_compute[\u0027numa_topology\u0027] is %r\", db_numa)"},{"line_number":163,"context_line":"        numa_obj \u003d objects.NUMATopology._from_db_object(context, db_numa)"},{"line_number":164,"context_line":"        compute.numa_topology_obj \u003d numa_obj"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_87a67dac","line":162,"in_reply_to":"ba7be1f8_2f268d68","updated":"2015-02-25 18:45:58.000000000","message":"So, Jay, you mean this changeset will update all access for compute_node.numa_topology to be compute_node.numa_topology_obj, so that no access to the numa_topology field anymore for the new version compute_node object? Otherwise, we have to always sync the numa_topology field with the numa_topology_obj.\n\nThe code in #LN 88-93 is only when version translation.","commit_id":"cc8b4d08475c657e4dce6347e7389477348a5935"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"907c8aee43515a14ae666eea7b7e7e98347489d1","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                    self.numa_topology not in (None, \u0027\u0027)):"},{"line_number":175,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":176,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":177,"context_line":"                self.numa_topology_obj \u003d numa_obj"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                self.numa_topology \u003d None"},{"line_number":180,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_dd704442","line":177,"updated":"2015-02-25 18:46:12.000000000","message":"I\u0027m not sure if we should really load the numa_topology_obj from numa_topology here since the numa_topology_obj and numa_topology is not synced.\n\na) Seems we don\u0027t populate the numa_topology field at all during _from_db_object(), so IIUC, the numa_topology field will never be set, this code will never be executed.\n\nb) If my understanding is wrong, and the numa_topology is populated, if a caller update the numa_topology_obj and then get it, the numa_topology_obj will be overwritten and the update will be lost.\n\nAlso, I\u0027d suggest to give some warning, if exception is overkill, if someone try to access the deprecated numa_topology field.","commit_id":"0a5ab41dfc8314b5e5a3e8a07d567bb65ead6ce5"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"ed081573ba0f40688072fc7ba977900b028635d0","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                    self.numa_topology not in (None, \u0027\u0027)):"},{"line_number":175,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":176,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":177,"context_line":"                self.numa_topology_obj \u003d numa_obj"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                self.numa_topology \u003d None"},{"line_number":180,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_78b83f2a","line":177,"in_reply_to":"ba7be1f8_3570900a","updated":"2015-02-25 21:57:40.000000000","message":"Aha, this code will not run if _obj is already set, thanks for pointing this out.\n\nThe upgrade should be ok. Thanks.","commit_id":"0a5ab41dfc8314b5e5a3e8a07d567bb65ead6ce5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5c43c97c576608972519159535f741b5a3695775","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                    self.numa_topology not in (None, \u0027\u0027)):"},{"line_number":175,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":176,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":177,"context_line":"                self.numa_topology_obj \u003d numa_obj"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                self.numa_topology \u003d None"},{"line_number":180,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_3570900a","line":177,"in_reply_to":"ba7be1f8_dd704442","updated":"2015-02-25 21:45:29.000000000","message":"We\u0027ll never run this code if _obj is already set, so I don\u0027t think we need to worry about trashing the newer _obj version. If your point is that some older code may provide an update in numa_toplology which we won\u0027t notice if the object is already loaded/converted, then we should handle that (or log a warning for that) in the _convert_numa_topology_to_db_format() handler below.\n\nIf the above understanding is correct, I\u0027ll let Jay comment on whether this is an upgrade problem or not. I\u0027m not sure when that field actually gets updated.","commit_id":"0a5ab41dfc8314b5e5a3e8a07d567bb65ead6ce5"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b11ec2f01bde33441861522ec4c067ca64f8a715","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":172,"context_line":"        if attrname \u003d\u003d \u0027numa_topology_obj\u0027:"},{"line_number":173,"context_line":"            if (self.obj_attr_is_set(\u0027numa_topology\u0027) and"},{"line_number":174,"context_line":"                    self.numa_topology not in (None, \u0027\u0027)):"},{"line_number":175,"context_line":"                old_top \u003d jsonutils.loads(self.numa_topology)"},{"line_number":176,"context_line":"                numa_obj \u003d objects.NUMATopology._from_legacy_dict(old_top)"},{"line_number":177,"context_line":"                self.numa_topology_obj \u003d numa_obj"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_2a5d3f49","line":174,"updated":"2015-02-27 12:28:19.000000000","message":"Not sure what\u0027s the point of the \u0027not in\u0027 check is. To avoid an empty dict? - that relly should never happen and _from_legacy_dict will likely blow up then?","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"aee49dfbc0782d065941fbdfe6f4dbbe209c25bc","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \u0027stats\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":64,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":65,"context_line":"        \u0027numa_topology\u0027: fields.StringField(nullable\u003dTrue, read_only\u003dTrue),"},{"line_number":66,"context_line":"        \u0027numa_topology_obj\u0027: fields.ObjectField(\u0027NUMATopology\u0027, nullable\u003dTrue),"},{"line_number":67,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":68,"context_line":"        # supported_instances field in the database"},{"line_number":69,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_808a48bd","line":66,"updated":"2015-03-05 21:24:56.000000000","message":"I\u0027m still concerned if the \u0027read_only\u0027 change to the old field is not enough. Currently the old/new field is not synced, so if someone wrongly reading data from old field, or we left some code accessing the old field unchanged, it will be a bug and not easy to be figured out.","commit_id":"b7146f9831b9ff70b692dd0beb9603a1a6e2d285"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9fec373a4e2cc78d8b7bfa13ea76494480945f9d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \u0027stats\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"},{"line_number":64,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":65,"context_line":"        \u0027numa_topology\u0027: fields.StringField(nullable\u003dTrue, read_only\u003dTrue),"},{"line_number":66,"context_line":"        \u0027numa_topology_obj\u0027: fields.ObjectField(\u0027NUMATopology\u0027, nullable\u003dTrue),"},{"line_number":67,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":68,"context_line":"        # supported_instances field in the database"},{"line_number":69,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_d75fa3e3","line":66,"in_reply_to":"9a80dd14_808a48bd","updated":"2015-03-05 21:52:32.000000000","message":"This is a valid concern, but I think we\u0027re okay here. If anything, we should unset the old attribute any time we convert from old to new, and never set it in the first place during loading. That will cause an exception to be raised if any code continues to reference the attribute which will bring those issues to the forefront quickly.","commit_id":"b7146f9831b9ff70b692dd0beb9603a1a6e2d285"}],"nova/objects/numa.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    }"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def obj_from_primitive(cls, primitive):"},{"line_number":161,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":162,"context_line":"            obj_topology \u003d super(NUMATopology, cls).obj_from_primitive("},{"line_number":163,"context_line":"                primitive)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_8de6d313","side":"PARENT","line":160,"updated":"2015-02-04 10:02:17.000000000","message":"This really should stay here and not move to the compute node class. We should also add save() methods and call them from compute_node obj, _not_ move all of this stuff there.","commit_id":"bb1a6b6dda291d40f5a02723b7ef46c4ac8d747c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    }"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def obj_from_primitive(cls, primitive):"},{"line_number":161,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":162,"context_line":"            obj_topology \u003d super(NUMATopology, cls).obj_from_primitive("},{"line_number":163,"context_line":"                primitive)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_bad90224","side":"PARENT","line":160,"in_reply_to":"da86d52c_8de6d313","updated":"2015-02-04 14:47:50.000000000","message":"I disagree! I complained about this originally. IMHO, the object interface here should be pristine. It should do nothing other than convert a proper object serialized form into an object, and fail if that is not possible. That should have certain guarantees, like that we know that no changes were pending against the serialized object, and that we know it came from a certain version.\n\nThis hack breaks that guarantee, and means that this object can be serialized from proper form, or this other form which can actually change based on an external \"library\" of code. Further, objects deserialized with this method will take the maximum version of this object as defined locally (which will change over time) since that information is not provided in the serialized form.\n\nIMHO, this is not a thing we should do on an object in the general sense, but rather provide the compatibility in the place where we know it\u0027s potentially in old format, and that is the compute node where we stored it as an unversioned blob. The code being on the object here would allow us to deserialize this over the wire from the old format, and we should never do or support that.","commit_id":"bb1a6b6dda291d40f5a02723b7ef46c4ac8d747c"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"240755b62270109df7a77ff70c2298a1d67f6789","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    }"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def obj_from_primitive(cls, primitive):"},{"line_number":161,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":162,"context_line":"            obj_topology \u003d super(NUMATopology, cls).obj_from_primitive("},{"line_number":163,"context_line":"                primitive)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_bb7823c5","side":"PARENT","line":160,"in_reply_to":"da86d52c_bad90224","updated":"2015-02-04 16:20:16.000000000","message":"I agree with the point about obj_to_pirmitive staying pristine - but would still like to see some of the compat code move back to this object.","commit_id":"bb1a6b6dda291d40f5a02723b7ef46c4ac8d747c"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    obj_relationships \u003d {"},{"line_number":41,"context_line":"        \u0027mempages\u0027: [(\u00271.2\u0027, \u00271.0\u0027)]"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_2d8167fb","line":41,"updated":"2015-02-04 10:02:17.000000000","message":"This should really be a separate bugfix.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3498436896b047117ff9269bfa60e7b9a7ed7ab","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    obj_relationships \u003d {"},{"line_number":41,"context_line":"        \u0027mempages\u0027: [(\u00271.2\u0027, \u00271.0\u0027)]"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_7a286ae2","line":41,"in_reply_to":"da86d52c_1b113d5d","updated":"2015-02-04 14:47:50.000000000","message":"Yeah, this and the other one in this patch.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"195bcebc06673d681ab17a7a13d143054071617f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    obj_relationships \u003d {"},{"line_number":41,"context_line":"        \u0027mempages\u0027: [(\u00271.2\u0027, \u00271.0\u0027)]"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_1b113d5d","line":41,"in_reply_to":"da86d52c_2d8167fb","updated":"2015-02-04 11:11:56.000000000","message":"Agreed, i\u0027m currently working on this it\u0027s related to https://bugs.launchpad.net/nova/+bug/1417201 - I have patch ready but i\u0027m waiting to know if you want to do it before to push it. Thanks.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9cb6438e00a626cdfe783a4da01d34ded31ba7af","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    obj_relationships \u003d {"},{"line_number":41,"context_line":"        \u0027mempages\u0027: [(\u00271.2\u0027, \u00271.0\u0027)]"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c940d209","line":41,"in_reply_to":"da86d52c_7a286ae2","updated":"2015-02-17 18:27:21.000000000","message":"Done","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"195bcebc06673d681ab17a7a13d143054071617f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        }"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    obj_relationships \u003d {"},{"line_number":154,"context_line":"        \u0027cells\u0027: [(\u00271.0\u0027, \u00271.0\u0027),"},{"line_number":155,"context_line":"                  (\u00271.1\u0027, \u00271.1\u0027),"},{"line_number":156,"context_line":"                  (\u00271.2\u0027, \u00271.2\u0027)]"},{"line_number":157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_7b0b192a","line":154,"updated":"2015-02-04 11:11:56.000000000","message":"yep!","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9cb6438e00a626cdfe783a4da01d34ded31ba7af","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        }"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    obj_relationships \u003d {"},{"line_number":154,"context_line":"        \u0027cells\u0027: [(\u00271.0\u0027, \u00271.0\u0027),"},{"line_number":155,"context_line":"                  (\u00271.1\u0027, \u00271.1\u0027),"},{"line_number":156,"context_line":"                  (\u00271.2\u0027, \u00271.2\u0027)]"},{"line_number":157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_094aea26","line":154,"in_reply_to":"da86d52c_7b0b192a","updated":"2015-02-17 18:27:21.000000000","message":"Done","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b11ec2f01bde33441861522ec4c067ca64f8a715","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # actually representing the exact same stuff. If they are,"},{"line_number":182,"context_line":"        # we set old and new to the exact same object reference."},{"line_number":183,"context_line":"        for a_cell, b_cell in zip(self.cells, other.cells):"},{"line_number":184,"context_line":"            for a_page, b_page in zip(a_cell.mempages,"},{"line_number":185,"context_line":"                                      b_cell.mempages):"},{"line_number":186,"context_line":"                if not all(["},{"line_number":187,"context_line":"                        a_page.size_kb \u003d\u003d b_page,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_0d0ed534","line":184,"updated":"2015-02-27 12:28:19.000000000","message":"Shouldn\u0027t we actually move these to their respective objects as well instead of inlining them here like this. And then we could do just a_cell \u003d\u003d b_cell...","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"c39cff03e2c0d25f9ae90cd62586293032409b77","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            for a_page, b_page in zip(a_cell.mempages,"},{"line_number":185,"context_line":"                                      b_cell.mempages):"},{"line_number":186,"context_line":"                if not all(["},{"line_number":187,"context_line":"                        a_page.size_kb \u003d\u003d b_page,"},{"line_number":188,"context_line":"                        a_page.total \u003d\u003d b_page.total,"},{"line_number":189,"context_line":"                        a_page.used \u003d\u003d b_page.used"},{"line_number":190,"context_line":"                        ]):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_73b9d2ca","line":187,"updated":"2015-02-27 23:56:33.000000000","message":"a_page.size_kb \u003d\u003d b_page.size_kb","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b11ec2f01bde33441861522ec4c067ca64f8a715","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                        a_page.used \u003d\u003d b_page.used"},{"line_number":190,"context_line":"                        ]):"},{"line_number":191,"context_line":"                    return False"},{"line_number":192,"context_line":"            if not all(["},{"line_number":193,"context_line":"                    a_cell.id \u003d\u003d b_cell.id,"},{"line_number":194,"context_line":"                    a_cell.cpuset \u003d\u003d b_cell.cpuset,"},{"line_number":195,"context_line":"                    a_cell.memory \u003d\u003d b_cell.memory,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_8d19e57b","line":192,"updated":"2015-02-27 12:28:19.000000000","message":"More or less the same here...\n\nPlus these could easily be a separate patch.","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"c39cff03e2c0d25f9ae90cd62586293032409b77","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                    a_cell.cpu_usage \u003d\u003d b_cell.cpu_usage,"},{"line_number":197,"context_line":"                    a_cell.memory_usage \u003d\u003d b_cell.memory_usage,"},{"line_number":198,"context_line":"                    a_cell.pinned_cpus \u003d\u003d b_cell.pinned_cpus,"},{"line_number":199,"context_line":"                    a_cell.siblings \u003d\u003d b_cell.siblings"},{"line_number":200,"context_line":"                    ]):"},{"line_number":201,"context_line":"                return False"},{"line_number":202,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_13f2569a","line":199,"updated":"2015-02-27 23:56:33.000000000","message":"Maybe \u0027for\u0027 is better here...","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b11ec2f01bde33441861522ec4c067ca64f8a715","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            # fix it here, and follow up with removing this when the"},{"line_number":50,"context_line":"            # RT is converted to proper objects."},{"line_number":51,"context_line":"            updates[\u0027stats\u0027] \u003d jsonutils.loads(updates[\u0027stats\u0027])"},{"line_number":52,"context_line":"        if isinstance(updates.get(\u0027numa_topology\u0027), objects.NUMATopology):"},{"line_number":53,"context_line":"            updates[\u0027numa_topology_obj\u0027] \u003d updates.pop(\u0027numa_topology\u0027)"},{"line_number":54,"context_line":"        compute_node \u003d objects.ComputeNode(context\u003dcontext,"},{"line_number":55,"context_line":"                                           id\u003dcompute_node_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_ed8261c7","line":52,"updated":"2015-02-27 12:28:19.000000000","message":"Not sure why would need this check - we want to make sure we set it even if it\u0027s None.","commit_id":"b80b5ecf93a280e65fd2458e199f0609700dc13f"}],"nova/scheduler/host_manager.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.updated \u003d compute[\u0027updated_at\u0027]"},{"line_number":205,"context_line":"        # TODO(jaypipes): Remove this hack once HostStateManager is storing"},{"line_number":206,"context_line":"        # objects. ComputeNode._from_db_object() takes care of all of this..."},{"line_number":207,"context_line":"        db_numa \u003d compute.get(\u0027numa_topology\u0027)"},{"line_number":208,"context_line":"        if db_numa is not None and db_numa !\u003d \u0027\u0027:"},{"line_number":209,"context_line":"            if \u0027nova_object.name\u0027 not in db_numa:"},{"line_number":210,"context_line":"                legacy_numa \u003d jsonutils.loads(db_numa)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_ed066f85","line":207,"updated":"2015-02-04 10:02:17.000000000","message":"I think sylvain moves this to objects in his work - rebase on that?","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9cb6438e00a626cdfe783a4da01d34ded31ba7af","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.updated \u003d compute[\u0027updated_at\u0027]"},{"line_number":205,"context_line":"        # TODO(jaypipes): Remove this hack once HostStateManager is storing"},{"line_number":206,"context_line":"        # objects. ComputeNode._from_db_object() takes care of all of this..."},{"line_number":207,"context_line":"        db_numa \u003d compute.get(\u0027numa_topology\u0027)"},{"line_number":208,"context_line":"        if db_numa is not None and db_numa !\u003d \u0027\u0027:"},{"line_number":209,"context_line":"            if \u0027nova_object.name\u0027 not in db_numa:"},{"line_number":210,"context_line":"                legacy_numa \u003d jsonutils.loads(db_numa)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_c90e12e5","line":207,"in_reply_to":"da86d52c_ed066f85","updated":"2015-02-17 18:27:21.000000000","message":"Done","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"b11ec2f01bde33441861522ec4c067ca64f8a715","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                                          instance_cells)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        # Calculate the numa usage"},{"line_number":270,"context_line":"        updated_numa_topology \u003d hardware.get_host_numa_usage_from_instance("},{"line_number":271,"context_line":"                self, instance)"},{"line_number":272,"context_line":"        self.numa_topology \u003d updated_numa_topology"},{"line_number":273,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_0d17b552","side":"PARENT","line":270,"updated":"2015-02-27 12:28:19.000000000","message":"Pls rebase on top of this https://review.openstack.org/#/c/156930/","commit_id":"3f7957ca354ffea45566b1213a0241e7217d7e91"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7f08c5c03d83402c262f977a9025317b924c2b13","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        self.vcpus_used \u003d compute.vcpus_used"},{"line_number":213,"context_line":"        self.updated \u003d compute.updated_at"},{"line_number":214,"context_line":"        self.pci_stats \u003d pci_stats.PciDeviceStats("},{"line_number":215,"context_line":"            compute.pci_device_pools)"},{"line_number":216,"context_line":"        self.numa_topology \u003d compute.numa_topology_obj"},{"line_number":217,"context_line":"        self.pci_stats \u003d pci_stats.PciDeviceStats("},{"line_number":218,"context_line":"            compute.pci_device_pools)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab921fb_9e24fdaf","line":215,"updated":"2015-04-22 18:04:44.000000000","message":"This is added a couple lines down. Maybe a rebase conflict?","commit_id":"98a272c3b7fd5f68502198768295b930c77d506b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"a93b2d8e5f7458be396f99eec223ffb7d81d393a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        self.vcpus_used \u003d compute.vcpus_used"},{"line_number":213,"context_line":"        self.updated \u003d compute.updated_at"},{"line_number":214,"context_line":"        self.pci_stats \u003d pci_stats.PciDeviceStats("},{"line_number":215,"context_line":"            compute.pci_device_pools)"},{"line_number":216,"context_line":"        self.numa_topology \u003d compute.numa_topology_obj"},{"line_number":217,"context_line":"        self.pci_stats \u003d pci_stats.PciDeviceStats("},{"line_number":218,"context_line":"            compute.pci_device_pools)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab921fb_5f7e4daf","line":215,"in_reply_to":"bab921fb_9e24fdaf","updated":"2015-04-23 06:59:51.000000000","message":"Oh yes there was a conflict here and i did not notice it was already fixed line 217.","commit_id":"98a272c3b7fd5f68502198768295b930c77d506b"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"867f8da21e4a9930d765bb5854b948ee84693e68","unresolved":false,"context_lines":[{"line_number":649,"context_line":"    def assertEqualNUMAHostTopology(self, expected, got):"},{"line_number":650,"context_line":"        if \u0027nova_object.name\u0027 in got:"},{"line_number":651,"context_line":"            got \u003d obj_base.NovaObject.obj_from_primitive("},{"line_number":652,"context_line":"                jsonutils.loads(got))"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        attrs \u003d (\u0027cpuset\u0027, \u0027memory\u0027, \u0027id\u0027, \u0027cpu_usage\u0027, \u0027memory_usage\u0027)"},{"line_number":655,"context_line":"        if None in (expected, got):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_0f54ce1f","line":652,"updated":"2015-03-05 18:53:23.000000000","message":"I added this which makes the tests pass. That means that the assertions about length and content of these two things are right, but we\u0027re getting the serialized object form in compute_node[\u0027numa_topology\u0027]. Looking at the test, it\u0027s still treating compute_node as a dict, so I\u0027m not actually sure what the proper fix here is.","commit_id":"b7146f9831b9ff70b692dd0beb9603a1a6e2d285"}],"nova/virt/hardware.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":1291,"context_line":""},{"line_number":1292,"context_line":""},{"line_number":1293,"context_line":"# TODO(ndipanov): Remove when all code paths are using objects"},{"line_number":1294,"context_line":"def host_topology_and_format_from_host(host):"},{"line_number":1295,"context_line":"    \"\"\"Convenience method for getting the numa_topology out of hosts"},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    Since we may get a host as either a dict, a db object, or an actual"}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_4a868114","side":"PARENT","line":1294,"updated":"2015-02-04 10:02:17.000000000","message":"Happy to see this gone!","commit_id":"bb1a6b6dda291d40f5a02723b7ef46c4ac8d747c"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"87f9822d5a1a496672588a69fc78a2d51e66ed5b","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"            newcell.memory_usage \u003d max(0, memory_usage)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"        cells.append(newcell)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    return objects.NUMATopology(cells\u003dcells)"},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_8dc33388","line":1232,"updated":"2015-02-04 10:02:17.000000000","message":"not related to this patch - I was going to fix this to actually mutate the topology that is passed in like the rest of the methods do now.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"195bcebc06673d681ab17a7a13d143054071617f","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"            newcell.memory_usage \u003d max(0, memory_usage)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"        cells.append(newcell)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    return objects.NUMATopology(cells\u003dcells)"},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da86d52c_5698ecbf","line":1232,"in_reply_to":"da86d52c_8dc33388","updated":"2015-02-04 11:11:56.000000000","message":"Yes and actually I believe we have to add it in the constructor like we do for \u0027pinned_cpus\u0027 and \u0027siblings\u0027 - I can swear I had added it :). Again please let me do if you want I push my patches or if you prefer do it.","commit_id":"f85d28a9e154e30a6dc2291b7e3ee2ae6251d33a"}]}
