)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ca6863912ee4ca54db70b32c7dcf5f36041a0e2d","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Co-Authored-By: Paul Murray \u003cpmurray@hp.com\u003e"},{"line_number":33,"context_line":"Co-Authored-By: yunhong-jiang \u003cyunhong-jiang@intel.com\u003e"},{"line_number":34,"context_line":"Co-Authored-By: Ed Leafe \u003ced@leafe.com\u003e"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Change-Id: I625f13061fddfb0cdb16c8e36336656b40696447"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_b68953cc","line":34,"updated":"2014-12-09 23:56:46.000000000","message":"Eh, adding a Co-Authored-By just for a rebase seems quite hijacking the patch IMHO...\n\nPlease be more gentle and leave the commit msg for just quick fixes or really provide some new directions if you add your name...","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"851b727f330b6190a848c8a0358d35182197d684","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Co-Authored-By: Paul Murray \u003cpmurray@hp.com\u003e"},{"line_number":33,"context_line":"Co-Authored-By: yunhong-jiang \u003cyunhong-jiang@intel.com\u003e"},{"line_number":34,"context_line":"Co-Authored-By: Ed Leafe \u003ced@leafe.com\u003e"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Change-Id: I625f13061fddfb0cdb16c8e36336656b40696447"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_14aa06d4","line":34,"in_reply_to":"3a961159_b68953cc","updated":"2014-12-11 15:26:07.000000000","message":"I really don\u0027t see this as \u0027hijacking\u0027; it\u0027s simply noting that I modified the code. Paul still owns the patch.","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"}],"nova/objects/compute_node.py":[{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"c21b3bbfdf69d27b8e46b648a000a08bcf62bc72","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if host_ip:"},{"line_number":114,"context_line":"            updates[\u0027host_ip\u0027] \u003d str(host_ip)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _convert_supported_instances_to_db_format(selfself, updates):"},{"line_number":117,"context_line":"        hv_specs \u003d updates.pop(\u0027supported_hv_specs\u0027, None)"},{"line_number":118,"context_line":"        if hv_specs is not None:"},{"line_number":119,"context_line":"            hv_specs \u003d [hv_spec.to_list() for hv_spec in hv_specs]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_9ffc3eb7","side":"PARENT","line":116,"updated":"2014-12-02 17:51:38.000000000","message":"I thought you\u0027d like that.","commit_id":"18a932efb3d690602d617c08559ad9ec499c14db"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"64a87e7acb497d4b41ee9ddcacda7580ac5adf3c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if host_ip:"},{"line_number":114,"context_line":"            updates[\u0027host_ip\u0027] \u003d str(host_ip)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _convert_supported_instances_to_db_format(selfself, updates):"},{"line_number":117,"context_line":"        hv_specs \u003d updates.pop(\u0027supported_hv_specs\u0027, None)"},{"line_number":118,"context_line":"        if hv_specs is not None:"},{"line_number":119,"context_line":"            hv_specs \u003d [hv_spec.to_list() for hv_spec in hv_specs]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_cf48fdb5","side":"PARENT","line":116,"updated":"2014-12-01 18:29:39.000000000","message":"ha! :)","commit_id":"18a932efb3d690602d617c08559ad9ec499c14db"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"64a87e7acb497d4b41ee9ddcacda7580ac5adf3c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":59,"context_line":"        # supported_instances field in the database"},{"line_number":60,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"},{"line_number":61,"context_line":"        \u0027pci_stats\u0027: fields.ListOfObjectsField(\u0027PciPool\u0027),"},{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_af4d71c6","line":61,"updated":"2014-12-01 18:29:39.000000000","message":"Can we call the field \"pci_device_pools\" instead of the vague pci_stats?","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a0c8cf3ae1d6040766072c394873e5218df9ef9a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":59,"context_line":"        # supported_instances field in the database"},{"line_number":60,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"},{"line_number":61,"context_line":"        \u0027pci_stats\u0027: fields.ListOfObjectsField(\u0027PciPool\u0027),"},{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_8a56a35c","line":61,"in_reply_to":"5a890539_7f687288","updated":"2014-12-03 09:07:28.000000000","message":"Well, I\u0027m not against changing name. I\u0027m just saying that for backwards compatibility, we need to handle the naming translation when converting the object to a dict or if we consider using it in the HostManager.\n\nThat said, as this patch is critical, I don\u0027t want to spend further time in debating about names, so whatever you decide is good to me.","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"70098b75b477528f7c6ad757852d7de1ad5bbd5a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":59,"context_line":"        # supported_instances field in the database"},{"line_number":60,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"},{"line_number":61,"context_line":"        \u0027pci_stats\u0027: fields.ListOfObjectsField(\u0027PciPool\u0027),"},{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_ddec37be","line":61,"in_reply_to":"5a890539_af4d71c6","updated":"2014-12-01 19:24:49.000000000","message":"This is really a good idea. I tried to keep the pci_stats itself as an object.","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"c21b3bbfdf69d27b8e46b648a000a08bcf62bc72","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # NOTE(pmurray): the supported_hv_specs field maps to the"},{"line_number":59,"context_line":"        # supported_instances field in the database"},{"line_number":60,"context_line":"        \u0027supported_hv_specs\u0027: fields.ListOfObjectsField(\u0027HVSpec\u0027),"},{"line_number":61,"context_line":"        \u0027pci_stats\u0027: fields.ListOfObjectsField(\u0027PciPool\u0027),"},{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_7f687288","line":61,"in_reply_to":"5a890539_ddec37be","updated":"2014-12-02 17:51:38.000000000","message":"I like this, so I am willing to do it, but sylvain objected on irc. I will leave like this for now and we can argue on the review to decide what to do. Sylvain\u0027s argument was that the word pci_stats is used throughout tempest tests etc. so we should leave it alone.","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ad5129f495e3c73707d68fe07530adcc6ec05dd0","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        pci_stats \u003d db_compute.get(\u0027pci_stats\u0027)"},{"line_number":104,"context_line":"        if pci_stats:"},{"line_number":105,"context_line":"            pools \u003d jsonutils.loads(pci_stats)"},{"line_number":106,"context_line":"            pools \u003d [objects.PciDevicePool.from_dict(pool) for pool in pools]"},{"line_number":107,"context_line":"            compute[\u0027pci_device_pools\u0027] \u003d pools"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        compute._context \u003d context"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_d0caac6e","line":106,"updated":"2014-12-05 15:47:02.000000000","message":"Yeah I missed it when reviewing but indeed you just need to do\n\npools \u003d obj_base.obj_make_list(context, PciDevicePoolList, PciDevicePool, db_pools)","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"91852b91420a5e6e99a53435ba69b44bc3d4befe","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        pci_stats \u003d db_compute.get(\u0027pci_stats\u0027)"},{"line_number":104,"context_line":"        if pci_stats:"},{"line_number":105,"context_line":"            pools \u003d jsonutils.loads(pci_stats)"},{"line_number":106,"context_line":"            pools \u003d [objects.PciDevicePool.from_dict(pool) for pool in pools]"},{"line_number":107,"context_line":"            compute[\u0027pci_device_pools\u0027] \u003d pools"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        compute._context \u003d context"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_a784035e","line":106,"in_reply_to":"5a890539_d0caac6e","updated":"2014-12-05 16:29:54.000000000","message":"Do you mean we should have another object as PciDevicePolList?","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e68e629216cabe8e65a9881f89e028d50b6c6a5","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":140,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":141,"context_line":"        if pools:"},{"line_number":142,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":143,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_44dfe2d6","line":142,"updated":"2014-12-05 14:35:01.000000000","message":"Ugh - I\u0027d really rather we use the standard object serialization by means of obj_to/from_primitive than this.\n\nWe did this with NUMA and decided it was a bad idea so we changed it - we should not make that mistake again.","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"91852b91420a5e6e99a53435ba69b44bc3d4befe","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":140,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":141,"context_line":"        if pools:"},{"line_number":142,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":143,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_e7cc4bbe","line":142,"in_reply_to":"5a890539_44dfe2d6","updated":"2014-12-05 16:29:54.000000000","message":"I thought this is a good idea to make the list in the ComputeNode object, instead of ObjectList . So you think we should use ObjectList, right?","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"435e0cf6d86c0c5abf56af87617d47fd4b5756d8","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":140,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":141,"context_line":"        if pools:"},{"line_number":142,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":143,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_f544fa1a","line":142,"in_reply_to":"5a890539_44dfe2d6","updated":"2014-12-05 15:11:38.000000000","message":"Yeah, agreed.","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"101bfbd466ce4c8748c6d9d179eec9895d0340b8","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":140,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":141,"context_line":"        if pools:"},{"line_number":142,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":143,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_707658a5","line":142,"in_reply_to":"5a890539_f544fa1a","updated":"2014-12-05 15:37:01.000000000","message":"Oh good catch","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ca6863912ee4ca54db70b32c7dcf5f36041a0e2d","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":198,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":199,"context_line":"        if pools:"},{"line_number":200,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":201,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_96ec5791","line":200,"updated":"2014-12-09 23:56:46.000000000","message":"see latest PS comments... You should modify it to make use of the object methods directly...\n\nI was thinking to provide a PCIDevicePoolList and use the obj_base.obj_to_primitive(pools) instead.","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"851b727f330b6190a848c8a0358d35182197d684","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def _convert_pci_stats_to_db_format(self, updates):"},{"line_number":198,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":199,"context_line":"        if pools:"},{"line_number":200,"context_line":"            pools \u003d [pool.to_dict() for pool in pools]"},{"line_number":201,"context_line":"            updates[\u0027pci_stats\u0027] \u003d jsonutils.dumps(pools)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_74918a98","line":200,"in_reply_to":"3a961159_96ec5791","updated":"2014-12-11 15:26:07.000000000","message":"Done","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"9b3c39529868296c5c1a08ed778645a4390ae713","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # Version 1.5 Add use_slave to get_by_service"},{"line_number":251,"context_line":"    # Version 1.6 ComputeNode version 1.6"},{"line_number":252,"context_line":"    # Version 1.7 ComputeNode version 1.7"},{"line_number":253,"context_line":"    # Version 1.8 ComputeNode version 1.8 + add get_all_by_host()"},{"line_number":254,"context_line":"    VERSION \u003d \u00271.8\u0027"},{"line_number":255,"context_line":"    fields \u003d {"},{"line_number":256,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_c26d329a","line":253,"updated":"2014-12-10 09:01:51.000000000","message":"The ComputeNode object is changed, then ComputeNodeList object also need changed.\n\nThere is similar patch from Dam smith https://review.openstack.org/#/c/135700/25/nova/objects/instance.py","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"851b727f330b6190a848c8a0358d35182197d684","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # Version 1.5 Add use_slave to get_by_service"},{"line_number":251,"context_line":"    # Version 1.6 ComputeNode version 1.6"},{"line_number":252,"context_line":"    # Version 1.7 ComputeNode version 1.7"},{"line_number":253,"context_line":"    # Version 1.8 ComputeNode version 1.8 + add get_all_by_host()"},{"line_number":254,"context_line":"    VERSION \u003d \u00271.8\u0027"},{"line_number":255,"context_line":"    fields \u003d {"},{"line_number":256,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_f4f49af3","line":253,"in_reply_to":"3a961159_c26d329a","updated":"2014-12-11 15:26:07.000000000","message":"Done","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"970ef38855eae9ebe85f92af22ffc9afedc3b6ba","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # Version 1.5 Add use_slave to get_by_service"},{"line_number":251,"context_line":"    # Version 1.6 ComputeNode version 1.6"},{"line_number":252,"context_line":"    # Version 1.7 ComputeNode version 1.7"},{"line_number":253,"context_line":"    # Version 1.8 ComputeNode version 1.8 + add get_all_by_host()"},{"line_number":254,"context_line":"    VERSION \u003d \u00271.8\u0027"},{"line_number":255,"context_line":"    fields \u003d {"},{"line_number":256,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_62b0fef4","line":253,"in_reply_to":"3a961159_c26d329a","updated":"2014-12-10 11:13:53.000000000","message":"Totally agreed and it also needs to update the Service object.","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"970ef38855eae9ebe85f92af22ffc9afedc3b6ba","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        \u00271.5\u0027: \u00271.5\u0027,"},{"line_number":266,"context_line":"        \u00271.6\u0027: \u00271.6\u0027,"},{"line_number":267,"context_line":"        \u00271.7\u0027: \u00271.7\u0027,"},{"line_number":268,"context_line":"        \u00271.8\u0027: \u00271.9\u0027,"},{"line_number":269,"context_line":"        }"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_05590136","line":268,"updated":"2014-12-10 11:13:53.000000000","message":"that\u0027s wrong, you need to update the ComputeNodeList too","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"851b727f330b6190a848c8a0358d35182197d684","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        \u00271.5\u0027: \u00271.5\u0027,"},{"line_number":266,"context_line":"        \u00271.6\u0027: \u00271.6\u0027,"},{"line_number":267,"context_line":"        \u00271.7\u0027: \u00271.7\u0027,"},{"line_number":268,"context_line":"        \u00271.8\u0027: \u00271.9\u0027,"},{"line_number":269,"context_line":"        }"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_14f846e4","line":268,"in_reply_to":"3a961159_05590136","updated":"2014-12-11 15:26:07.000000000","message":"Done","commit_id":"50d46ee77cf259dce48b59663efbfeaeb3fa3250"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2d3289f6314c95289d9220acd5326fe35eb977a9","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        pools \u003d None"},{"line_number":146,"context_line":"        if pci_stats:"},{"line_number":147,"context_line":"            pools \u003d base.obj_make_list(context, objects.PciDevicePoolList(),"},{"line_number":148,"context_line":"                                       objects.PciDevicePool, pci_stats)"},{"line_number":149,"context_line":"        compute.pci_device_pools \u003d pools"},{"line_number":150,"context_line":"        compute._context \u003d context"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_439d8cbb","line":148,"updated":"2014-12-11 16:34:08.000000000","message":"I like the use you make here of PciDevicePoolList so I\u0027m +1 on keeping it","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"6f047e2ff84fa1f62e00168e83c6e9085b3e291d","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        pools \u003d None"},{"line_number":146,"context_line":"        if pci_stats:"},{"line_number":147,"context_line":"            pools \u003d base.obj_make_list(context, objects.PciDevicePoolList(),"},{"line_number":148,"context_line":"                                       objects.PciDevicePool, pci_stats)"},{"line_number":149,"context_line":"        compute.pci_device_pools \u003d pools"},{"line_number":150,"context_line":"        compute._context \u003d context"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_03faa442","line":148,"updated":"2014-12-11 16:40:04.000000000","message":"This part does not need to be done this way.\n\nIn pci_stats_to_db_format() you use obj_to_primitive(), so pci_stats is not a list of primitives, it is itself a primitive. You can deserialize it as a PciDevicePoolList._obj_from_primitive()\n\nIf thats not recognized as a primitive (i.e. exception) you can try reading it in as the old format of a list of dicts.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"d1578b4552c13d6c9f08af56e7efa9a1e2f51630","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        pools \u003d None"},{"line_number":146,"context_line":"        if pci_stats:"},{"line_number":147,"context_line":"            pools \u003d base.obj_make_list(context, objects.PciDevicePoolList(),"},{"line_number":148,"context_line":"                                       objects.PciDevicePool, pci_stats)"},{"line_number":149,"context_line":"        compute.pci_device_pools \u003d pools"},{"line_number":150,"context_line":"        compute._context \u003d context"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_06e55237","line":148,"in_reply_to":"3a961159_03faa442","updated":"2014-12-11 17:19:39.000000000","message":"Ah, I didn\u0027t get that it was stored as a primitive and not a list.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2d3289f6314c95289d9220acd5326fe35eb977a9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        return cls._from_db_object(context, cls(), db_compute)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @staticmethod"},{"line_number":189,"context_line":"    def _convert_stats_to_db_format(updates):"},{"line_number":190,"context_line":"        stats \u003d updates.pop(\u0027stats\u0027, None)"},{"line_number":191,"context_line":"        if stats is not None:"},{"line_number":192,"context_line":"            updates[\u0027stats\u0027] \u003d jsonutils.dumps(stats)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_a30c703c","line":189,"updated":"2014-12-11 16:34:08.000000000","message":"that\u0027s not necessary to change this... Why are you changing it ?","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"d1578b4552c13d6c9f08af56e7efa9a1e2f51630","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        return cls._from_db_object(context, cls(), db_compute)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @staticmethod"},{"line_number":189,"context_line":"    def _convert_stats_to_db_format(updates):"},{"line_number":190,"context_line":"        stats \u003d updates.pop(\u0027stats\u0027, None)"},{"line_number":191,"context_line":"        if stats is not None:"},{"line_number":192,"context_line":"            updates[\u0027stats\u0027] \u003d jsonutils.dumps(stats)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_46b83ac8","line":189,"in_reply_to":"3a961159_a30c703c","updated":"2014-12-11 17:19:39.000000000","message":"Because it is a staticmethod? ;-) \n\nActually, because I was adding a very similar method (_convert_pci_stats_to_db_format), and noticed that it should be a staticmethod. The other methods above followed the same pattern, so it seemed inconsistent to make one a staticmethod and leave the rest.\n\nI can back those three methods out and submit a separate patch if necessary.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"6f047e2ff84fa1f62e00168e83c6e9085b3e291d","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def _convert_pci_stats_to_db_format(updates):"},{"line_number":209,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":210,"context_line":"        if pools:"},{"line_number":211,"context_line":"            updates[\u0027pci_stats\u0027] \u003d pools.obj_to_primitive(target_version\u003d\u00271.9\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @base.remotable"},{"line_number":214,"context_line":"    def create(self, context):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_c3141c46","line":211,"updated":"2014-12-11 16:40:04.000000000","message":"The target_version is not needed - without it the primitive will be the current version. If you put target_version there it will try to back port the object to that version first.\n\nIn fact the target_version is wrong anyway - pci_device_pools is a PciDevicePoolList on version 1.0. The 1.9 is the version of the ComputeNode.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2d3289f6314c95289d9220acd5326fe35eb977a9","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def _convert_pci_stats_to_db_format(updates):"},{"line_number":209,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":210,"context_line":"        if pools:"},{"line_number":211,"context_line":"            updates[\u0027pci_stats\u0027] \u003d pools.obj_to_primitive(target_version\u003d\u00271.9\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @base.remotable"},{"line_number":214,"context_line":"    def create(self, context):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_c3dedc6c","line":211,"updated":"2014-12-11 16:34:08.000000000","message":"you don\u0027t need to specify a version. Also, it doesn\u0027t work well. Please do instead : \n\n  updates[\u0027pci_stats\u0027] \u003d base.obj_to_primitive(pools)","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"d1578b4552c13d6c9f08af56e7efa9a1e2f51630","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def _convert_pci_stats_to_db_format(updates):"},{"line_number":209,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":210,"context_line":"        if pools:"},{"line_number":211,"context_line":"            updates[\u0027pci_stats\u0027] \u003d pools.obj_to_primitive(target_version\u003d\u00271.9\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    @base.remotable"},{"line_number":214,"context_line":"    def create(self, context):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_06b7123b","line":211,"in_reply_to":"3a961159_c3141c46","updated":"2014-12-11 17:19:39.000000000","message":"OK, good comments. I think I copied that pattern from somewhere.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"de26285a0facc9b17deea08fdb6f2b445dd1ed63","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                pci_stats \u003d []"},{"line_number":148,"context_line":"        pools \u003d None"},{"line_number":149,"context_line":"        if pci_stats:"},{"line_number":150,"context_line":"            pools \u003d objects.PciDevicePoolList.obj_from_primitive(pci_stats)"},{"line_number":151,"context_line":"        compute.pci_device_pools \u003d pools"},{"line_number":152,"context_line":"        compute._context \u003d context"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_3b2edc43","line":150,"updated":"2014-12-11 22:06:39.000000000","message":"I think here is a mismatch between this obj_from_primitive and the base.obj_to_primitive() in LN 213. The base.obj_to_primitive() is to switch to python primitive and it will be a dict, while this obj_from_primitive is NovaObject.obj_from_primitive(), which is mostly for object serialization and include more information like nova_object.name, nova_object.version etc.","commit_id":"da0f3c3fdc8f1488b082c0aa167552c22d4515ce"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5fda403c24785a583ba788b93a49bd392e27578d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                pci_stats \u003d jsonutils.loads(pci_stats)"},{"line_number":145,"context_line":"            except (ValueError, TypeError):"},{"line_number":146,"context_line":"                pci_stats \u003d []"},{"line_number":147,"context_line":"        pools \u003d None"},{"line_number":148,"context_line":"        if pci_stats:"},{"line_number":149,"context_line":"            pools \u003d objects.PciDevicePoolList.obj_from_primitive(pci_stats)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_92896377","line":146,"updated":"2014-12-12 10:03:28.000000000","message":"Maybe this should be None instead of []?","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"f7a8373a5f2a676f17e002f33f09dbead26452a0","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                pci_stats \u003d jsonutils.loads(pci_stats)"},{"line_number":145,"context_line":"            except (ValueError, TypeError):"},{"line_number":146,"context_line":"                pci_stats \u003d []"},{"line_number":147,"context_line":"        pools \u003d None"},{"line_number":148,"context_line":"        if pci_stats:"},{"line_number":149,"context_line":"            pools \u003d objects.PciDevicePoolList.obj_from_primitive(pci_stats)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_beac5e8d","line":146,"in_reply_to":"3a961159_92896377","updated":"2014-12-12 17:06:58.000000000","message":"The result would be the same, so sure, let\u0027s make it None.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"978ddc4d99fae33724507a5b0e4cf2cd2de6152e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            try:"},{"line_number":144,"context_line":"                pci_stats \u003d jsonutils.loads(pci_stats)"},{"line_number":145,"context_line":"            except (ValueError, TypeError):"},{"line_number":146,"context_line":"                pci_stats \u003d []"},{"line_number":147,"context_line":"        pools \u003d None"},{"line_number":148,"context_line":"        if pci_stats:"},{"line_number":149,"context_line":"            pools \u003d objects.PciDevicePoolList.obj_from_primitive(pci_stats)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b1ac8f8d","line":146,"in_reply_to":"3a961159_beac5e8d","updated":"2014-12-12 17:18:10.000000000","message":"Agreed. The field is nullable, let\u0027s use it","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"978ddc4d99fae33724507a5b0e4cf2cd2de6152e","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            db_compute[\u0027host\u0027] \u003d service.host"},{"line_number":187,"context_line":"        return cls._from_db_object(context, cls(), db_compute)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @staticmethod"},{"line_number":190,"context_line":"    def _convert_stats_to_db_format(updates):"},{"line_number":191,"context_line":"        stats \u003d updates.pop(\u0027stats\u0027, None)"},{"line_number":192,"context_line":"        if stats is not None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_d11afbc4","line":189,"updated":"2014-12-12 17:18:10.000000000","message":"still wondering why you need this...","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5fda403c24785a583ba788b93a49bd392e27578d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def _convert_pci_stats_to_db_format(updates):"},{"line_number":210,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":211,"context_line":"        if pools:"},{"line_number":212,"context_line":"            updates[\u0027pci_stats\u0027] \u003d pools.obj_to_primitive()"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @base.remotable"},{"line_number":215,"context_line":"    def create(self, context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b2dbbf4d","line":212,"updated":"2014-12-12 10:03:28.000000000","message":"The database field is a string, so in _from_db_object() you have coded:\nstring value --\u003e(json load)--\u003eprimitive--\u003e(obj_from_primitive)--\u003eobj\n\nHere you have coded:\nobj--\u003e(obj_to_primitive)--\u003eprimitive\n\nI think there should be a json.dumps() here as well. It is no necessary if primitive is being coerced to a string somewhere between here and the database, but the code would match.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"f7a8373a5f2a676f17e002f33f09dbead26452a0","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def _convert_pci_stats_to_db_format(updates):"},{"line_number":210,"context_line":"        pools \u003d updates.pop(\u0027pci_device_pools\u0027, None)"},{"line_number":211,"context_line":"        if pools:"},{"line_number":212,"context_line":"            updates[\u0027pci_stats\u0027] \u003d pools.obj_to_primitive()"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    @base.remotable"},{"line_number":215,"context_line":"    def create(self, context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_fe07c67f","line":212,"in_reply_to":"3a961159_b2dbbf4d","updated":"2014-12-12 17:06:58.000000000","message":"Good catch. Done.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"7bcc11b2802e5eef9312503c8337f684fabea5c0","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":77,"context_line":"        super(ComputeNode, self).obj_make_compatible(primitive, target_version)"},{"line_number":78,"context_line":"        target_version \u003d utils.convert_version_to_tuple(target_version)"},{"line_number":79,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":80,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":81,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_7fc2d4e9","line":78,"updated":"2014-12-15 02:27:18.000000000","message":"why needn\u0027t compatible for 1.9? I saw there is code in previous patchset","commit_id":"c3d36ead4a808ae7516a4e47e4603ccdee1a41d7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1d1b86e16a7e81642d9712518bec16e142cd7339","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":77,"context_line":"        super(ComputeNode, self).obj_make_compatible(primitive, target_version)"},{"line_number":78,"context_line":"        target_version \u003d utils.convert_version_to_tuple(target_version)"},{"line_number":79,"context_line":"        if target_version \u003c (1, 7) and \u0027host\u0027 in primitive:"},{"line_number":80,"context_line":"            del primitive[\u0027host\u0027]"},{"line_number":81,"context_line":"        if target_version \u003c (1, 5) and \u0027numa_topology\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_b128e1e2","line":78,"in_reply_to":"3a961159_7fc2d4e9","updated":"2014-12-15 15:45:50.000000000","message":"Because the patch by dansmith got merged (https://review.openstack.org/#/c/140065/). This uses the `obj_relationships` dict defined just above this to handle the compatibility.","commit_id":"c3d36ead4a808ae7516a4e47e4603ccdee1a41d7"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"7bcc11b2802e5eef9312503c8337f684fabea5c0","unresolved":false,"context_lines":[{"line_number":253,"context_line":"    # Version 1.5 Add use_slave to get_by_service"},{"line_number":254,"context_line":"    # Version 1.6 ComputeNode version 1.6"},{"line_number":255,"context_line":"    # Version 1.7 ComputeNode version 1.7"},{"line_number":256,"context_line":"    # Version 1.8 ComputeNode version 1.8 + add get_all_by_host()"},{"line_number":257,"context_line":"    VERSION \u003d \u00271.8\u0027"},{"line_number":258,"context_line":"    fields \u003d {"},{"line_number":259,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_9f9ea005","line":256,"updated":"2014-12-15 02:27:18.000000000","message":"this version need bump to 1.9. Because ComputeNode bumped.","commit_id":"c3d36ead4a808ae7516a4e47e4603ccdee1a41d7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1d1b86e16a7e81642d9712518bec16e142cd7339","unresolved":false,"context_lines":[{"line_number":253,"context_line":"    # Version 1.5 Add use_slave to get_by_service"},{"line_number":254,"context_line":"    # Version 1.6 ComputeNode version 1.6"},{"line_number":255,"context_line":"    # Version 1.7 ComputeNode version 1.7"},{"line_number":256,"context_line":"    # Version 1.8 ComputeNode version 1.8 + add get_all_by_host()"},{"line_number":257,"context_line":"    VERSION \u003d \u00271.8\u0027"},{"line_number":258,"context_line":"    fields \u003d {"},{"line_number":259,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_05e16f29","line":256,"in_reply_to":"3a961159_9f9ea005","updated":"2014-12-15 15:45:50.000000000","message":"Good catch. Done.","commit_id":"c3d36ead4a808ae7516a4e47e4603ccdee1a41d7"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ad7389ecbd3d99802c6f74f4850d721feae320ec","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        \u00271.5\u0027: \u00271.5\u0027,"},{"line_number":270,"context_line":"        \u00271.6\u0027: \u00271.6\u0027,"},{"line_number":271,"context_line":"        \u00271.7\u0027: \u00271.7\u0027,"},{"line_number":272,"context_line":"        \u00271.8\u0027: \u00271.9\u0027,"},{"line_number":273,"context_line":"        \u00271.9\u0027: \u00271.9\u0027,"},{"line_number":274,"context_line":"        }"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_076ebe96","line":272,"updated":"2014-12-16 06:42:40.000000000","message":"This line shouldn\u0027t be touched.","commit_id":"3cde5996d67d54cf3961e64609f016e1605bb3ab"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"d455ba2e63789b50e2c3f5381c890a829d6a5cdd","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        \u00271.5\u0027: \u00271.5\u0027,"},{"line_number":270,"context_line":"        \u00271.6\u0027: \u00271.6\u0027,"},{"line_number":271,"context_line":"        \u00271.7\u0027: \u00271.7\u0027,"},{"line_number":272,"context_line":"        \u00271.8\u0027: \u00271.9\u0027,"},{"line_number":273,"context_line":"        \u00271.9\u0027: \u00271.9\u0027,"},{"line_number":274,"context_line":"        }"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_dbe1eaff","line":272,"in_reply_to":"3a961159_076ebe96","updated":"2014-12-16 10:46:02.000000000","message":"Done","commit_id":"3cde5996d67d54cf3961e64609f016e1605bb3ab"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"07cd3468db704d6f83a8d4791d24a13e5253e688","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        if host_ip:"},{"line_number":191,"context_line":"            updates[\u0027host_ip\u0027] \u003d str(host_ip)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def _convert_supported_instances_to_db_format(updates):"},{"line_number":195,"context_line":"        hv_specs \u003d updates.pop(\u0027supported_hv_specs\u0027, None)"},{"line_number":196,"context_line":"        if hv_specs is not None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_b98f912d","line":193,"updated":"2014-12-17 17:44:56.000000000","message":"These changes don\u0027t seem related to the patch at hand, so I\u0027d really rather they be in a patch ahead of this one, just so that the git history doesn\u0027t make it look like these lines were related to this pci stuff.","commit_id":"6fbf84b8a4f8e708d3c2e61cd68334ea0f5e5cd4"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ad0577defe508cb7850c9279d0f91cace9d42895","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        if host_ip:"},{"line_number":191,"context_line":"            updates[\u0027host_ip\u0027] \u003d str(host_ip)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def _convert_supported_instances_to_db_format(updates):"},{"line_number":195,"context_line":"        hv_specs \u003d updates.pop(\u0027supported_hv_specs\u0027, None)"},{"line_number":196,"context_line":"        if hv_specs is not None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_4bf32f0a","line":193,"in_reply_to":"3a961159_b98f912d","updated":"2014-12-17 21:13:40.000000000","message":"They are related in the sense that I added another _convert* method, and noted that the new one was a staticmethod. It did seem like a legit cleanup to make them all consistent.","commit_id":"6fbf84b8a4f8e708d3c2e61cd68334ea0f5e5cd4"}],"nova/objects/pci_device_pool.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ad5129f495e3c73707d68fe07530adcc6ec05dd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5a890539_10c5145c","line":53,"updated":"2014-12-05 15:47:02.000000000","message":"PCIDevicePoolList is worth it here based on my comment in the ComputeNode object","commit_id":"cc393ab0ee9f0058c1401ad39b8212b3a4d49f1f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2d3289f6314c95289d9220acd5326fe35eb977a9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # NOTE(pmurray): for backward compatibility the PciDevicePool is"},{"line_number":34,"context_line":"    # stored in the database as a dict"},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def from_dict(cls, value):"},{"line_number":37,"context_line":"        pool_dict \u003d copy.copy(value)"},{"line_number":38,"context_line":"        pool \u003d cls()"},{"line_number":39,"context_line":"        pool.vendor_id \u003d pool_dict.pop(\"vendor_id\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_23724011","line":36,"updated":"2014-12-11 16:34:08.000000000","message":"Ditto below, that sounds unnecessary or at least a bit hacky.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"6f047e2ff84fa1f62e00168e83c6e9085b3e291d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # NOTE(pmurray): for backward compatibility the PciDevicePool is"},{"line_number":34,"context_line":"    # stored in the database as a dict"},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def from_dict(cls, value):"},{"line_number":37,"context_line":"        pool_dict \u003d copy.copy(value)"},{"line_number":38,"context_line":"        pool \u003d cls()"},{"line_number":39,"context_line":"        pool.vendor_id \u003d pool_dict.pop(\"vendor_id\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_63c368ed","line":36,"in_reply_to":"3a961159_23724011","updated":"2014-12-11 16:40:04.000000000","message":"This is needed to decode the old format - there will exisiting db entries","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b9663e59d5982e48ada162ff5c5fb77e2c340ade","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # NOTE(pmurray): for backward compatibility the PciDevicePool is"},{"line_number":34,"context_line":"    # stored in the database as a dict"},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def from_dict(cls, value):"},{"line_number":37,"context_line":"        pool_dict \u003d copy.copy(value)"},{"line_number":38,"context_line":"        pool \u003d cls()"},{"line_number":39,"context_line":"        pool.vendor_id \u003d pool_dict.pop(\"vendor_id\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_49d20d5d","line":36,"in_reply_to":"3a961159_63c368ed","updated":"2014-12-11 17:11:00.000000000","message":"Ok, I see the point now.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2d3289f6314c95289d9220acd5326fe35eb977a9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        pool.tags.update(pool_dict)"},{"line_number":44,"context_line":"        return pool"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def to_dict(self):"},{"line_number":47,"context_line":"        fixed_keys \u003d (\u0027product_id\u0027, \u0027vendor_id\u0027, \u0027count\u0027)"},{"line_number":48,"context_line":"        value \u003d {k: getattr(self, k)"},{"line_number":49,"context_line":"                for k in fixed_keys if self.obj_attr_is_set(k)}"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_03f0e48f","line":46,"updated":"2014-12-11 16:34:08.000000000","message":"I think you can remove the whole method, because using obj_to_primitive() will call the primitive for each field.\n\nIf you want a special treatment, then override obj_to_primitive() here","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"6f047e2ff84fa1f62e00168e83c6e9085b3e291d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def _from_db_object(context, pool, db_pool):"},{"line_number":56,"context_line":"        if isinstance(db_pool, PciDevicePool):"},{"line_number":57,"context_line":"            return db_pool"},{"line_number":58,"context_line":"        pool \u003d PciDevicePool.from_dict(db_pool)"},{"line_number":59,"context_line":"        pool.obj_reset_changes()"},{"line_number":60,"context_line":"        pool._context \u003d context"},{"line_number":61,"context_line":"        return pool"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_83977439","line":58,"updated":"2014-12-11 16:40:04.000000000","message":"In this method pool is a PciDevicePool object and db_pool is a dict.\n\nI\u0027m not sure you need to do this part here - see comments in compute_node.py","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"d1578b4552c13d6c9f08af56e7efa9a1e2f51630","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def _from_db_object(context, pool, db_pool):"},{"line_number":56,"context_line":"        if isinstance(db_pool, PciDevicePool):"},{"line_number":57,"context_line":"            return db_pool"},{"line_number":58,"context_line":"        pool \u003d PciDevicePool.from_dict(db_pool)"},{"line_number":59,"context_line":"        pool.obj_reset_changes()"},{"line_number":60,"context_line":"        pool._context \u003d context"},{"line_number":61,"context_line":"        return pool"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_a9ea91a9","line":58,"in_reply_to":"3a961159_83977439","updated":"2014-12-11 17:19:39.000000000","message":"As discussed on IRC, I\u0027ll remove this entire method.","commit_id":"edbb7d882c40605d9e93a0c34204c0cac2dca329"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5fda403c24785a583ba788b93a49bd392e27578d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # NOTE(pmurray): for backward compatibility the PciDevicePool is"},{"line_number":34,"context_line":"    # stored in the database as a dict"},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def from_dict(cls, value):"},{"line_number":37,"context_line":"        pool_dict \u003d copy.copy(value)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_92bde3b9","line":34,"updated":"2014-12-12 10:03:28.000000000","message":"My old comment doesn\u0027t make so much sense now, could be something like \"before this object existed the pci device pool data was stored as a dict. For backward compatibility we need to be able to read it in from a dict\"","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"f7a8373a5f2a676f17e002f33f09dbead26452a0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # NOTE(pmurray): for backward compatibility the PciDevicePool is"},{"line_number":34,"context_line":"    # stored in the database as a dict"},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def from_dict(cls, value):"},{"line_number":37,"context_line":"        pool_dict \u003d copy.copy(value)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_de484ab5","line":34,"in_reply_to":"3a961159_92bde3b9","updated":"2014-12-12 17:06:58.000000000","message":"Done","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5fda403c24785a583ba788b93a49bd392e27578d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        pool.tags.update(pool_dict)"},{"line_number":44,"context_line":"        return pool"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def to_dict(self):"},{"line_number":47,"context_line":"        fixed_keys \u003d (\u0027product_id\u0027, \u0027vendor_id\u0027, \u0027count\u0027)"},{"line_number":48,"context_line":"        value \u003d {k: getattr(self, k)"},{"line_number":49,"context_line":"                for k in fixed_keys if self.obj_attr_is_set(k)}"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_32c26f34","line":46,"updated":"2014-12-12 10:03:28.000000000","message":"Not sure this is used now.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"f7a8373a5f2a676f17e002f33f09dbead26452a0","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        pool.tags.update(pool_dict)"},{"line_number":44,"context_line":"        return pool"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def to_dict(self):"},{"line_number":47,"context_line":"        fixed_keys \u003d (\u0027product_id\u0027, \u0027vendor_id\u0027, \u0027count\u0027)"},{"line_number":48,"context_line":"        value \u003d {k: getattr(self, k)"},{"line_number":49,"context_line":"                for k in fixed_keys if self.obj_attr_is_set(k)}"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_5ea29a4b","line":46,"in_reply_to":"3a961159_32c26f34","updated":"2014-12-12 17:06:58.000000000","message":"I can\u0027t imagine that it would be - there\u0027s no reason to store in the old format. Removed.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5c9961a0b22d038f2a829ddbf6d0f2d7cfbce1ca","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            pools \u003d objects.PciDevicePoolList.obj_from_primitive(pci_stats)"},{"line_number":79,"context_line":"        else:"},{"line_number":80,"context_line":"            # This can be either a dict or a list of dicts"},{"line_number":81,"context_line":"            if isinstance(pci_stats, list):"},{"line_number":82,"context_line":"                pool_list \u003d [objects.PciDevicePool.from_dict(stat)"},{"line_number":83,"context_line":"                             for stat in pci_stats]"},{"line_number":84,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_b21b781b","line":81,"updated":"2014-12-15 17:40:54.000000000","message":"nit: This will work, but I think it is always a list, even if it is one pool.","commit_id":"5f70bb3cc44cb5a7cda6f17606fba2548f7924fb"}],"nova/objects/pci_pool.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"64a87e7acb497d4b41ee9ddcacda7580ac5adf3c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.objects import fields"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class PciPool(base.NovaObject):"},{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_8f4ef5c0","line":20,"updated":"2014-12-01 18:29:39.000000000","message":"Can we call this PCIDevicePool?","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"c21b3bbfdf69d27b8e46b648a000a08bcf62bc72","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.objects import fields"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class PciPool(base.NovaObject):"},{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_dfd5e643","line":20,"in_reply_to":"5a890539_8f4ef5c0","updated":"2014-12-02 17:51:38.000000000","message":"Done","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"cd5df2ae39a043caf079244e10fcce38bec44150","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027vendor_id\u0027: fields.StringField(),"},{"line_number":27,"context_line":"        # The following are possible properties provided by the"},{"line_number":28,"context_line":"        # virt drivers. The ones that are set in an object will"},{"line_number":29,"context_line":"        # be the ones that are in a whitelist configuration."},{"line_number":30,"context_line":"        \u0027dev_id\u0027: fields.StringField(),"},{"line_number":31,"context_line":"        \u0027address\u0027: fields.StringField(),"},{"line_number":32,"context_line":"        \u0027label\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_8d6aa27f","line":29,"updated":"2014-11-28 19:50:43.000000000","message":"I need yjiang5 to check these fields are ok, please contact me on IRC for a chat when you are free.\nthanks, Paul","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"c21b3bbfdf69d27b8e46b648a000a08bcf62bc72","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027vendor_id\u0027: fields.StringField(),"},{"line_number":27,"context_line":"        # The following are possible properties provided by the"},{"line_number":28,"context_line":"        # virt drivers. The ones that are set in an object will"},{"line_number":29,"context_line":"        # be the ones that are in a whitelist configuration."},{"line_number":30,"context_line":"        \u0027dev_id\u0027: fields.StringField(),"},{"line_number":31,"context_line":"        \u0027address\u0027: fields.StringField(),"},{"line_number":32,"context_line":"        \u0027label\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_ff3d428f","line":29,"in_reply_to":"5a890539_7dd0a3f7","updated":"2014-12-02 17:51:38.000000000","message":"Thanks - I didn\u0027t know what to do with these fields - I was going to leave them like this because I thought they were optional but the only ones that would be there. As they can be any fields that the user specifies it is a good idea to put them in a dict of strings on their own. I added your changes to do this.","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"},{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"70098b75b477528f7c6ad757852d7de1ad5bbd5a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027vendor_id\u0027: fields.StringField(),"},{"line_number":27,"context_line":"        # The following are possible properties provided by the"},{"line_number":28,"context_line":"        # virt drivers. The ones that are set in an object will"},{"line_number":29,"context_line":"        # be the ones that are in a whitelist configuration."},{"line_number":30,"context_line":"        \u0027dev_id\u0027: fields.StringField(),"},{"line_number":31,"context_line":"        \u0027address\u0027: fields.StringField(),"},{"line_number":32,"context_line":"        \u0027label\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_7dd0a3f7","line":29,"in_reply_to":"5a890539_8d6aa27f","updated":"2014-12-01 19:24:49.000000000","message":"I think currently we have only product_id/vendor_id and tags in the DB. We don\u0027t need the lavel/dev_type etc. \n\nThe tricky thing is the tags, which can be anything and is stored as a dict.","commit_id":"c2f1ab061c9b394ad924e70395ed76874c9473b4"}],"nova/tests/unit/fake_pci_device_pools.py":[{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"35f3948e81334b5063ac753951f3444fe054d251","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027t2\u0027: \u0027v2\u0027,"},{"line_number":24,"context_line":"        \u0027count\u0027: 2,"},{"line_number":25,"context_line":"        }"},{"line_number":26,"context_line":"fake_pool_primitive \u003d {"},{"line_number":27,"context_line":"        \u0027nova_object.changes\u0027: [\u0027count\u0027, \u0027vendor_id\u0027, \u0027product_id\u0027, \u0027tags\u0027],"},{"line_number":28,"context_line":"        \u0027nova_object.data\u0027: {\u0027count\u0027: 5,"},{"line_number":29,"context_line":"        \u0027product_id\u0027: u\u0027foo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b45c881a","line":26,"updated":"2014-12-12 12:53:03.000000000","message":"I very much like that you have done this, but it is probably better the other way around. i.e. create an object and then generate the primitive.\n\nI see some others have generated the object from a db version and in this case these are the db versions - so I might be contradicting that way of doing it.\n\nI\u0027m not sure what is normal practice here. My reason for generating the primitive from an object instead of the other way around is there is less to get wrong. When someone updates this later they will have to get the data and the version right. If its generated from an object it will always generate the right thing.\n\nThe fake_pool_dict should be statically defined as as you have done because it is frozen in time and does not originate from an object. So it is important that it is not generated from an object.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"f7a8373a5f2a676f17e002f33f09dbead26452a0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027t2\u0027: \u0027v2\u0027,"},{"line_number":24,"context_line":"        \u0027count\u0027: 2,"},{"line_number":25,"context_line":"        }"},{"line_number":26,"context_line":"fake_pool_primitive \u003d {"},{"line_number":27,"context_line":"        \u0027nova_object.changes\u0027: [\u0027count\u0027, \u0027vendor_id\u0027, \u0027product_id\u0027, \u0027tags\u0027],"},{"line_number":28,"context_line":"        \u0027nova_object.data\u0027: {\u0027count\u0027: 5,"},{"line_number":29,"context_line":"        \u0027product_id\u0027: u\u0027foo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_be57fe24","line":26,"in_reply_to":"3a961159_b45c881a","updated":"2014-12-12 17:06:58.000000000","message":"That\u0027s a good insight. I think that in general if we create the object and then generate the primitive, it will help catch code that relies on a particular version. I\u0027ll change the primitives.","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"5c9961a0b22d038f2a829ddbf6d0f2d7cfbce1ca","unresolved":false,"context_lines":[{"line_number":35,"context_line":"fake_pool_list \u003d pci_device_pool.PciDevicePoolList(objects\u003d[fake_pool])"},{"line_number":36,"context_line":"fake_pool_list_primitive \u003d fake_pool_list.obj_to_primitive()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# This is the way data was stored before the PciDevicePool class was added"},{"line_number":39,"context_line":"fake_old_pci_stats \u003d [{\"count\": 28, \"vendor_id\": \"8086\", \"t2\": \"v2\","},{"line_number":40,"context_line":"        \"product_id\": \"1520\", \"t1\": \"v1\"}]"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_5b43566b","line":38,"updated":"2014-12-15 17:40:54.000000000","message":"nit: \n\nIs necessary as well as the one above? or is it meant to be another one that is different? Could it be used as:\n\nfake_old_pci_stats \u003d [fake_pool_dict]?","commit_id":"5f70bb3cc44cb5a7cda6f17606fba2548f7924fb"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"35f3948e81334b5063ac753951f3444fe054d251","unresolved":false,"context_lines":[{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"object_relationships \u003d {"},{"line_number":1166,"context_line":"    \u0027BlockDeviceMapping\u0027: {\u0027Instance\u0027: \u00271.17\u0027},"},{"line_number":1167,"context_line":"    \u0027ComputeNode\u0027: {\u0027PciDevicePoolList\u0027: \u00271.0\u0027},"},{"line_number":1168,"context_line":"    \u0027FixedIP\u0027: {\u0027Instance\u0027: \u00271.17\u0027, \u0027Network\u0027: \u00271.2\u0027,"},{"line_number":1169,"context_line":"                \u0027VirtualInterface\u0027: \u00271.0\u0027,"},{"line_number":1170,"context_line":"                \u0027FloatingIPList\u0027: \u00271.7\u0027},"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_1ef01c90","line":1167,"updated":"2014-12-12 12:53:03.000000000","message":"Good - well caught","commit_id":"54ff7c3029d0ea5f2dde43188038c2becc40f889"}]}
