)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c3bf850f3aa25af542c6b685f6127617e155a0cb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Read Neutron port \u0027binding_profile\u0027 during boot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds the \u0027binding_profile:capabilities\u0027 information to the request"},{"line_number":10,"context_line":"object during the boot process."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"blueprint enable-sriov-nic-features"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3f1d235d_34c37359","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":31},"updated":"2017-07-06 15:27:46.000000000","message":"There is a lot more to this change than just this - all sorts of stuff with claims and testing for the scheduler - shouldn\u0027t that all be mentioned in here? What is the full extent/scope of this change?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Read Neutron port \u0027binding_profile\u0027 during boot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds the \u0027binding_profile:capabilities\u0027 information to the request"},{"line_number":10,"context_line":"object during the boot process."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"blueprint enable-sriov-nic-features"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3f1d235d_2c155249","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":31},"in_reply_to":"3f1d235d_34c37359","updated":"2017-07-07 08:49:52.000000000","message":"Well, actually the changes for the sheduler are in the following patch [1]. But you are right: now the scheduler pci_passthrough help functions (pci_device_prop_match) accept strings and lists.\nAlso is worth to mention the modification in the neutron API (reading binding_profile from the port) and InstancePCIRequest.spec type change.\n\n\n[1] https://review.openstack.org/#/c/451777/","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5f93b717_4324dfc6","line":27,"updated":"2018-01-25 11:22:22.000000000","message":"You should probably add \u0027Co-Authored-By\u0027 at this point","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5f93b717_e18722d7","line":27,"in_reply_to":"5f93b717_4324dfc6","updated":"2018-01-25 13:07:07.000000000","message":"sure i can do that. git track it too in the commit field but there is no harm in adding it.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":13,"context_line":"      \"capabilities_network\": [\"HW_NIC_OFFLOAD_RX\", \"HW_NIC_OFFLOAD_TX\","},{"line_number":14,"context_line":"                               \"HW_NIC_OFFLOAD_TSO\"]}]"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"A new Versioned Object class is introduced: \u0027InstancePCIRequestSpec\u0027. This"},{"line_number":17,"context_line":"object is codifies the valid fieleds of an \u0027InstancePCIRequest.spec\u0027."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Along with this change, the function to check if a PCI device"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"df7087c5_3b079a1b","line":16,"range":{"start_line":16,"start_character":69,"end_line":16,"end_character":74},"updated":"2018-03-17 19:33:38.000000000","message":"wrap","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":14,"context_line":"                               \"HW_NIC_OFFLOAD_TSO\"]}]"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"A new Versioned Object class is introduced: \u0027InstancePCIRequestSpec\u0027. This"},{"line_number":17,"context_line":"object is codifies the valid fieleds of an \u0027InstancePCIRequest.spec\u0027."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Along with this change, the function to check if a PCI device"},{"line_number":20,"context_line":"meets the InstancePCIRequest.spec requirements,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"df7087c5_5b0cce3a","line":17,"range":{"start_line":17,"start_character":7,"end_line":17,"end_character":9},"updated":"2018-03-17 19:33:38.000000000","message":"strike","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        phynet_name \u003d None"},{"line_number":1414,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1415,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1416,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1417,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1418,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1419,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_0c96634d","line":1416,"range":{"start_line":1416,"start_character":39,"end_line":1416,"end_character":56},"updated":"2017-04-10 16:41:16.000000000","message":"Is it possible for this to be unset? A (very) brief glance at neutron [1] suggests that yes, it is.\n\n[1] https://github.com/openstack/neutron/blob/b4ac177451275f1045d212df512d314f17a306f4/neutron/plugins/ml2/plugin.py#L314","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        phynet_name \u003d None"},{"line_number":1414,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1415,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1416,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1417,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1418,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1419,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_b3bc6b06","line":1416,"range":{"start_line":1416,"start_character":39,"end_line":1416,"end_character":56},"in_reply_to":"bff0334d_0c96634d","updated":"2017-04-10 20:27:34.000000000","message":"This is part of the port creation process.\n\nOnce the port is in the DB (Nova will always retrieve this information), a port has the parameter \"binding\" [1] and The class PortBinding has defined a parameter called \"profile\" [2]\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/ports.py#L227\n[2] https://github.com/openstack/neutron/blob/master/neutron/objects/ports.py#L63","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3cf705f26002199c3d95af3030151869486a1b09","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        phynet_name \u003d None"},{"line_number":1414,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1415,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1416,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1417,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1418,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1419,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_57e04e26","line":1416,"range":{"start_line":1416,"start_character":39,"end_line":1416,"end_character":56},"in_reply_to":"bff0334d_99c29658","updated":"2017-04-11 14:52:04.000000000","message":"Yes, this parameter must be always there, no matter which backend is used. Of course, this parameter could be None (in L1451 we take care of it), but this is not the question here.","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"536f6cdb00282c5654165bfb55a3e91d29420695","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        phynet_name \u003d None"},{"line_number":1414,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1415,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1416,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1417,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1418,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1419,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_99c29658","line":1416,"range":{"start_line":1416,"start_character":39,"end_line":1416,"end_character":56},"in_reply_to":"bff0334d_b3bc6b06","updated":"2017-04-11 10:42:55.000000000","message":"Right, the question was whether the neutron API would always expose this field, for all backends and even if it was null. You\u0027re saying that yes, it would. Right?","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":1421,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1422,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1423,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1424,"context_line":"        return vnic_type, phynet_name, port[\u0027binding:profile\u0027]"},{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":"    def create_pci_requests_for_sriov_ports(self, context, pci_requests,"},{"line_number":1427,"context_line":"                                            requested_networks):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_ac42d7a9","line":1424,"range":{"start_line":1424,"start_character":39,"end_line":1424,"end_character":62},"updated":"2017-04-10 16:41:16.000000000","message":"ditto","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":1421,"context_line":"            net \u003d neutron.show_network(net_id,"},{"line_number":1422,"context_line":"                fields\u003d\u0027provider:physical_network\u0027).get(\u0027network\u0027)"},{"line_number":1423,"context_line":"            phynet_name \u003d net.get(\u0027provider:physical_network\u0027)"},{"line_number":1424,"context_line":"        return vnic_type, phynet_name, port[\u0027binding:profile\u0027]"},{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":"    def create_pci_requests_for_sriov_ports(self, context, pci_requests,"},{"line_number":1427,"context_line":"                                            requested_networks):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_333e1b8b","line":1424,"range":{"start_line":1424,"start_character":39,"end_line":1424,"end_character":62},"in_reply_to":"bff0334d_ac42d7a9","updated":"2017-04-10 20:27:34.000000000","message":"ditto","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":1439,"context_line":"            vnic_type \u003d network_model.VNIC_TYPE_NORMAL"},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"            if request_net.port_id:"},{"line_number":1442,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1443,"context_line":"                    self._get_port_vnic_info("},{"line_number":1444,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1445,"context_line":"            pci_request_id \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_8c7a73ee","line":1442,"range":{"start_line":1442,"start_character":40,"end_line":1442,"end_character":55},"updated":"2017-04-10 16:41:16.000000000","message":"femtonit: You could just use \u0027profile\u0027 to avoid awkward wrapping :)","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":1439,"context_line":"            vnic_type \u003d network_model.VNIC_TYPE_NORMAL"},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"            if request_net.port_id:"},{"line_number":1442,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1443,"context_line":"                    self._get_port_vnic_info("},{"line_number":1444,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1445,"context_line":"            pci_request_id \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_b3c6ab67","line":1442,"range":{"start_line":1442,"start_character":40,"end_line":1442,"end_character":55},"in_reply_to":"bff0334d_8c7a73ee","updated":"2017-04-10 20:27:34.000000000","message":"I hate this line wrapping, but I\u0027d prefer to mantain this name. There are too many \"profile\" variable names in the code.","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"536f6cdb00282c5654165bfb55a3e91d29420695","unresolved":false,"context_lines":[{"line_number":1439,"context_line":"            vnic_type \u003d network_model.VNIC_TYPE_NORMAL"},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"            if request_net.port_id:"},{"line_number":1442,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1443,"context_line":"                    self._get_port_vnic_info("},{"line_number":1444,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1445,"context_line":"            pci_request_id \u003d None"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_59b88ee3","line":1442,"range":{"start_line":1442,"start_character":40,"end_line":1442,"end_character":55},"in_reply_to":"bff0334d_b3c6ab67","updated":"2017-04-11 10:42:55.000000000","message":"Sounds fair","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1449,"context_line":"                if dev_type:"},{"line_number":1450,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1451,"context_line":"                if binding_profile and binding_profile.get(\u0027capabilities\u0027):"},{"line_number":1452,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1453,"context_line":"                        binding_profile.get(\u0027capabilities\u0027))"},{"line_number":1454,"context_line":"                request \u003d objects.InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_ec6a1f18","line":1451,"range":{"start_line":1451,"start_character":19,"end_line":1451,"end_character":38},"updated":"2017-04-10 16:41:16.000000000","message":"If you were to use \u0027get\u0027 to retrieve \u0027binding_profile\u0027 above, you could drop this bit","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"536f6cdb00282c5654165bfb55a3e91d29420695","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1449,"context_line":"                if dev_type:"},{"line_number":1450,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1451,"context_line":"                if binding_profile and binding_profile.get(\u0027capabilities\u0027):"},{"line_number":1452,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1453,"context_line":"                        binding_profile.get(\u0027capabilities\u0027))"},{"line_number":1454,"context_line":"                request \u003d objects.InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_99a736be","line":1451,"range":{"start_line":1451,"start_character":19,"end_line":1451,"end_character":38},"in_reply_to":"bff0334d_93c3a757","updated":"2017-04-11 10:42:55.000000000","message":"Correct","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1449,"context_line":"                if dev_type:"},{"line_number":1450,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1451,"context_line":"                if binding_profile and binding_profile.get(\u0027capabilities\u0027):"},{"line_number":1452,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1453,"context_line":"                        binding_profile.get(\u0027capabilities\u0027))"},{"line_number":1454,"context_line":"                request \u003d objects.InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_93c3a757","line":1451,"range":{"start_line":1451,"start_character":19,"end_line":1451,"end_character":38},"in_reply_to":"bff0334d_ec6a1f18","updated":"2017-04-10 20:27:34.000000000","message":"\"binding_profile\" can be None [1]:\n\u0027binding\u0027: obj_fields.ObjectField(\n            \u0027PortBinding\u0027, nullable\u003dTrue \u003c---- Neutron API can return None\n        )\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/ports.py#L227","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"            if request_net.port_id:"},{"line_number":1487,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1488,"context_line":"                    self._get_port_vnic_info("},{"line_number":1489,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1490,"context_line":"            pci_request_id \u003d None"},{"line_number":1491,"context_line":"            if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_1b218db5","line":1488,"updated":"2017-06-29 17:31:02.000000000","message":"checked this is the only place that calls _get_port_vnic_info(). it is.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"            if request_net.port_id:"},{"line_number":1487,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1488,"context_line":"                    self._get_port_vnic_info("},{"line_number":1489,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1490,"context_line":"            pci_request_id \u003d None"},{"line_number":1491,"context_line":"            if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_548a131b","line":1488,"in_reply_to":"3f1d235d_1b218db5","updated":"2017-06-30 14:39:49.000000000","message":"Sorry Jay, I don\u0027t understand the comment. Is this an assertion?\n\nSometimes my English/Spanish dictionary is broken :)","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fa5c4082340906ae55dd7a68568c2b9deb255efd","unresolved":false,"context_lines":[{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"            if request_net.port_id:"},{"line_number":1487,"context_line":"                vnic_type, phynet_name, binding_profile \u003d ("},{"line_number":1488,"context_line":"                    self._get_port_vnic_info("},{"line_number":1489,"context_line":"                        context, neutron, request_net.port_id))"},{"line_number":1490,"context_line":"            pci_request_id \u003d None"},{"line_number":1491,"context_line":"            if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_27cc0b34","line":1488,"in_reply_to":"3f1d235d_548a131b","updated":"2017-06-30 15:06:44.000000000","message":"hehe, no, I was just stating that I went into the code and ensured that this was the only place we were calling the _get_port_vnic_info() function. So, all good. Was just making a note of it for future reviewers.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76ef7df9446a7ec02468c60d652648c1f78bde8d","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1496,"context_line":"                if dev_type:"},{"line_number":1497,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1498,"context_line":"                if binding_profile and binding_profile.get(PORT_CAPABILITIES):"},{"line_number":1499,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1500,"context_line":"                        binding_profile.get(PORT_CAPABILITIES))"},{"line_number":1501,"context_line":"                request \u003d objects.InstancePCIRequest("},{"line_number":1502,"context_line":"                    count\u003d1,"},{"line_number":1503,"context_line":"                    spec\u003d[objects.InstancePCIRequestSpec.create(data\u003dspec)],"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_f40a9bcf","line":1500,"range":{"start_line":1498,"start_character":16,"end_line":1500,"end_character":63},"updated":"2017-07-06 15:26:21.000000000","message":"Can these port capabilities change underneath nova, i.e. can they change on the neutron side via a port update call and then not get reflected back into nova properly? If so, that\u0027s a problem - and is part of the reason it\u0027s complicated trying to do state modeling between services. Nova has had this problem with Cinder for a long time with modeling volume information that can change on the Cinder side.","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1496,"context_line":"                if dev_type:"},{"line_number":1497,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1498,"context_line":"                if binding_profile and binding_profile.get(PORT_CAPABILITIES):"},{"line_number":1499,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1500,"context_line":"                        binding_profile.get(PORT_CAPABILITIES))"},{"line_number":1501,"context_line":"                request \u003d objects.InstancePCIRequest("},{"line_number":1502,"context_line":"                    count\u003d1,"},{"line_number":1503,"context_line":"                    spec\u003d[objects.InstancePCIRequestSpec.create(data\u003dspec)],"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_0c061653","line":1500,"range":{"start_line":1498,"start_character":16,"end_line":1500,"end_character":63},"in_reply_to":"3f1d235d_f40a9bcf","updated":"2017-07-07 08:49:52.000000000","message":"To my regret, yes. The binding profile information in a Neutron port can change even when the port is attached to a VM [1].\n\nBut this information is required only for the scheduling process. If the binding information (in this case, the one related to the port capabilities) changes, it won\u0027t affect to the port at all.\n\nAnother option is to cache this information in Nova.\n\nI know this could be considered as a problem when modeling between two projects. The other option considered and discarded to handle this feature was to use the \"pci_alias\" variable to model the possible NIC interfaces in a static way. \n\nWithout this information we can\u0027t give to the scheduler the needed information to implement this BP [2].\n\n[1] http://paste.openstack.org/show/614707/\n[2] https://review.openstack.org/#/q/topic:bp/enable-sriov-nic-features","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0a2f049a30e0ffa9bd0e7c80f8d9ec8ad5da8ab6","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"                dev_type \u003d pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)"},{"line_number":1496,"context_line":"                if dev_type:"},{"line_number":1497,"context_line":"                    spec[pci_request.PCI_DEVICE_TYPE_TAG] \u003d dev_type"},{"line_number":1498,"context_line":"                if binding_profile and binding_profile.get(PORT_CAPABILITIES):"},{"line_number":1499,"context_line":"                    spec[pci_request.PCI_NET_CAPABILITIES] \u003d ("},{"line_number":1500,"context_line":"                        binding_profile.get(PORT_CAPABILITIES))"},{"line_number":1501,"context_line":"                request \u003d objects.InstancePCIRequest("},{"line_number":1502,"context_line":"                    count\u003d1,"},{"line_number":1503,"context_line":"                    spec\u003d[objects.InstancePCIRequestSpec.create(data\u003dspec)],"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_2412a559","line":1500,"range":{"start_line":1498,"start_character":16,"end_line":1500,"end_character":63},"in_reply_to":"3f1d235d_f40a9bcf","updated":"2017-07-11 14:18:05.000000000","message":"Well, technically, an admin can set a port state DOWN in Neutron and that won\u0027t notify Nova about the state change... so it\u0027s not like this is relying on some new behaviour, right?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b5631984a0497c977f4e649fdf622cb31b7db972","unresolved":false,"context_lines":[{"line_number":1462,"context_line":"        phynet_name \u003d None"},{"line_number":1463,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1464,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1465,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1466,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1467,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1468,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_f175d199","line":1465,"range":{"start_line":1465,"start_character":39,"end_line":1465,"end_character":56},"updated":"2017-07-12 19:35:58.000000000","message":"there is a binding:profile constant https://github.com/openstack/nova/blob/master/nova/network/neutronv2/api.py#L53","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e7f0a637a93cbbc43d3e491506f706c0d299540","unresolved":false,"context_lines":[{"line_number":1462,"context_line":"        phynet_name \u003d None"},{"line_number":1463,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1464,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1465,"context_line":"                                       \u0027binding:profile\u0027])"},{"line_number":1466,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1467,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"},{"line_number":1468,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_143709b3","line":1465,"range":{"start_line":1465,"start_character":39,"end_line":1465,"end_character":56},"in_reply_to":"1f1a1f67_f175d199","updated":"2017-07-13 08:29:49.000000000","message":"You are right. Thanks.","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"99de9016ba60af881b0daecbd0623c937e845c41","unresolved":false,"context_lines":[{"line_number":1461,"context_line":"        \"\"\""},{"line_number":1462,"context_line":"        phynet_name \u003d None"},{"line_number":1463,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1464,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1465,"context_line":"                                       BINDING_PROFILE])"},{"line_number":1466,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1467,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_3a3495fb","line":1464,"range":{"start_line":1464,"start_character":39,"end_line":1464,"end_character":73},"updated":"2017-07-19 16:54:56.000000000","message":"These should become constants in the future, I guess","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"67efe27a70a28ba46023cc5478dc23b6fc9e23a1","unresolved":false,"context_lines":[{"line_number":1461,"context_line":"        \"\"\""},{"line_number":1462,"context_line":"        phynet_name \u003d None"},{"line_number":1463,"context_line":"        port \u003d self._show_port(context, port_id, neutron_client\u003dneutron,"},{"line_number":1464,"context_line":"                               fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027,"},{"line_number":1465,"context_line":"                                       BINDING_PROFILE])"},{"line_number":1466,"context_line":"        vnic_type \u003d port.get(\u0027binding:vnic_type\u0027,"},{"line_number":1467,"context_line":"                             network_model.VNIC_TYPE_NORMAL)"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_847b268a","line":1464,"range":{"start_line":1464,"start_character":39,"end_line":1464,"end_character":73},"in_reply_to":"1f1a1f67_3a3495fb","updated":"2017-07-19 17:20:29.000000000","message":"Yes, I need to make them constants.","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"3c90b241ebf78ba72e4b54515d58eb7938e2bccd","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"},{"line_number":1453,"context_line":"            net_id \u003d port[NETWORK_ID]"},{"line_number":1454,"context_line":"            phynet_name \u003d self._get_phynet_info(context, neutron, net_id)"},{"line_number":1455,"context_line":"        return vnic_type, phynet_name, port[BINDING_PROFILE]"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def create_pci_requests_for_sriov_ports(self, context, pci_requests,"},{"line_number":1458,"context_line":"                                            requested_networks):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_52b4bff1","line":1455,"range":{"start_line":1455,"start_character":39,"end_line":1455,"end_character":60},"updated":"2017-08-31 12:10:22.000000000","message":"why not do port.get(BINDING_PROFILE) just in case it don\u0027t exist? then you don\u0027t need the unit test change you added in https://review.openstack.org/#/c/449257/38/nova/tests/unit/network/test_neutronv2.py. like in line 3097","commit_id":"023ab580065babe08a7290daf3a46325c7297cef"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9504cdc29313c1a9ce7b905e3c4437da7855b268","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"},{"line_number":1453,"context_line":"            net_id \u003d port[NETWORK_ID]"},{"line_number":1454,"context_line":"            phynet_name \u003d self._get_phynet_info(context, neutron, net_id)"},{"line_number":1455,"context_line":"        return vnic_type, phynet_name, port[BINDING_PROFILE]"},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"    def create_pci_requests_for_sriov_ports(self, context, pci_requests,"},{"line_number":1458,"context_line":"                                            requested_networks):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_145ece75","line":1455,"range":{"start_line":1455,"start_character":39,"end_line":1455,"end_character":60},"in_reply_to":"7f287b81_52b4bff1","updated":"2017-09-05 08:58:47.000000000","message":"You are right","commit_id":"023ab580065babe08a7290daf3a46325c7297cef"}],"nova/objects/fields.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1013,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1014,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1015,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1016,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1017,"context_line":"        for type in self._valid_types:"},{"line_number":1018,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1021,"context_line":"        for _type in self._valid_types:"},{"line_number":1022,"context_line":"            try:"},{"line_number":1023,"context_line":"                return _type.coerce(obj, attr, value)"},{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"class PCIAddressField(AutoTypedField):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_ac01b708","line":1034,"range":{"start_line":1012,"start_character":0,"end_line":1034,"end_character":46},"updated":"2017-04-10 16:41:16.000000000","message":"nit: I\u0027d like this defined at the top of the file along with the other \"superclasses\"","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"feccbc2da37a899c6ce022f9a9eebf4261c57578","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1013,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1014,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1015,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1016,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1017,"context_line":"        for type in self._valid_types:"},{"line_number":1018,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1021,"context_line":"        for _type in self._valid_types:"},{"line_number":1022,"context_line":"            try:"},{"line_number":1023,"context_line":"                return _type.coerce(obj, attr, value)"},{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"class PCIAddressField(AutoTypedField):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_810b118c","line":1034,"range":{"start_line":1012,"start_character":0,"end_line":1034,"end_character":46},"in_reply_to":"bff0334d_139b1766","updated":"2017-12-19 11:59:48.000000000","message":"Not done in PS13, but it\u0027s a nit so I won\u0027t block on it","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"882283b9e6b09497519a014270fa79f29e82390d","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1013,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1014,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1015,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1016,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1017,"context_line":"        for type in self._valid_types:"},{"line_number":1018,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1021,"context_line":"        for _type in self._valid_types:"},{"line_number":1022,"context_line":"            try:"},{"line_number":1023,"context_line":"                return _type.coerce(obj, attr, value)"},{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"class PCIAddressField(AutoTypedField):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf8cb3f7_91c5383f","line":1034,"range":{"start_line":1012,"start_character":0,"end_line":1034,"end_character":46},"in_reply_to":"bff0334d_810b118c","updated":"2017-12-22 10:19:54.000000000","message":"Re-done (sorry for missing this one).","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1010,"context_line":""},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1013,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1014,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1015,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1016,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1017,"context_line":"        for type in self._valid_types:"},{"line_number":1018,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1021,"context_line":"        for _type in self._valid_types:"},{"line_number":1022,"context_line":"            try:"},{"line_number":1023,"context_line":"                return _type.coerce(obj, attr, value)"},{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"class PCIAddressField(AutoTypedField):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_139b1766","line":1034,"range":{"start_line":1012,"start_character":0,"end_line":1034,"end_character":46},"in_reply_to":"bff0334d_ac01b708","updated":"2017-04-10 20:27:34.000000000","message":"Done","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"91447eb67a5310805f5813d5ba929f1c9ded15fa","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_f0198121","line":1027,"range":{"start_line":1027,"start_character":69,"end_line":1027,"end_character":76},"updated":"2017-04-12 19:47:39.000000000","message":"eh?","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"991ce5bb9e4f67fa6a5f188522a075366673d054","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"            except Exception:"},{"line_number":1025,"context_line":"                continue"},{"line_number":1026,"context_line":"        else:"},{"line_number":1027,"context_line":"            raise ValueError(_(\u0027A value of type %(types)s is required; value\u0027)"},{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ff52f3f_81d6514f","line":1027,"range":{"start_line":1027,"start_character":69,"end_line":1027,"end_character":76},"in_reply_to":"bff0334d_f0198121","updated":"2017-04-13 08:17:57.000000000","message":"I don\u0027t know why I wrote this.","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"91447eb67a5310805f5813d5ba929f1c9ded15fa","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_30d24929","line":1031,"range":{"start_line":1031,"start_character":15,"end_line":1031,"end_character":23},"updated":"2017-04-12 19:47:39.000000000","message":"Consider avoiding LTS:\n\n \"\u0027%s\u0027\" % value","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"991ce5bb9e4f67fa6a5f188522a075366673d054","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"                             % {\u0027types\u0027: \u0027, \u0027.join(self._valid_types_str)})"},{"line_number":1029,"context_line":""},{"line_number":1030,"context_line":"    def stringify(self, value):"},{"line_number":1031,"context_line":"        return \u0027\\\u0027%s\\\u0027\u0027 % value"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_schema(self):"},{"line_number":1034,"context_line":"        return {\u0027type\u0027: self._valid_types_str}"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ff52f3f_c1e21930","line":1031,"range":{"start_line":1031,"start_character":15,"end_line":1031,"end_character":23},"in_reply_to":"bff0334d_30d24929","updated":"2017-04-13 08:17:57.000000000","message":"Done","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d810e0e9ba3a1c1b2fd35045c085e03f79720d91","unresolved":false,"context_lines":[{"line_number":1032,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1036,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1037,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1038,"context_line":"        self._valid_types \u003d valid_types"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_4d7aac24","line":1035,"updated":"2017-06-29 17:35:28.000000000","message":"FWIW, I don\u0027t think this should ever exist. It makes it way too hard to tell what could be in here a couple years down the line when we\u0027re looking to make a change to an object that has one of these.\n\nPlease just add two fields to an object for the two types of things you want to store in it.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":1032,"context_line":"        return AddressBase.coerce(IDEAddress, attr, value)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"class MultipleFieldType(FieldType):"},{"line_number":1036,"context_line":"    def __init__(self, valid_types, **kwargs):"},{"line_number":1037,"context_line":"        super(MultipleFieldType, self).__init__(**kwargs)"},{"line_number":1038,"context_line":"        self._valid_types \u003d valid_types"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_74c2af35","line":1035,"in_reply_to":"3f1d235d_4d7aac24","updated":"2017-06-30 14:39:49.000000000","message":"You are right. I don\u0027t know why I didn\u0027t create a new object instead of creating this Frankenstein monster.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1039,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1040,"context_line":"        for type in self._valid_types:"},{"line_number":1041,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1044,"context_line":"        for _type in self._valid_types:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_db03150f","line":1041,"updated":"2017-06-29 17:31:02.000000000","message":"would be nice to use _type here instead of type, like you do below.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        self._valid_types \u003d valid_types"},{"line_number":1039,"context_line":"        self._valid_types_str \u003d []"},{"line_number":1040,"context_line":"        for type in self._valid_types:"},{"line_number":1041,"context_line":"            self._valid_types_str.append(type.describe())"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def coerce(self, obj, attr, value):"},{"line_number":1044,"context_line":"        for _type in self._valid_types:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_54dd7312","line":1041,"in_reply_to":"3f1d235d_db03150f","updated":"2017-06-30 14:39:49.000000000","message":"I\u0027ll remove this part of code.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    AUTO_TYPE \u003d InstancePowerState()"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1229,"context_line":"    AUTO_TYPE \u003d List(Dict(MultipleFieldType((List(StringField()),"},{"line_number":1230,"context_line":"                                             StringField())),"},{"line_number":1231,"context_line":"                          nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_ad2140a2","line":1228,"updated":"2017-06-29 17:31:02.000000000","message":"mmm. that\u0027s a mouthful...","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    AUTO_TYPE \u003d InstancePowerState()"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1229,"context_line":"    AUTO_TYPE \u003d List(Dict(MultipleFieldType((List(StringField()),"},{"line_number":1230,"context_line":"                                             StringField())),"},{"line_number":1231,"context_line":"                          nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_14e7fbe6","line":1228,"in_reply_to":"3f1d235d_2d9e5063","updated":"2017-06-30 14:39:49.000000000","message":"I\u0027ll remove this.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d810e0e9ba3a1c1b2fd35045c085e03f79720d91","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    AUTO_TYPE \u003d InstancePowerState()"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1229,"context_line":"    AUTO_TYPE \u003d List(Dict(MultipleFieldType((List(StringField()),"},{"line_number":1230,"context_line":"                                             StringField())),"},{"line_number":1231,"context_line":"                          nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_2d9e5063","line":1228,"in_reply_to":"3f1d235d_ad2140a2","updated":"2017-06-29 17:35:28.000000000","message":"I think this is a terrible idea. Is this a list of dicts or a list field? or is it a list of dicts, which may be nullable strings or lists?\n\nThese really should be fairly primitive things, using these field types just for schema checking. If you need something this complicated it should probably be a nested object, IMHO.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"}],"nova/objects/instance_pci_requests.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append("},{"line_number":53,"context_line":"                    {k: v if isinstance(v, six.string_types) else"},{"line_number":54,"context_line":"                     jsonutils.dumps(v) for k, v in spec.items()})"},{"line_number":55,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_8c64b323","line":54,"range":{"start_line":54,"start_character":21,"end_line":54,"end_character":39},"updated":"2017-04-10 16:41:16.000000000","message":"same comment as earlier patches in this series: jsonutils.dumps(x) !\u003d x. Personally, I\u0027d just drop anything list\u0027y in this case because it shouldn\u0027t be there","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append("},{"line_number":53,"context_line":"                    {k: v if isinstance(v, six.string_types) else"},{"line_number":54,"context_line":"                     jsonutils.dumps(v) for k, v in spec.items()})"},{"line_number":55,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_f3cc336b","line":54,"range":{"start_line":54,"start_character":21,"end_line":54,"end_character":39},"in_reply_to":"bff0334d_8c64b323","updated":"2017-04-10 20:27:34.000000000","message":"You are right. In previous versions we can\u0027t support this feature.","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                request.obj_make_compatible("},{"line_number":77,"context_line":"                    primitive[\u0027requests\u0027][index][\u0027nova_object.data\u0027], \u00271.0\u0027)"},{"line_number":78,"context_line":"                primitive[\u0027requests\u0027][index][\u0027nova_object.version\u0027] \u003d \u00271.0\u0027"},{"line_number":79,"context_line":"        elif target_version \u003c (1, 2) and \u0027requests\u0027 in primitive:"},{"line_number":80,"context_line":"            for index, request in enumerate(self.requests):"},{"line_number":81,"context_line":"                request.obj_make_compatible("},{"line_number":82,"context_line":"                    primitive[\u0027requests\u0027][index][\u0027nova_object.data\u0027], \u00271.1\u0027)"},{"line_number":83,"context_line":"                primitive[\u0027requests\u0027][index][\u0027nova_object.version\u0027] \u003d \u00271.1\u0027"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def obj_from_db(cls, context, instance_uuid, db_requests):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_0fde556c","line":83,"range":{"start_line":79,"start_character":0,"end_line":83,"end_character":75},"updated":"2017-04-10 16:41:16.000000000","message":"You need tests for this. There are some existing examples in the codebase if you need help","commit_id":"3461af93498251aff66c784b2ccf0a532a37bc7f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e8660702d79e50ca584dec91893e372de298619","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            specs \u003d []"},{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append("},{"line_number":53,"context_line":"                    {k: v if isinstance(v, six.string_types) else"},{"line_number":54,"context_line":"                     jsonutils.dumps(v) for k, v in spec.items()})"},{"line_number":55,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bff0334d_410f4987","line":54,"range":{"start_line":53,"start_character":20,"end_line":54,"end_character":66},"updated":"2017-04-12 12:30:37.000000000","message":"This still looks wrong. I think you should drop anything that isn\u0027t a string.","commit_id":"9ee0e82b3af8028e043c08e822bac27a954846a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"692cb92ce8d11ce194bb582df51ec3316d815b10","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            specs \u003d []"},{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append("},{"line_number":53,"context_line":"                    {k: v if isinstance(v, six.string_types) else"},{"line_number":54,"context_line":"                     jsonutils.dumps(v) for k, v in spec.items()})"},{"line_number":55,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bff0334d_9a67f64d","line":54,"range":{"start_line":53,"start_character":20,"end_line":54,"end_character":66},"in_reply_to":"bff0334d_410f4987","updated":"2017-04-12 13:55:56.000000000","message":"Yes, I missed this change","commit_id":"9ee0e82b3af8028e043c08e822bac27a954846a2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e17f775f6003fd1aa97ff9416212ef3979d20d86","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            del primitive[\u0027request_id\u0027]"},{"line_number":49,"context_line":"        if target_version \u003c (1, 2) and \u0027spec\u0027 in primitive:"},{"line_number":50,"context_line":"            specs \u003d []"},{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append({k: v for k, v in spec.items() if"},{"line_number":53,"context_line":"                              isinstance(v, six.string_types)})"},{"line_number":54,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_70fe916b","line":53,"range":{"start_line":51,"start_character":0,"end_line":53,"end_character":63},"updated":"2017-04-12 14:15:53.000000000","message":"nit: A comment about the fact that we drop lists would be appreciated","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9bb3cf60ecff1159385b723f6497bb39095397cd","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            del primitive[\u0027request_id\u0027]"},{"line_number":49,"context_line":"        if target_version \u003c (1, 2) and \u0027spec\u0027 in primitive:"},{"line_number":50,"context_line":"            specs \u003d []"},{"line_number":51,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":52,"context_line":"                specs.append({k: v for k, v in spec.items() if"},{"line_number":53,"context_line":"                              isinstance(v, six.string_types)})"},{"line_number":54,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_1924115d","line":53,"range":{"start_line":51,"start_character":0,"end_line":53,"end_character":63},"in_reply_to":"bff0334d_70fe916b","updated":"2017-04-12 14:58:19.000000000","message":"Yes, you are right.","commit_id":"371ef3739ffae41188b616f20f35393918291ed0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":62,"context_line":"    # Version 1.0: Initial version"},{"line_number":63,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":64,"context_line":"    # Version 1.2: InstancePCIRequest 1.2"},{"line_number":65,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_ad6f00c4","line":64,"updated":"2017-06-29 17:31:02.000000000","message":"I was under the impression it was no longer necessary to increment an object\u0027s version if the object\u0027s schema did not change...","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":62,"context_line":"    # Version 1.0: Initial version"},{"line_number":63,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":64,"context_line":"    # Version 1.2: InstancePCIRequest 1.2"},{"line_number":65,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_94daeb14","line":64,"in_reply_to":"3f1d235d_ad6f00c4","updated":"2017-06-30 14:39:49.000000000","message":"Done","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76ef7df9446a7ec02468c60d652648c1f78bde8d","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_f43cdb93","line":29,"range":{"start_line":29,"start_character":9,"end_line":29,"end_character":22},"updated":"2017-07-06 15:26:21.000000000","message":"This isn\u0027t a very helpful name - what are the actual contents of this field?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_5fd70e4c","line":29,"range":{"start_line":29,"start_character":9,"end_line":29,"end_character":22},"in_reply_to":"3f1d235d_f43cdb93","updated":"2017-07-07 08:49:52.000000000","message":"I moved from using this [1] to use a OVO, InstancePCIRequestSpec.\n\nInstancePCIRequestSpec is a container for dicts with strings (dict_of_strings) and dicts of lists (dict_of_lists).\n\nTo make easier the creation of this object, I made the function \"create\", accepting a dict with both strings and lists. Doing that, the developer only needs to know that this object accepts both types of contents.\n\nAlso \"__getitem__\" gets information from both fields.\n\nThe name of this variable is agnostic, because the content only depends on the type, not the information.\n\n[1] https://review.openstack.org/#/c/449257/28/nova/objects/fields.py","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76ef7df9446a7ec02468c60d652648c1f78bde8d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_d43f9f84","line":30,"range":{"start_line":30,"start_character":9,"end_line":30,"end_character":24},"updated":"2017-07-06 15:26:21.000000000","message":"same","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_7fd40a48","line":30,"range":{"start_line":30,"start_character":9,"end_line":30,"end_character":24},"in_reply_to":"3f1d235d_d43f9f84","updated":"2017-07-07 08:49:52.000000000","message":"ditto","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"b5631984a0497c977f4e649fdf622cb31b7db972","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def __getitem__(self, key):"},{"line_number":58,"context_line":"        if not isinstance(key, six.string_types):"},{"line_number":59,"context_line":"            raise TypeError(\u0027Key value must be a string\u0027)"},{"line_number":60,"context_line":"        for field in self.fields.keys():"},{"line_number":61,"context_line":"            _dict \u003d getattr(self, field)"},{"line_number":62,"context_line":"            if key in _dict:"},{"line_number":63,"context_line":"                return _dict[key]"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_f1e83117","line":60,"range":{"start_line":60,"start_character":32,"end_line":60,"end_character":39},"updated":"2017-07-12 19:35:58.000000000","message":"you don\u0027t need .keys()\n\n\"for field in self.fields\" should do","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e7f0a637a93cbbc43d3e491506f706c0d299540","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def __getitem__(self, key):"},{"line_number":58,"context_line":"        if not isinstance(key, six.string_types):"},{"line_number":59,"context_line":"            raise TypeError(\u0027Key value must be a string\u0027)"},{"line_number":60,"context_line":"        for field in self.fields.keys():"},{"line_number":61,"context_line":"            _dict \u003d getattr(self, field)"},{"line_number":62,"context_line":"            if key in _dict:"},{"line_number":63,"context_line":"                return _dict[key]"}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_f4648dbb","line":60,"range":{"start_line":60,"start_character":32,"end_line":60,"end_character":39},"in_reply_to":"1f1a1f67_f1e83117","updated":"2017-07-13 08:29:49.000000000","message":"I always make the same error.","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"041d47154d56255b7ce5aaea91104861f3e3c07e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def to_dict(self):"},{"line_number":68,"context_line":"        spec \u003d {}"},{"line_number":69,"context_line":"        spec.update(self.dict_of_lists)"},{"line_number":70,"context_line":"        spec.update(self.dict_of_strings)"},{"line_number":71,"context_line":"        return spec"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_81677926","line":70,"range":{"start_line":70,"start_character":25,"end_line":70,"end_character":40},"updated":"2017-07-12 15:10:57.000000000","message":"here dict_of_strings will overwrite the dict_of_fields if any key is the same in them, while in create method, list values have greater priority then string values. not sure if it will affect something though","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1f8d15bf058f3541f98cc0e6401112d03db11d13","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def to_dict(self):"},{"line_number":68,"context_line":"        spec \u003d {}"},{"line_number":69,"context_line":"        spec.update(self.dict_of_lists)"},{"line_number":70,"context_line":"        spec.update(self.dict_of_strings)"},{"line_number":71,"context_line":"        return spec"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"1f1a1f67_cebb59e3","line":70,"range":{"start_line":70,"start_character":25,"end_line":70,"end_character":40},"in_reply_to":"1f1a1f67_81677926","updated":"2017-07-12 16:20:27.000000000","message":"You are right, good catch.\n\nBut, let me put in this way: every time a InstancePCIRequestSpec object is created, uses \"create\" method (L34). This method prevents to have multiple keys because everything will came from a unique dict.\n\nOnce the object is created, are any of these dicts modified? No. Everytime a InstancePCIRequestSpec is created:\n\n* https://review.openstack.org/#/c/449257/32/nova/network/neutronv2/api.py@1503\n  The object is created and is static because the values from the neutron port are static too (during the boot process).\n\n* https://review.openstack.org/#/c/449257/32/nova/pci/request.py@141\n  The alias information is static too\n\n* https://review.openstack.org/#/c/449257/32/nova/pci/stats.py@223\n  This object is used only in this function to filter by NUMA node.","commit_id":"75535f83716cee2084a7b54628d95efbf4b2e6af"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"99de9016ba60af881b0daecbd0623c937e845c41","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_e5f442f3","line":29,"range":{"start_line":29,"start_character":9,"end_line":29,"end_character":22},"updated":"2017-07-19 16:54:56.000000000","message":"Hmm, surely we could come up with more meaningful names than this","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"67efe27a70a28ba46023cc5478dc23b6fc9e23a1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_44298e34","line":29,"range":{"start_line":29,"start_character":9,"end_line":29,"end_character":22},"in_reply_to":"1f1a1f67_e5f442f3","updated":"2017-07-19 17:20:29.000000000","message":"I had this converstation with Matt [1]\n\nI moved from using this [2] to use a OVO, InstancePCIRequestSpec.\nInstancePCIRequestSpec is a container for dicts with strings (dict_of_strings) and dicts of lists (dict_of_lists).\n\nTo make easier the creation of this object, I made the function \"create\", accepting a dict with both strings and lists. Doing that, the developer only needs to know that this object accepts both types of contents.\n\nAlso \"__getitem__\" gets information from both fields.\n\nThe name of this variable is agnostic, because the content only depends on the type, not the information.\n\n[1] https://review.openstack.org/#/c/449257/31/nova/objects/instance_pci_requests.py\n[2] https://review.openstack.org/#/c/449257/28/nova/objects/fields.py","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"99de9016ba60af881b0daecbd0623c937e845c41","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":99,"context_line":"        if target_version \u003c (1, 1) and \u0027request_id\u0027 in primitive:"},{"line_number":100,"context_line":"            del primitive[\u0027request_id\u0027]"},{"line_number":101,"context_line":"        if target_version \u003c (1, 2) and \u0027spec\u0027 in primitive:"},{"line_number":102,"context_line":"            specs \u003d []"},{"line_number":103,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":104,"context_line":"                # Everything but string values will be dropped. The \u0027spec\u0027"},{"line_number":105,"context_line":"                # field in version \u003c 1.2 is a list of dict of nullable strings."},{"line_number":106,"context_line":"                if spec[\u0027nova_object.data\u0027][\u0027dict_of_strings\u0027]:"},{"line_number":107,"context_line":"                    specs.append(spec[\u0027nova_object.data\u0027][\u0027dict_of_strings\u0027])"},{"line_number":108,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"# TODO(berrange): Remove NovaObjectDictCompat"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_a1917449","line":108,"range":{"start_line":101,"start_character":0,"end_line":108,"end_character":37},"updated":"2017-07-19 16:54:56.000000000","message":"Doesn\u0027t this belong in the child object\u0027s (InstancePCIRequestSpec) \u0027obj_make_compatible\u0027 function?","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"67efe27a70a28ba46023cc5478dc23b6fc9e23a1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":99,"context_line":"        if target_version \u003c (1, 1) and \u0027request_id\u0027 in primitive:"},{"line_number":100,"context_line":"            del primitive[\u0027request_id\u0027]"},{"line_number":101,"context_line":"        if target_version \u003c (1, 2) and \u0027spec\u0027 in primitive:"},{"line_number":102,"context_line":"            specs \u003d []"},{"line_number":103,"context_line":"            for spec in primitive[\u0027spec\u0027]:"},{"line_number":104,"context_line":"                # Everything but string values will be dropped. The \u0027spec\u0027"},{"line_number":105,"context_line":"                # field in version \u003c 1.2 is a list of dict of nullable strings."},{"line_number":106,"context_line":"                if spec[\u0027nova_object.data\u0027][\u0027dict_of_strings\u0027]:"},{"line_number":107,"context_line":"                    specs.append(spec[\u0027nova_object.data\u0027][\u0027dict_of_strings\u0027])"},{"line_number":108,"context_line":"            primitive[\u0027spec\u0027] \u003d specs"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"# TODO(berrange): Remove NovaObjectDictCompat"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_e4aada6e","line":108,"range":{"start_line":101,"start_character":0,"end_line":108,"end_character":37},"in_reply_to":"1f1a1f67_a1917449","updated":"2017-07-19 17:20:29.000000000","message":"The object changed is not InstancePCIRequestSpec (in this case, is the first version of this object).\n\nThe object changed is InstancePCIRequest which needs backwards compatibility in this case.","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"99de9016ba60af881b0daecbd0623c937e845c41","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":126,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":127,"context_line":"        if target_version \u003c (1, 2) and \u0027requests\u0027 in primitive:"},{"line_number":128,"context_line":"            _version \u003d \u0027.\u0027.join(map(str, target_version))"},{"line_number":129,"context_line":"            for index, request in enumerate(self.requests):"},{"line_number":130,"context_line":"                request.obj_make_compatible("},{"line_number":131,"context_line":"                    primitive[\u0027requests\u0027][index][\u0027nova_object.data\u0027], _version)"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_81bd58b8","line":128,"range":{"start_line":128,"start_character":32,"end_line":128,"end_character":56},"updated":"2017-07-19 16:54:56.000000000","message":"No love for list comprehensions? :)","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"67efe27a70a28ba46023cc5478dc23b6fc9e23a1","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":126,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":127,"context_line":"        if target_version \u003c (1, 2) and \u0027requests\u0027 in primitive:"},{"line_number":128,"context_line":"            _version \u003d \u0027.\u0027.join(map(str, target_version))"},{"line_number":129,"context_line":"            for index, request in enumerate(self.requests):"},{"line_number":130,"context_line":"                request.obj_make_compatible("},{"line_number":131,"context_line":"                    primitive[\u0027requests\u0027][index][\u0027nova_object.data\u0027], _version)"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_44acee9d","line":128,"range":{"start_line":128,"start_character":32,"end_line":128,"end_character":56},"in_reply_to":"1f1a1f67_81bd58b8","updated":"2017-07-19 17:20:29.000000000","message":"Uhmm, but what I need here is to map a function with the elements in the tuple.\n\nMoreover I need to join the dot to the numbers.\n\nAnyway, I love list and dict comprehensions!","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d0f3b0588969e085969c1c6f5383fbd6a9c0b87a","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff346bd7_8982dfc7","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":67},"updated":"2017-07-23 05:29:57.000000000","message":"it should be possible to create a versioned object for the dict_of_sting fileds i think as the stings that are currently suppported are a fixed set.\ne.g. vendor_id, product_id, pci adress...\n\ni think that would be better put in a followup patch though so i think this is fine for now.\n\npossible the same is true of the dict_of_list filed\nother then then capablitys dictionary i dont think we will have another entry in this structure. so you could just rename it capablites.","commit_id":"a870d27485d490733cc3d4fbf57a204c147f0a6c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2da711cb3a3d84fed54583eff5d0b0f023f05b5b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027dict_of_lists\u0027: fields.DictOfListOfStringsField(nullable\u003dTrue),"},{"line_number":30,"context_line":"        \u0027dict_of_strings\u0027: fields.DictOfStringsField(nullable\u003dTrue),"},{"line_number":31,"context_line":"    }"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff346bd7_319b4e73","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":67},"in_reply_to":"ff346bd7_8982dfc7","updated":"2017-07-24 07:54:39.000000000","message":"To add a new filed in this OVO is easy; you need to:\n- Add the new type in the fields dict\n- Modify the three methods: create, __getitem__ and to_dict.\n\nAbout renaming the fields. As I said in several PS comments, \"dict_of_lists\" and \"dict_of_strings\" are only containers of information. Nobody can assure only capabilities are going to be in \"dict_of_lists\".\n\nBecase this object is accesed via \"__getitem__\" or \"to_dict\", the result obtained is a string or a list, regardless os the field containing this information. Also the method \"create\" does accept dictionaries with both strings and lists.\n\nThis is a (better) replacement of [1].\n\nIf you want it, I can write a comment in the fields dict talking about the objective of this whole object. But I insist: \"dict_of_strings\" and \"dict_of_lists\" are agnostic containers of information.\n\n[1] https://review.openstack.org/#/c/449257/28/nova/objects/fields.py","commit_id":"a870d27485d490733cc3d4fbf57a204c147f0a6c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"087da80f572f1b954f049166f37fb59efce44986","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"7f515b1d_1ad49b1f","line":86,"updated":"2017-09-26 18:39:20.000000000","message":"You can\u0027t do this. You need to make this a new field. A new client has to be able to receive an older form of this object and it will not be able to deserialize with the definition having changed in this way. Add a spec_obj field or something like that.","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"161776dbee3ea76a8fc9d8c2323243ff93c6c139","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f4e5783_3a9137f2","line":86,"in_reply_to":"5f4e5783_34715045","updated":"2017-10-17 15:34:13.000000000","message":"I\u0027ll change this tomorrow. Thanks for your help!","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba7ab36d47ed5d0b29c0508c4bb96704dfa879fb","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f4e5783_34715045","line":86,"in_reply_to":"5f4e5783_7c2fb887","updated":"2017-10-17 14:19:48.000000000","message":"No, I don\u0027t agree, sorry. We have an established pattern of just using a new field (however icky) when we have to change the field type for simplicity. It\u0027s a syntactic wart, but it\u0027s better than the alternative.\n\nWhat you can do is write a lazy-load handler which will generate the new field from the old one if set, and vice versa. This will help the transition a bit. Details below.","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0d76062bbc96e7b76cc5e44773e73c5a50eddd5e","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f4e5783_7c2fb887","line":86,"in_reply_to":"5f4e5783_d3858d5b","updated":"2017-10-17 08:49:51.000000000","message":"As commented with Dan in IRC, the problem arises when an old node is sending data to a new node.\n\nThis example was documented by Dan (thanks!)\n- Test case: https://pastebin.com/LapK0Rnz\n- Error log: https://pastebin.com/cXTH5P2i\n\nAs you can see in the error log, \"obj_from_primitive\" doesn\u0027t check the primitive version.\n\nThis problem doesn\u0027t happen in the other way, new to old. Obj primitive is sent via RPC, but the newer node transforms the object to primitive with the targets version (old node version).\n\nThe suggestion made by Dan in this line (first comment) is to create a new field to handle this new data type. Even at the risk of looking too stubborn, I think we should handle this new data type in the same field, to avoid changing more code.\n\nMy proposal: to override \"obj_from_primitive\" in InstancePCIRequest. Doing this we can\n- Handle old version primitives\n- Keep the rest of the logic untouched.\n\nI\u0027ll include the test given by Dan in https://pastebin.com/LapK0Rnz1.\n\n@Dan, if you don\u0027t agree with PS45, I\u0027ll rewrite it to create a new field (\"spec_obj\" or something similar).","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"23798b4cc6214254e0208258c7a51d696ae1694d","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"7f515b1d_c0ba7f6c","line":86,"in_reply_to":"7f515b1d_1ad49b1f","updated":"2017-09-27 09:05:15.000000000","message":"InstancePCIRequest is a transient object, not stored in the database. I used to trasnport the PCI request information during the allocation and the PCI claim. This object is built in the controller node only at this point and the information contained is used:\n- To change the PCI devices status.\n- In the scheduler (PCI passthough filter).\n- To make a claim.\n\nBut this information (object itself) is not stored.\n\nFurthermore, every call in the code to this object was changed in this patch to create this new version object.\n\nAm I missing something?","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61281f7baa39cc00f60077594841d91b43c4443b","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    fields \u003d {"},{"line_number":85,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":86,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":87,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":88,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":89,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f4e5783_d3858d5b","line":86,"in_reply_to":"7f515b1d_c0ba7f6c","updated":"2017-10-16 17:15:20.000000000","message":"It doesn\u0027t matter if it\u0027s stored in the database. It\u0027s sent over RPC which means older nodes receiving this depend on it being compatible with what they\u0027re expecting.","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba7ab36d47ed5d0b29c0508c4bb96704dfa879fb","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    }"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def obj_load_attr(self, attr):"},{"line_number":95,"context_line":"        setattr(self, attr, None)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":98,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"}],"source_content_type":"text/x-python","patch_set":42,"id":"5f4e5783_d4b0bcdf","line":95,"updated":"2017-10-17 14:19:48.000000000","message":"Something like this:\n\n if attr \u003d\u003d \"spec_obj\" and \"spec\" in self:\n     self.spec_obj \u003d convert_old_to_new(self.spec)\n elif attr \u003d\u003d \"spec\" and \"spec_obj\" in self:\n     self.spec \u003d convert_new_to_old(self.spec_obj)\n else:\n     setattr(self, attr, None)","commit_id":"a8585d62c8352f020b1a468c540aebf5258a4048"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            spec_list \u003d []"},{"line_number":111,"context_line":"            for spec in self.spec:"},{"line_number":112,"context_line":"                spec_dict \u003d spec.to_dict()"},{"line_number":113,"context_line":"                if \"capabilities_network\" in spec_dict:"},{"line_number":114,"context_line":"                    del spec_dict[\"capabilities_network\"]"},{"line_number":115,"context_line":"                spec_list.append(spec_dict)"},{"line_number":116,"context_line":"            primitive[\u0027spec\u0027] \u003d spec_list"},{"line_number":117,"context_line":"        if target_version \u003c (1, 2) and \u0027numa_policy\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_be9a9ac2","line":114,"range":{"start_line":113,"start_character":0,"end_line":114,"end_character":57},"updated":"2018-01-25 11:22:22.000000000","message":"Yeah, this needs to live here rather than InstancePCIRequestSpec because InstancePCIRequestSpec didn\u0027t exist before InstancePCIRequest version 1.3.\n\nI guess you could have created InstancePCIRequestSpec without this attribute first, then immediately bumped the version to 1.1 and moved these particular lines into InstancePCIRequestSpec.obj_make_compatible. That seems like more work than necessary though","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":127,"context_line":"    # Version 1.0: Initial version"},{"line_number":128,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":129,"context_line":"    # Version 1.2: InstancePCIRequest 1.2"},{"line_number":130,"context_line":"    # Version 1.3: InstancePCIRequest 1.3"},{"line_number":131,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_be837a56","line":130,"range":{"start_line":129,"start_character":0,"end_line":130,"end_character":41},"updated":"2018-01-25 11:22:22.000000000","message":"Whut? I thought you didn\u0027t need to change parents anymore. Also, why are there two version bumps?\n\nCome to think of it, I feel I have asked this question before. A note in the commit message would be a good idea if so","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":127,"context_line":"    # Version 1.0: Initial version"},{"line_number":128,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":129,"context_line":"    # Version 1.2: InstancePCIRequest 1.2"},{"line_number":130,"context_line":"    # Version 1.3: InstancePCIRequest 1.3"},{"line_number":131,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_219aea13","line":130,"range":{"start_line":129,"start_character":0,"end_line":130,"end_character":41},"in_reply_to":"5f93b717_be837a56","updated":"2018-01-25 13:07:07.000000000","message":"your correct you have to change downwards for inheritance but i believe it was decided not to upwards for composition unless introducing or removing a new filed e.g only change version of the hash of the object changes. ill revert to 1.2","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":139,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":140,"context_line":"        if target_version \u003c (1, 3) and \u0027requests\u0027 in primitive:"},{"line_number":141,"context_line":"            _version \u003d \u0027.\u0027.join(map(str, target_version))"},{"line_number":142,"context_line":"            for index, request in enumerate(self.requests):"},{"line_number":143,"context_line":"                request.obj_make_compatible("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_2452f814","line":140,"range":{"start_line":140,"start_character":28,"end_line":140,"end_character":34},"updated":"2018-01-25 13:07:07.000000000","message":"this should also be (1,2)","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            requests \u003d []"},{"line_number":155,"context_line":"        for request in requests:"},{"line_number":156,"context_line":"            spec \u003d [InstancePCIRequestSpec.create(spec)"},{"line_number":157,"context_line":"                    for spec in request[\u0027spec\u0027]]"},{"line_number":158,"context_line":"            # Note(moshele): is_new is deprecated and therefore we load it"},{"line_number":159,"context_line":"            # with default value of False"},{"line_number":160,"context_line":"            request_obj \u003d InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_1ebcee03","line":157,"range":{"start_line":156,"start_character":0,"end_line":157,"end_character":48},"updated":"2018-01-25 11:22:22.000000000","message":"This is necessary so...we can modify the objects and persist them?","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            requests \u003d []"},{"line_number":155,"context_line":"        for request in requests:"},{"line_number":156,"context_line":"            spec \u003d [InstancePCIRequestSpec.create(spec)"},{"line_number":157,"context_line":"                    for spec in request[\u0027spec\u0027]]"},{"line_number":158,"context_line":"            # Note(moshele): is_new is deprecated and therefore we load it"},{"line_number":159,"context_line":"            # with default value of False"},{"line_number":160,"context_line":"            request_obj \u003d InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_8412ec57","line":157,"range":{"start_line":156,"start_character":0,"end_line":157,"end_character":48},"in_reply_to":"5f93b717_1ebcee03","updated":"2018-01-25 13:07:07.000000000","message":"well when we get the object back from the db the specs are dictionaies not InstancePCIRequestSpec objects so\nwe want to constuct the object form as part of retriving\nInstancePCIRequest objects.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027physical_network\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027capability_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027capabilities_network\u0027: fields.ListOfStringsField(default\u003d[])"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, **data):"},{"line_number":40,"context_line":"        \"\"\"Create a PCI request spec object."}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_5b25aeaa","line":37,"updated":"2018-03-17 19:33:38.000000000","message":"physical_network and capabilities_network are pretty assume-the-pci-device-is-a-network-device-y fields.  I guess they get ignored if that\u0027s not the case?","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027physical_network\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":35,"context_line":"        \u0027capability_type\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027capabilities_network\u0027: fields.ListOfStringsField(default\u003d[])"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, **data):"},{"line_number":40,"context_line":"        \"\"\"Create a PCI request spec object."}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_d66ba3ee","line":37,"in_reply_to":"df7087c5_5b25aeaa","updated":"2018-03-20 13:06:45.000000000","message":"they will be unset for \"normal\" pci devices\nso yes they will just be ignored.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8631eac7005117bf2e52ade97f1b018db48c527f","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    fields \u003d {"},{"line_number":88,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":89,"context_line":"        \u0027spec\u0027: fields.ListOfObjectsField(\u0027InstancePCIRequestSpec\u0027),"},{"line_number":90,"context_line":"        \u0027alias_name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        # Note(moshele): is_new is deprecated and should be removed"},{"line_number":92,"context_line":"        # on major version bump"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_a9c7c945","line":89,"updated":"2018-03-19 15:56:35.000000000","message":"You can\u0027t change the format of a field. It is an incompatible change and will not be deserialize-able by both old and new nodes simultaneously, which is the requirement. You need to migrate to a new field, or define a new major version of this object (you want the former, I promise).","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            spec_list \u003d []"},{"line_number":105,"context_line":"            for spec in self.spec:"},{"line_number":106,"context_line":"                spec_dict \u003d spec.to_dict()"},{"line_number":107,"context_line":"                if \"capabilities_network\" in spec_dict:"},{"line_number":108,"context_line":"                    del spec_dict[\"capabilities_network\"]"},{"line_number":109,"context_line":"                spec_list.append(spec_dict)"},{"line_number":110,"context_line":"            primitive[\u0027spec\u0027] \u003d spec_list"},{"line_number":111,"context_line":"        if target_version \u003c (1, 2) and \u0027numa_policy\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_38124064","line":108,"range":{"start_line":107,"start_character":16,"end_line":108,"end_character":57},"updated":"2018-03-17 19:33:38.000000000","message":"or spec_dict.pop(\u0027capabilities_network\u0027, None) ?","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            spec_list \u003d []"},{"line_number":105,"context_line":"            for spec in self.spec:"},{"line_number":106,"context_line":"                spec_dict \u003d spec.to_dict()"},{"line_number":107,"context_line":"                if \"capabilities_network\" in spec_dict:"},{"line_number":108,"context_line":"                    del spec_dict[\"capabilities_network\"]"},{"line_number":109,"context_line":"                spec_list.append(spec_dict)"},{"line_number":110,"context_line":"            primitive[\u0027spec\u0027] \u003d spec_list"},{"line_number":111,"context_line":"        if target_version \u003c (1, 2) and \u0027numa_policy\u0027 in primitive:"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_b65b8f52","line":108,"range":{"start_line":107,"start_character":16,"end_line":108,"end_character":57},"in_reply_to":"df7087c5_38124064","updated":"2018-03-20 13:06:45.000000000","message":"i used del simply to keep parity with how we modify the primitive dict below.\npop would also work.\n\nspec_dict.pop(\u0027capabilities_network\u0027, None) would allow me to get rid of the explicit if but there still would be one internally in pop function + an additional memory allocation for the None object which is immediately discarded so i think pop would be less efficient.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":121,"context_line":"    # Version 1.0: Initial version"},{"line_number":122,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_5817f452","line":123,"updated":"2018-03-17 19:33:38.000000000","message":"unrelated","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                          base.NovaObjectDictCompat):"},{"line_number":121,"context_line":"    # Version 1.0: Initial version"},{"line_number":122,"context_line":"    # Version 1.1: InstancePCIRequest 1.1"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_11fe0505","line":123,"in_reply_to":"df7087c5_5817f452","updated":"2018-03-20 13:06:45.000000000","message":"correct ill try and remove this","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            requests \u003d []"},{"line_number":147,"context_line":"        for request in requests:"},{"line_number":148,"context_line":"            spec \u003d [InstancePCIRequestSpec(**spec)"},{"line_number":149,"context_line":"                    for spec in request[\u0027spec\u0027]]"},{"line_number":150,"context_line":"            # Note(moshele): is_new is deprecated and therefore we load it"},{"line_number":151,"context_line":"            # with default value of False"},{"line_number":152,"context_line":"            request_obj \u003d InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_b805f016","line":149,"range":{"start_line":149,"start_character":24,"end_line":149,"end_character":28},"updated":"2018-03-17 19:33:38.000000000","message":"This var name reuse is technically fine but makes me uncomfortable.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            requests \u003d []"},{"line_number":147,"context_line":"        for request in requests:"},{"line_number":148,"context_line":"            spec \u003d [InstancePCIRequestSpec(**spec)"},{"line_number":149,"context_line":"                    for spec in request[\u0027spec\u0027]]"},{"line_number":150,"context_line":"            # Note(moshele): is_new is deprecated and therefore we load it"},{"line_number":151,"context_line":"            # with default value of False"},{"line_number":152,"context_line":"            request_obj \u003d InstancePCIRequest("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_713181ec","line":149,"range":{"start_line":149,"start_character":24,"end_line":149,"end_character":28},"in_reply_to":"df7087c5_b805f016","updated":"2018-03-20 13:06:45.000000000","message":"its just used in a list comprehention so im fine with chaging this to \"s\" or something so that people dont read this as a possible alias of an existing spec variable.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        db_requests \u003d jsonutils.loads(sysmeta_value)"},{"line_number":175,"context_line":"        for db_request in db_requests:"},{"line_number":176,"context_line":"            spec \u003d [InstancePCIRequestSpec(**spec)"},{"line_number":177,"context_line":"                    for spec in db_request[\u0027spec\u0027]]"},{"line_number":178,"context_line":"            request \u003d InstancePCIRequest("},{"line_number":179,"context_line":"                count\u003ddb_request[\u0027count\u0027], spec\u003dspec,"},{"line_number":180,"context_line":"                alias_name\u003ddb_request[\u0027alias_name\u0027], is_new\u003dis_new)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_d802240c","line":177,"range":{"start_line":177,"start_character":24,"end_line":177,"end_character":28},"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        db_requests \u003d jsonutils.loads(sysmeta_value)"},{"line_number":175,"context_line":"        for db_request in db_requests:"},{"line_number":176,"context_line":"            spec \u003d [InstancePCIRequestSpec(**spec)"},{"line_number":177,"context_line":"                    for spec in db_request[\u0027spec\u0027]]"},{"line_number":178,"context_line":"            request \u003d InstancePCIRequest("},{"line_number":179,"context_line":"                count\u003ddb_request[\u0027count\u0027], spec\u003dspec,"},{"line_number":180,"context_line":"                alias_name\u003ddb_request[\u0027alias_name\u0027], is_new\u003dis_new)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_f15a7128","line":177,"range":{"start_line":177,"start_character":24,"end_line":177,"end_character":28},"in_reply_to":"df7087c5_d802240c","updated":"2018-03-20 13:06:45.000000000","message":"sure ill change this to s also.","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/pci/request.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"feccbc2da37a899c6ce022f9a9eebf4261c57578","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"df87a7cf_d6d34600","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"updated":"2017-12-19 11:59:48.000000000","message":"This essentially describes what spec should be and, as things are right now, I don\u0027t think we\u0027d even support something else. Instead of storing a JSON blob, which is essentially what we\u0027re doing with the \u0027dict_of_lists\u0027 and \u0027dict_of_strings\u0027 fields in \u0027InstancePCIRequestSpec\u0027, can we take this opportunity to encode these fields in \u0027InstancePCIRequestSpec\u0027 instead?","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0cf8b36f83217766b41029b331f7ec8da9f67f4a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_7d7ace24","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_7a85f4ac","updated":"2018-01-02 16:10:27.000000000","message":"\u003e I think this is a good idea. But IMO this should be in other patch.\n\u003e\n\u003e I agree with enforcing the type of the parameters but let me put this in other patch. This one is big enough.\n\nThat doesn\u0027t really make sense though. You\u0027re adding a new object, InstancePCIRequestSpec in this patch. What I\u0027m suggesting is that rather than adding two fields that don\u0027t really have any meaning (dict_of_lists, dict_of_strings), we add fields based on what those dicts contain. This JSONSchema simply tells us what those fields are.","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"608ab971e91001ca7a9d936b7076758c82dffbea","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_aa123c57","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_7d7ace24","updated":"2018-01-03 10:34:02.000000000","message":"InstancePCIRequest.spec is supposed to be a generic container for specifications; that\u0027s why I\u0027m creating those generic containers.\n\nIf I add these fields, \"specs\" (and InstancePICRequestSpec) will be used only for those parameters: vendor, product and device_type. The scope of this patch is to be able to store in \"spec\" (InstancePICRequestSpec) a list of strings, containing the os-traits defining the PCI capabilities.\n\nIf I accept this suggestion I need to refactor the whole patch.","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f52586ea95ea96bc709ff4ea7e503d61a19a6e1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"7f96bb07_1d3a5d97","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_94cb121d","updated":"2018-01-24 02:43:18.000000000","message":"Done","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"95ddb810b2002a3f5749605c7ba40093212a38d2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_7a85f4ac","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_94cb121d","updated":"2018-01-02 15:30:41.000000000","message":"I think this is a good idea. But IMO this should be in other patch.\n\nI agree with enforcing the type of the parameters but let me put this in other patch. This one is big enough.\n\nI should also write an small BP for this because this could be out of scope in the current BP.","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"50ce10d08d1cb694792fc5d71a31d6175c357fb8","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_daac298e","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_aa123c57","updated":"2018-01-03 15:16:12.000000000","message":"\u003e InstancePCIRequest.spec is supposed to be a generic container for\n \u003e specifications; that\u0027s why I\u0027m creating those generic containers.\n \u003e \n \u003e If I add these fields, \"specs\" (and InstancePICRequestSpec) will be\n \u003e used only for those parameters: vendor, product and device_type.\n \u003e The scope of this patch is to be able to store in \"spec\"\n \u003e (InstancePICRequestSpec) a list of strings, containing the\n \u003e os-traits defining the PCI capabilities.\n \u003e \n \u003e If I accept this suggestion I need to refactor the whole patch.\n\nAs discussed on IRC this morning, the current field is a generic container for specifications. However, given that we\u0027re already reworking this field, it doesn\u0027t make sense to carry the generic\u0027ness into the new object. I realize that this is a good deal of rework and I\u0027m sorry I didn\u0027t raise this earlier, but we\u0027d be doing ourselves a disservice if we didn\u0027t explore this stuff. I\u0027ll be sure to prioritize reviews of the reworked patch, which I imagine will be greatly simplified over what we have here. Hit me up on IRC if you\u0027ve more questions.","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8f8857bbcac6647fffe64a7e4533201966036e4b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_e8eb50d9","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"9f91af0f_daac298e","updated":"2018-01-04 15:38:27.000000000","message":"I\u0027ll refactor this object but I don\u0027t agree with making it field specific. \"spec\" should be a generic container for elements, strings (like now) or list of strings (new feature).\n\nAnyway, I\u0027ll need next week to refactor this patch.\n\nBTW, \"name\" can\u0027t be stored in this new object because is not a spec.","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7f6d4498bd23a8af4d14a6031dceab8d723756e3","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"9f91af0f_94cb121d","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"bf8cb3f7_d1274012","updated":"2017-12-28 12:38:36.000000000","message":"What I\u0027m suggesting is that you specify these fields on the object itself instead of keeping it abstract. For example:\n\n    @base.NovaObjectRegistry.register\n    class InstancePCIRequestSpec(base.NovaObject, base.ComparableVersionedObject):\n        # Version 1.0: Initial version\n    \n        VERSION \u003d \u00271.0\u0027\n    \n         # TODO(stephenfin): Enforce a length on \u0027name\u0027\n        fields \u003d {\n            \u0027name\u0027: fields.StringField(),\n            \u0027product_id\u0027: fields.PCIProductID(nullable\u003dTrue),\n            \u0027vendor_id\u0027: fields.PCIVendorID(nullable\u003dTrue),\n            \u0027device_type\u0027: fields.PciDeviceType(nullable\u003dTrue),\n        }\n    \n        ...","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"882283b9e6b09497519a014270fa79f29e82390d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"type\": \"object\","},{"line_number":71,"context_line":"    \"additionalProperties\": False,"},{"line_number":72,"context_line":"    \"properties\": {"},{"line_number":73,"context_line":"        \"name\": {"},{"line_number":74,"context_line":"            \"type\": \"string\","},{"line_number":75,"context_line":"            \"minLength\": 1,"},{"line_number":76,"context_line":"            \"maxLength\": 256,"},{"line_number":77,"context_line":"        },"},{"line_number":78,"context_line":"        \"capability_type\": {"},{"line_number":79,"context_line":"            \"type\": \"string\","},{"line_number":80,"context_line":"            \"enum\": _ALIAS_CAP_TYPE,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"        \"product_id\": {"},{"line_number":83,"context_line":"            \"type\": \"string\","},{"line_number":84,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":85,"context_line":"        },"},{"line_number":86,"context_line":"        \"vendor_id\": {"},{"line_number":87,"context_line":"            \"type\": \"string\","},{"line_number":88,"context_line":"            \"pattern\": utils.PCI_VENDOR_PATTERN,"},{"line_number":89,"context_line":"        },"},{"line_number":90,"context_line":"        \"device_type\": {"},{"line_number":91,"context_line":"            \"type\": \"string\","},{"line_number":92,"context_line":"            \"enum\": _ALIAS_DEV_TYPE,"},{"line_number":93,"context_line":"        },"},{"line_number":94,"context_line":"    },"},{"line_number":95,"context_line":"    \"required\": [\"name\"],"},{"line_number":96,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":52,"id":"bf8cb3f7_d1274012","line":93,"range":{"start_line":73,"start_character":0,"end_line":93,"end_character":10},"in_reply_to":"df87a7cf_d6d34600","updated":"2017-12-22 10:19:54.000000000","message":"I need a clarification here (ping in IRC)","commit_id":"18504c0fd1924e814b19fcab8d06170f6f24f92c"}],"nova/pci/stats.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1bfa94bbdadc07ce43943d498fc1fe19e8ad2b8b","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # that case None is reported in pci_device.numa_node, by adding None"},{"line_number":218,"context_line":"        # to numa_cells we allow assigning those devices to instances with"},{"line_number":219,"context_line":"        # numa topology"},{"line_number":220,"context_line":"        numa_cells \u003d [str(None)] + [str(cell.id) for cell in numa_cells]"},{"line_number":221,"context_line":"        # filter out pools which numa_node is not included in numa_cells"},{"line_number":222,"context_line":"        return [pool for pool in pools if any(utils.pci_device_prop_match("},{"line_number":223,"context_line":"            pool, [objects.InstancePCIRequestSpec.create({\u0027numa_node\u0027: cell})])"}],"source_content_type":"text/x-python","patch_set":30,"id":"3f1d235d_99060252","line":220,"range":{"start_line":220,"start_character":22,"end_line":220,"end_character":31},"updated":"2017-07-06 15:14:38.000000000","message":"huh? Why does \u0027None\u0027 make sense here?","commit_id":"4fb8fb5523b058b07e802989c5bbd9b853712ee0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c20da30e916ece2b921a7ceb4159a33b946bfbb0","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # that case None is reported in pci_device.numa_node, by adding None"},{"line_number":218,"context_line":"        # to numa_cells we allow assigning those devices to instances with"},{"line_number":219,"context_line":"        # numa topology"},{"line_number":220,"context_line":"        numa_cells \u003d [str(None)] + [str(cell.id) for cell in numa_cells]"},{"line_number":221,"context_line":"        # filter out pools which numa_node is not included in numa_cells"},{"line_number":222,"context_line":"        return [pool for pool in pools if any(utils.pci_device_prop_match("},{"line_number":223,"context_line":"            pool, [objects.InstancePCIRequestSpec.create({\u0027numa_node\u0027: cell})])"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_59918af0","line":220,"range":{"start_line":220,"start_character":22,"end_line":220,"end_character":31},"updated":"2017-07-06 15:14:58.000000000","message":"why?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # that case None is reported in pci_device.numa_node, by adding None"},{"line_number":218,"context_line":"        # to numa_cells we allow assigning those devices to instances with"},{"line_number":219,"context_line":"        # numa topology"},{"line_number":220,"context_line":"        numa_cells \u003d [str(None)] + [str(cell.id) for cell in numa_cells]"},{"line_number":221,"context_line":"        # filter out pools which numa_node is not included in numa_cells"},{"line_number":222,"context_line":"        return [pool for pool in pools if any(utils.pci_device_prop_match("},{"line_number":223,"context_line":"            pool, [objects.InstancePCIRequestSpec.create({\u0027numa_node\u0027: cell})])"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_3fb452f1","line":220,"range":{"start_line":220,"start_character":22,"end_line":220,"end_character":31},"in_reply_to":"3f1d235d_59918af0","updated":"2017-07-07 08:49:52.000000000","message":"Well, this looks very weird.\n\nThe point is in L223 I need a string (\"cell\" must be a string). But instead of modifying the creating of \"numa_cells\", I\u0027ll convert to string in the assignation, in L223.","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        numa_cell_ids \u003d [cell.id for cell in numa_cells]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # filter out pools which numa_node is not included in numa_cell_ids"},{"line_number":244,"context_line":"        filtered_pools \u003d []"},{"line_number":245,"context_line":"        for pool in pools:"},{"line_number":246,"context_line":"            if pool.get(\u0027numa_node\u0027) in numa_cell_ids:"},{"line_number":247,"context_line":"                filtered_pools.append(pool)"},{"line_number":248,"context_line":"        # we can\u0027t apply a less strict policy than the one requested, so we"},{"line_number":249,"context_line":"        # need to return if we\u0027ve demanded a NUMA affinity of REQUIRED."},{"line_number":250,"context_line":"        # However, NUMA affinity is a good thing. If we can get enough devices"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_fe6ca29d","line":247,"range":{"start_line":244,"start_character":0,"end_line":247,"end_character":43},"updated":"2018-01-25 11:22:22.000000000","message":"a.k.a.\n\n  filtered_pools \u003d [pool for pool in pools if pool.get(\u0027numa_node\u0027) in numa_cell_ids]\n\nI\u0027m a little confused. I thought \u0027numa_node\u0027 was an attribute of the device - not the pool. Did pools suddenly gain a numa_node attribute?","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        numa_cell_ids \u003d [cell.id for cell in numa_cells]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # filter out pools which numa_node is not included in numa_cell_ids"},{"line_number":244,"context_line":"        filtered_pools \u003d []"},{"line_number":245,"context_line":"        for pool in pools:"},{"line_number":246,"context_line":"            if pool.get(\u0027numa_node\u0027) in numa_cell_ids:"},{"line_number":247,"context_line":"                filtered_pools.append(pool)"},{"line_number":248,"context_line":"        # we can\u0027t apply a less strict policy than the one requested, so we"},{"line_number":249,"context_line":"        # need to return if we\u0027ve demanded a NUMA affinity of REQUIRED."},{"line_number":250,"context_line":"        # However, NUMA affinity is a good thing. If we can get enough devices"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_243c3892","line":247,"range":{"start_line":244,"start_character":0,"end_line":247,"end_character":43},"in_reply_to":"5f93b717_fe6ca29d","updated":"2018-01-25 13:07:07.000000000","message":"no it is an attribute of the pool that was added by premek 3 years ago when we first introduced numa awareness for pci devices.\n\nhttps://github.com/openstack/nova/commit/7db1ebc66c59205f78829d1e9cd10dcc1201d798\n\nalso at one point during the refactor I broke pci_device_prop_match and this exploded so i rewrote it to be simpler to debug.\n\nthe side effect was that you can also do less work to achive the same goal as i noticed we dont need to get the numa node form the device we can use it from the pool.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        numa_cell_ids.append(None)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        # filter out pools which numa_node is not included in numa_cell_ids"},{"line_number":263,"context_line":"        filtered_pools \u003d []"},{"line_number":264,"context_line":"        for pool in pools:"},{"line_number":265,"context_line":"            if pool.get(\u0027numa_node\u0027) in numa_cell_ids:"},{"line_number":266,"context_line":"                filtered_pools.append(pool)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        # once again, we can\u0027t apply a less strict policy than the one"},{"line_number":269,"context_line":"        # requested, so we need to return if we\u0027ve demanded a NUMA affinity of"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_feefc2e6","line":266,"range":{"start_line":263,"start_character":0,"end_line":266,"end_character":43},"updated":"2018-01-25 11:22:22.000000000","message":"As above","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        ret \u003d pools"},{"line_number":288,"context_line":"        filter_pfs \u003d True"},{"line_number":289,"context_line":"        for spec in request.spec:"},{"line_number":290,"context_line":"            if \u0027dev_type\u0027 in spec and spec.dev_type \\"},{"line_number":291,"context_line":"                    \u003d\u003d fields.PciDeviceType.SRIOV_PF:"},{"line_number":292,"context_line":"                filter_pfs \u003d False"},{"line_number":293,"context_line":"        if filter_pfs:"},{"line_number":294,"context_line":"            ret \u003d cls._filter_pools_for_pfs(pools)"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_1eff0eab","line":291,"range":{"start_line":290,"start_character":38,"end_line":291,"end_character":53},"updated":"2018-01-25 11:22:22.000000000","message":"nit: Could you use brackets here instead?","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        ret \u003d pools"},{"line_number":288,"context_line":"        filter_pfs \u003d True"},{"line_number":289,"context_line":"        for spec in request.spec:"},{"line_number":290,"context_line":"            if \u0027dev_type\u0027 in spec and spec.dev_type \\"},{"line_number":291,"context_line":"                    \u003d\u003d fields.PciDeviceType.SRIOV_PF:"},{"line_number":292,"context_line":"                filter_pfs \u003d False"},{"line_number":293,"context_line":"        if filter_pfs:"},{"line_number":294,"context_line":"            ret \u003d cls._filter_pools_for_pfs(pools)"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_a4704874","line":291,"range":{"start_line":290,"start_character":38,"end_line":291,"end_character":53},"in_reply_to":"5f93b717_1eff0eab","updated":"2018-01-25 13:07:07.000000000","message":"yes i prefer them personally too so ill change.\ni have not find a pycharm setting to make it do that wehn i hit return automatically however, if you know of one let me know so i can change my default form \\","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @staticmethod"},{"line_number":298,"context_line":"    def _filter_pools_for_pfs(pools):"},{"line_number":299,"context_line":"        ret \u003d []"},{"line_number":300,"context_line":"        for pool in pools:"},{"line_number":301,"context_line":"            if pool.get(\"dev_type\") !\u003d fields.PciDeviceType.SRIOV_PF:"},{"line_number":302,"context_line":"                ret.append(pool)"},{"line_number":303,"context_line":"        return ret"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def _apply_request(self, pools, request, numa_cells\u003dNone):"},{"line_number":306,"context_line":"        \"\"\"Apply a PCI request."}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_9e2c7e48","line":303,"range":{"start_line":299,"start_character":0,"end_line":303,"end_character":18},"updated":"2018-01-25 11:22:22.000000000","message":"Unnecessary change? This seems the exact same","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @staticmethod"},{"line_number":298,"context_line":"    def _filter_pools_for_pfs(pools):"},{"line_number":299,"context_line":"        ret \u003d []"},{"line_number":300,"context_line":"        for pool in pools:"},{"line_number":301,"context_line":"            if pool.get(\"dev_type\") !\u003d fields.PciDeviceType.SRIOV_PF:"},{"line_number":302,"context_line":"                ret.append(pool)"},{"line_number":303,"context_line":"        return ret"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def _apply_request(self, pools, request, numa_cells\u003dNone):"},{"line_number":306,"context_line":"        \"\"\"Apply a PCI request."}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_e413b00c","line":303,"range":{"start_line":299,"start_character":0,"end_line":303,"end_character":18},"in_reply_to":"5f93b717_9e2c7e48","updated":"2018-01-25 13:07:07.000000000","message":"ya that was for debuging ill revert.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        numa_cell_ids \u003d [cell.id for cell in numa_cells]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # filter out pools which numa_node is not included in numa_cell_ids"},{"line_number":244,"context_line":"        filtered_pools \u003d []"},{"line_number":245,"context_line":"        for pool in pools:"},{"line_number":246,"context_line":"            if pool.get(\u0027numa_node\u0027) in numa_cell_ids:"},{"line_number":247,"context_line":"                filtered_pools.append(pool)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_9b026609","line":244,"updated":"2018-03-17 19:33:38.000000000","message":"Changes in this file don\u0027t seem related.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        numa_cell_ids \u003d [cell.id for cell in numa_cells]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # filter out pools which numa_node is not included in numa_cell_ids"},{"line_number":244,"context_line":"        filtered_pools \u003d []"},{"line_number":245,"context_line":"        for pool in pools:"},{"line_number":246,"context_line":"            if pool.get(\u0027numa_node\u0027) in numa_cell_ids:"},{"line_number":247,"context_line":"                filtered_pools.append(pool)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_113605b6","line":244,"in_reply_to":"df7087c5_9b026609","updated":"2018-03-20 13:06:45.000000000","message":"technically this is an optimisation but a code change is required here in anycase.\n\nas i am useing objects now the old code will break since\nany(utils.pci_device_prop_match(\n                pool, [{\u0027numa_node\u0027: cell}])\nis now invalid. \n\npci_device_prop_match is expecting a list of pciRequestSpec object not a list of dicts  however the numa_node an atribute of the pool so we never needed to loop over all the device in the pool in the first place so i\njust retrive the numa_node form the pool instead and skip constructing the list of objects entirely.\n\nthis could proably be in a sepreate change before this patch but i discovered it while making the change to object from dictionaries.\n\nwould you like me to pull this out so it can be backported seperately. this optimsation has been valid since numa_nodes of pci devieces were introduced in icehouse.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        # Remove SRIOV_PFs from pools, unless it has been explicitly requested"},{"line_number":285,"context_line":"        # This is especially needed in cases where PFs and VFs have the same"},{"line_number":286,"context_line":"        # product_id."},{"line_number":287,"context_line":"        ret \u003d pools"},{"line_number":288,"context_line":"        filter_pfs \u003d True"},{"line_number":289,"context_line":"        for spec in request.spec:"},{"line_number":290,"context_line":"            if (\u0027dev_type\u0027 in spec and spec.dev_type"},{"line_number":291,"context_line":"                    \u003d\u003d fields.PciDeviceType.SRIOV_PF):"},{"line_number":292,"context_line":"                filter_pfs \u003d False"},{"line_number":293,"context_line":"        if filter_pfs:"},{"line_number":294,"context_line":"            ret \u003d cls._filter_pools_for_pfs(pools)"},{"line_number":295,"context_line":"        return ret"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @staticmethod"},{"line_number":298,"context_line":"    def _filter_pools_for_pfs(pools):"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_f1127109","line":295,"range":{"start_line":287,"start_character":7,"end_line":295,"end_character":18},"updated":"2018-03-20 13:06:45.000000000","message":"this change was prmarily for debuging and reablity.\ni think the old code would technically work however it was impossible to set breakpoints and debug when it was condensed onto one line.","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/pci/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76ef7df9446a7ec02468c60d652648c1f78bde8d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"def pci_device_prop_match(pci_dev, specs):"},{"line_number":40,"context_line":"    \"\"\"Check if the pci_dev meet spec requirement"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    Specs is a list of PCI device property requirements."},{"line_number":43,"context_line":"    An example of device requirement that the PCI should be either:"},{"line_number":44,"context_line":"    a) Device with vendor_id as 0x8086 and product_id as 0x8259, or"},{"line_number":45,"context_line":"    b) Device with vendor_id as 0x10de and product_id as 0x10d8:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_d4267f68","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":56},"updated":"2017-07-06 15:26:21.000000000","message":"Is this still true?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"def pci_device_prop_match(pci_dev, specs):"},{"line_number":40,"context_line":"    \"\"\"Check if the pci_dev meet spec requirement"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    Specs is a list of PCI device property requirements."},{"line_number":43,"context_line":"    An example of device requirement that the PCI should be either:"},{"line_number":44,"context_line":"    a) Device with vendor_id as 0x8086 and product_id as 0x8259, or"},{"line_number":45,"context_line":"    b) Device with vendor_id as 0x10de and product_id as 0x10d8:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_dfc2fe84","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":56},"in_reply_to":"3f1d235d_d4267f68","updated":"2017-07-07 08:49:52.000000000","message":"Nope, you are right!","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8ec1a30289f519cabb87ad9f3399406e7049e0f0","unresolved":false,"context_lines":[{"line_number":39,"context_line":"def pci_device_prop_match(pci_dev, specs):"},{"line_number":40,"context_line":"    \"\"\"Check if the pci_dev meet spec requirement"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    Specs is a list of PCI device property requirements."},{"line_number":43,"context_line":"    An example of device requirement that the PCI should be either:"},{"line_number":44,"context_line":"    a) Device with vendor_id as 0x8086 and product_id as 0x8259, or"},{"line_number":45,"context_line":"    b) Device with vendor_id as 0x10de and product_id as 0x10d8:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_42129563","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":56},"in_reply_to":"3f1d235d_dfc2fe84","updated":"2017-07-07 09:30:14.000000000","message":"No, is still true: is a list of device requirements, but now each spec is not a dict but a InstancePCIRequestSpec object.","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76ef7df9446a7ec02468c60d652648c1f78bde8d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"      \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]}]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    def _matching_devices(spec):"},{"line_number":53,"context_line":"        for k, v in spec.dict_of_lists.items():"},{"line_number":54,"context_line":"            if not all(x in pci_dev.get(k) for x in v):"},{"line_number":55,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_74f68bd9","line":52,"updated":"2017-07-06 15:26:21.000000000","message":"Can you please put comments in here to document this code, because it\u0027s confusing to look at. Or is that what\u0027s above and needs to be updated?","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beb05b2013975a80c57ad309b191a2091fd8f6b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"      \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]}]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    def _matching_devices(spec):"},{"line_number":53,"context_line":"        for k, v in spec.dict_of_lists.items():"},{"line_number":54,"context_line":"            if not all(x in pci_dev.get(k) for x in v):"},{"line_number":55,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":31,"id":"3f1d235d_ff75ba64","line":52,"in_reply_to":"3f1d235d_74f68bd9","updated":"2017-07-07 08:49:52.000000000","message":"Actually the comments of this function where updated in previous patches.\n\nBut of course, in sake of clarity, I\u0027ll add comments.","commit_id":"cf5e770034c01842e5ae2b2cee3ad3a0ce56ebbc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d0f3b0588969e085969c1c6f5383fbd6a9c0b87a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    [InstancePCIRequestSpec({\"vendor_id\":\"8086\", \"product_id\":\"8259\"}),"},{"line_number":50,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":51,"context_line":"         \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]})]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    def _matching_devices(spec):"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff346bd7_496cf735","line":51,"range":{"start_line":51,"start_character":10,"end_line":51,"end_character":59},"updated":"2017-07-23 05:29:57.000000000","message":"is it  \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]\nof  \"capabilities\":{ \"network\": [\"rx\", \"tx\", \"tso\", \"gso\"]}","commit_id":"a870d27485d490733cc3d4fbf57a204c147f0a6c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2da711cb3a3d84fed54583eff5d0b0f023f05b5b","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    [InstancePCIRequestSpec({\"vendor_id\":\"8086\", \"product_id\":\"8259\"}),"},{"line_number":50,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":51,"context_line":"         \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]})]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    def _matching_devices(spec):"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff346bd7_d1e642e9","line":51,"range":{"start_line":51,"start_character":10,"end_line":51,"end_character":59},"in_reply_to":"ff346bd7_496cf735","updated":"2017-07-24 07:54:39.000000000","message":"This is correct:\n  \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]\n\n\nEssentially, InstancePCIRequestSpec is a dict with list and string values:\n  {\"vendor_id\":\"10de\",\n   \"product_id\":\"10d8\",\n   \"capabilities_network\": [\"rx\", \"tx\", \"tso\", \"gso\"]\n  }\n\n\nInstancePCIRequestSpec doesn\u0027t accept nested dicts.","commit_id":"a870d27485d490733cc3d4fbf57a204c147f0a6c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e983a2fca80210c7b53a64094dca2746112425dd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        #   - dictionaty of strings"},{"line_number":59,"context_line":"        # Each type of data must be compared in a different way."},{"line_number":60,"context_line":"        for k in spec.fields:"},{"line_number":61,"context_line":"            if not hasattr(spec, k):"},{"line_number":62,"context_line":"                continue"},{"line_number":63,"context_line":"            val \u003d getattr(spec, k)"},{"line_number":64,"context_line":"            pci_dev_v \u003d pci_dev.get(k)"}],"source_content_type":"text/x-python","patch_set":56,"id":"5f93b717_7730d008","line":61,"range":{"start_line":61,"start_character":18,"end_line":61,"end_character":35},"updated":"2018-01-24 19:24:24.000000000","message":"the ovo base class defines __contains__ \nso i can use \u0027in\u0027 here instead and make this python 3 compatible.","commit_id":"318a2685a04f7e42e93a917ef9845cb4cedd1304"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":50,"context_line":"         \"capabilities_network\": [\"HW_NIC_OFFLOAD_RX\", \"HW_NIC_OFFLOAD_TX\","},{"line_number":51,"context_line":"                                  \"HW_NIC_OFFLOAD_TSO\"]})]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    def _matching_devices(spec):"},{"line_number":55,"context_line":"        # Each spec is a \"InstancePCIRequestSpec\" object. This object can"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_bebb7ae3","line":52,"updated":"2018-01-25 11:22:22.000000000","message":"nit: Any chance of adding \u0027:param:\u0027 lines here, now that we know the type?","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":49,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":50,"context_line":"         \"capabilities_network\": [\"HW_NIC_OFFLOAD_RX\", \"HW_NIC_OFFLOAD_TX\","},{"line_number":51,"context_line":"                                  \"HW_NIC_OFFLOAD_TSO\"]})]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    def _matching_devices(spec):"},{"line_number":55,"context_line":"        # Each spec is a \"InstancePCIRequestSpec\" object. This object can"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_048fbc23","line":52,"in_reply_to":"5f93b717_bebb7ae3","updated":"2018-01-25 13:07:07.000000000","message":"sure. i was more focused on fixing the code then the comments. ill respin with this change when i do the others.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Each spec is a \"InstancePCIRequestSpec\" object. This object can"},{"line_number":56,"context_line":"        # contain:"},{"line_number":57,"context_line":"        #   - dictionary of lists (of strings)"},{"line_number":58,"context_line":"        #   - dictionaty of strings"},{"line_number":59,"context_line":"        # Each type of data must be compared in a different way."},{"line_number":60,"context_line":"        for k in spec.fields:"},{"line_number":61,"context_line":"            if k not in spec:"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_1ec62e69","line":58,"range":{"start_line":58,"start_character":14,"end_line":58,"end_character":24},"updated":"2018-01-25 11:22:22.000000000","message":"so close :) s/ty/ry/","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # Each spec is a \"InstancePCIRequestSpec\" object. This object can"},{"line_number":56,"context_line":"        # contain:"},{"line_number":57,"context_line":"        #   - dictionary of lists (of strings)"},{"line_number":58,"context_line":"        #   - dictionaty of strings"},{"line_number":59,"context_line":"        # Each type of data must be compared in a different way."},{"line_number":60,"context_line":"        for k in spec.fields:"},{"line_number":61,"context_line":"            if k not in spec:"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_c4b554f0","line":58,"range":{"start_line":58,"start_character":14,"end_line":58,"end_character":24},"in_reply_to":"5f93b717_1ec62e69","updated":"2018-01-25 13:07:07.000000000","message":"actually these are Rodolfo\u0027s spelling mistakes for once but i just realised that they are pure lies now that i made InstancePCIRequestSpec a versioned object. ill replace with something more correct.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # contain:"},{"line_number":57,"context_line":"        #   - dictionary of lists (of strings)"},{"line_number":58,"context_line":"        #   - dictionaty of strings"},{"line_number":59,"context_line":"        # Each type of data must be compared in a different way."},{"line_number":60,"context_line":"        for k in spec.fields:"},{"line_number":61,"context_line":"            if k not in spec:"},{"line_number":62,"context_line":"                continue"},{"line_number":63,"context_line":"            val \u003d getattr(spec, k)"},{"line_number":64,"context_line":"            pci_dev_v \u003d pci_dev.get(k)"},{"line_number":65,"context_line":"            if isinstance(val, list) and isinstance(pci_dev_v, list):"},{"line_number":66,"context_line":"                if not all(x in pci_dev.get(k) for x in val):"},{"line_number":67,"context_line":"                    return False"},{"line_number":68,"context_line":"            elif str(pci_dev.get(k)) !\u003d val:"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        return True"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    return any(_matching_devices(spec) for spec in specs)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_fe76e23e","line":70,"range":{"start_line":59,"start_character":0,"end_line":70,"end_character":19},"updated":"2018-01-25 11:22:22.000000000","message":"Could we not implement an \u0027__eq__\u0027 method on the object itself? Would make this clearer","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # contain:"},{"line_number":57,"context_line":"        #   - dictionary of lists (of strings)"},{"line_number":58,"context_line":"        #   - dictionaty of strings"},{"line_number":59,"context_line":"        # Each type of data must be compared in a different way."},{"line_number":60,"context_line":"        for k in spec.fields:"},{"line_number":61,"context_line":"            if k not in spec:"},{"line_number":62,"context_line":"                continue"},{"line_number":63,"context_line":"            val \u003d getattr(spec, k)"},{"line_number":64,"context_line":"            pci_dev_v \u003d pci_dev.get(k)"},{"line_number":65,"context_line":"            if isinstance(val, list) and isinstance(pci_dev_v, list):"},{"line_number":66,"context_line":"                if not all(x in pci_dev.get(k) for x in val):"},{"line_number":67,"context_line":"                    return False"},{"line_number":68,"context_line":"            elif str(pci_dev.get(k)) !\u003d val:"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        return True"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    return any(_matching_devices(spec) for spec in specs)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_248f582b","line":70,"range":{"start_line":59,"start_character":0,"end_line":70,"end_character":19},"in_reply_to":"5f93b717_fe76e23e","updated":"2018-01-25 13:07:07.000000000","message":"we are comparing a pci_device_pool to a InstancePCIRequestSpec object so since this is not c++ unfortunately not.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    e.g."},{"line_number":51,"context_line":"    [InstancePCIRequestSpec({\"vendor_id\":\"8086\", \"product_id\":\"8259\"}),"},{"line_number":52,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":53,"context_line":"         \"capabilities_network\": [\"HW_NIC_OFFLOAD_RX\", \"HW_NIC_OFFLOAD_TX\","},{"line_number":54,"context_line":"                                  \"HW_NIC_OFFLOAD_TSO\"]})]"},{"line_number":55,"context_line":"    :return: a bool True if equal else False."},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_3b20fa9b","line":53,"range":{"start_line":53,"start_character":10,"end_line":53,"end_character":30},"updated":"2018-03-17 19:33:38.000000000","message":"Aha, seeing this in context now, I have to ask: should this be called \"network_capabilities\"?\n\n(In Spanish, the adjective comes after the noun, which is probably why Rodolfo named it that way originally.)","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    e.g."},{"line_number":51,"context_line":"    [InstancePCIRequestSpec({\"vendor_id\":\"8086\", \"product_id\":\"8259\"}),"},{"line_number":52,"context_line":"     InstancePCIRequestSpec({\"vendor_id\":\"10de\", \"product_id\":\"10d8\","},{"line_number":53,"context_line":"         \"capabilities_network\": [\"HW_NIC_OFFLOAD_RX\", \"HW_NIC_OFFLOAD_TX\","},{"line_number":54,"context_line":"                                  \"HW_NIC_OFFLOAD_TSO\"]})]"},{"line_number":55,"context_line":"    :return: a bool True if equal else False."},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_51ef9de8","line":53,"range":{"start_line":53,"start_character":10,"end_line":53,"end_character":30},"in_reply_to":"df7087c5_3b20fa9b","updated":"2018-03-20 13:06:45.000000000","message":"actually its this way round because the original idea was to have a capability dictionary with a network key that points to a list ov network capablities. \ne.g. {capabilities:{network:[tx,rx,...]}}\n\nim not sure why we chose to not have a dictionary of list and decided to flatten it by contatinating capabilities_network but this name has been used in the nova db since pike so we would have to do an online migration to change it at this point or somehow parse the json blob in the db and update it in an offline migration which i would prefer not to do.","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/compute/test_claims.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":240,"context_line":"                return_value\u003dFalse)"},{"line_number":241,"context_line":"    def test_pci_fail(self, mock_pci_supports_requests):"},{"line_number":242,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":243,"context_line":"            data\u003d{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":244,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":245,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":246,"context_line":"        self.assertRaisesRegex("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_5e9fd64f","line":243,"range":{"start_line":242,"start_character":0,"end_line":243,"end_character":55},"updated":"2018-01-25 11:22:22.000000000","message":"I should have mentioned this when looking at the class itself, but why do we do this instead of:\n\n  objects.InstancePCIRequestSpec(vendor_id\u003d\u0027v\u0027, product_id\u003d\u0027p\u0027)\n\nSurely we could override the \u0027__init__\u0027 method (or whatever method is called for this) to handle the aliases (device_type -\u003e dev_type)?","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5e1227eeb1f758642a78ca8a3988bb832729b9b","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":240,"context_line":"                return_value\u003dFalse)"},{"line_number":241,"context_line":"    def test_pci_fail(self, mock_pci_supports_requests):"},{"line_number":242,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":243,"context_line":"            data\u003d{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":244,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":245,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":246,"context_line":"        self.assertRaisesRegex("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_f2704475","line":243,"range":{"start_line":242,"start_character":0,"end_line":243,"end_character":55},"in_reply_to":"5f93b717_4d18801c","updated":"2018-01-25 23:01:30.000000000","message":"thanks rodolfo ill try converting all the create methods back to constructor calls and handel the alais there.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":240,"context_line":"                return_value\u003dFalse)"},{"line_number":241,"context_line":"    def test_pci_fail(self, mock_pci_supports_requests):"},{"line_number":242,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":243,"context_line":"            data\u003d{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":244,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":245,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":246,"context_line":"        self.assertRaisesRegex("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_64f00092","line":243,"range":{"start_line":242,"start_character":0,"end_line":243,"end_character":55},"in_reply_to":"5f93b717_5e9fd64f","updated":"2018-01-25 13:07:07.000000000","message":"actually objects.InstancePCIRequestSpec(vendor_id\u003d\u0027v\u0027, product_id\u003d\u0027p\u0027) might be legal now i did not check.\n\nin this particular case we are not setting dev_type so we dont need to worry about the alias. that said i was not sure why rodolfo added the create method but assumed the answer was you cant eaily do that. i can try it and see what it looks like.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4e8c87c2b9cacfecbbcefc6e5b56599de6e5121d","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":240,"context_line":"                return_value\u003dFalse)"},{"line_number":241,"context_line":"    def test_pci_fail(self, mock_pci_supports_requests):"},{"line_number":242,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":243,"context_line":"            data\u003d{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":244,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":245,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":246,"context_line":"        self.assertRaisesRegex("}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_4d18801c","line":243,"range":{"start_line":242,"start_character":0,"end_line":243,"end_character":55},"in_reply_to":"5f93b717_64f00092","updated":"2018-01-25 17:16:30.000000000","message":"I added this method because there were no relation between the data object passed as argument and the fields of InstancePCIRequestSpec.\n\nNow, because we are defining each specific parameter to be stored in the OVO, there is no need for that.\n\n__init__ can be overridden","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":230,"context_line":"                return_value\u003dTrue)"},{"line_number":231,"context_line":"    def test_pci_pass(self, mock_pci_supports_requests):"},{"line_number":232,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":233,"context_line":"            **{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":234,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":235,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":236,"context_line":"        self._claim(requests\u003drequests)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_bb33aaf6","line":233,"range":{"start_line":232,"start_character":15,"end_line":233,"end_character":52},"updated":"2018-03-17 19:33:38.000000000","message":"I get that we did this to minimize the delta, but would read better as\n\n objects.InstancePCIRequestSpec(vendor_id\u003d\u0027v\u0027, product_id\u003d\u0027p\u0027)","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    @mock.patch(\u0027nova.pci.stats.PciDeviceStats.support_requests\u0027,"},{"line_number":230,"context_line":"                return_value\u003dTrue)"},{"line_number":231,"context_line":"    def test_pci_pass(self, mock_pci_supports_requests):"},{"line_number":232,"context_line":"        spec \u003d objects.InstancePCIRequestSpec("},{"line_number":233,"context_line":"            **{\u0027vendor_id\u0027: \u0027v\u0027, \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":234,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":235,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":236,"context_line":"        self._claim(requests\u003drequests)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_91ce9581","line":233,"range":{"start_line":232,"start_character":15,"end_line":233,"end_character":52},"in_reply_to":"df7087c5_bb33aaf6","updated":"2018-03-20 13:06:45.000000000","message":"actully i did it this way because i used sed to make this change and did and did not want to do it by hand.\n\ni was kindof hopping no one would notice but i can manually change all of these if you prefer :)","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":1658,"context_line":"        pci_devs \u003d [pci_dev]"},{"line_number":1659,"context_line":"        self.rt.pci_tracker.pci_devs \u003d objects.PciDeviceList(objects\u003dpci_devs)"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u0027v\u0027,"},{"line_number":1662,"context_line":"                                                      \u0027product_id\u0027: \u0027p\u0027})"},{"line_number":1663,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":1664,"context_line":"        pci_requests \u003d objects.InstancePCIRequests("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_db30deeb","line":1661,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f535dca722d414c86fecf9b374fcf8f7325fd09","unresolved":false,"context_lines":[{"line_number":3138,"context_line":"        self.assertIsInstance(networks, objects.NetworkList)"},{"line_number":3139,"context_line":"        self.assertEqual(0, len(networks))"},{"line_number":3140,"context_line":""},{"line_number":3141,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.Mock())"},{"line_number":3142,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"},{"line_number":3143,"context_line":"        api \u003d neutronapi.API()"},{"line_number":3144,"context_line":"        self.mox.ResetAll()"},{"line_number":3145,"context_line":"        test_port \u003d {"},{"line_number":3146,"context_line":"            \u0027port\u0027: {\u0027id\u0027: \u0027my_port_id1\u0027,"},{"line_number":3147,"context_line":"                      \u0027network_id\u0027: \u0027net-id\u0027,"},{"line_number":3148,"context_line":"                      \u0027binding:vnic_type\u0027: model.VNIC_TYPE_DIRECT,"},{"line_number":3149,"context_line":"                     },"},{"line_number":3150,"context_line":"            }"},{"line_number":3151,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3152,"context_line":""},{"line_number":3153,"context_line":"        mock_client \u003d mock_get_client()"},{"line_number":3154,"context_line":"        mock_client.show_port.return_value \u003d test_port"},{"line_number":3155,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3156,"context_line":"        vnic_type, phynet_name \u003d api._get_port_vnic_info("},{"line_number":3157,"context_line":"            self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3158,"context_line":""},{"line_number":3159,"context_line":"        mock_client.show_port.assert_called_once_with(test_port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":3160,"context_line":"            fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027])"},{"line_number":3161,"context_line":"        mock_client.show_network.assert_called_once_with("},{"line_number":3162,"context_line":"            test_port[\u0027port\u0027][\u0027network_id\u0027],"},{"line_number":3163,"context_line":"            fields\u003d\u0027provider:physical_network\u0027)"},{"line_number":3164,"context_line":"        self.assertEqual(model.VNIC_TYPE_DIRECT, vnic_type)"},{"line_number":3165,"context_line":"        self.assertEqual(\u0027phynet1\u0027, phynet_name)"},{"line_number":3166,"context_line":""},{"line_number":3167,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3168,"context_line":"                                 binding_vnic_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_2c6fe7fc","side":"PARENT","line":3165,"range":{"start_line":3141,"start_character":0,"end_line":3165,"end_character":48},"updated":"2017-04-10 16:41:16.000000000","message":"What happened to this? I assume you just made better use of the below?","commit_id":"8909910b854ae194d722fbeb1939a987b3800306"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"40f2404dbb8656ecc2358d2edfac2bbd9a4c1b19","unresolved":false,"context_lines":[{"line_number":3138,"context_line":"        self.assertIsInstance(networks, objects.NetworkList)"},{"line_number":3139,"context_line":"        self.assertEqual(0, len(networks))"},{"line_number":3140,"context_line":""},{"line_number":3141,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.Mock())"},{"line_number":3142,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"},{"line_number":3143,"context_line":"        api \u003d neutronapi.API()"},{"line_number":3144,"context_line":"        self.mox.ResetAll()"},{"line_number":3145,"context_line":"        test_port \u003d {"},{"line_number":3146,"context_line":"            \u0027port\u0027: {\u0027id\u0027: \u0027my_port_id1\u0027,"},{"line_number":3147,"context_line":"                      \u0027network_id\u0027: \u0027net-id\u0027,"},{"line_number":3148,"context_line":"                      \u0027binding:vnic_type\u0027: model.VNIC_TYPE_DIRECT,"},{"line_number":3149,"context_line":"                     },"},{"line_number":3150,"context_line":"            }"},{"line_number":3151,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3152,"context_line":""},{"line_number":3153,"context_line":"        mock_client \u003d mock_get_client()"},{"line_number":3154,"context_line":"        mock_client.show_port.return_value \u003d test_port"},{"line_number":3155,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3156,"context_line":"        vnic_type, phynet_name \u003d api._get_port_vnic_info("},{"line_number":3157,"context_line":"            self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3158,"context_line":""},{"line_number":3159,"context_line":"        mock_client.show_port.assert_called_once_with(test_port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":3160,"context_line":"            fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027])"},{"line_number":3161,"context_line":"        mock_client.show_network.assert_called_once_with("},{"line_number":3162,"context_line":"            test_port[\u0027port\u0027][\u0027network_id\u0027],"},{"line_number":3163,"context_line":"            fields\u003d\u0027provider:physical_network\u0027)"},{"line_number":3164,"context_line":"        self.assertEqual(model.VNIC_TYPE_DIRECT, vnic_type)"},{"line_number":3165,"context_line":"        self.assertEqual(\u0027phynet1\u0027, phynet_name)"},{"line_number":3166,"context_line":""},{"line_number":3167,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3168,"context_line":"                                 binding_vnic_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_f36d5332","side":"PARENT","line":3165,"range":{"start_line":3141,"start_character":0,"end_line":3165,"end_character":48},"in_reply_to":"bff0334d_2c6fe7fc","updated":"2017-04-10 20:27:34.000000000","message":"Yes, I refactored the code and added new tests.\n\nAll vnic_info tests are using now \"_test_get_port_vnic_info\" function. Also I changed the function names to make more noticeable what we are testing.","commit_id":"8909910b854ae194d722fbeb1939a987b3800306"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"536f6cdb00282c5654165bfb55a3e91d29420695","unresolved":false,"context_lines":[{"line_number":3138,"context_line":"        self.assertIsInstance(networks, objects.NetworkList)"},{"line_number":3139,"context_line":"        self.assertEqual(0, len(networks))"},{"line_number":3140,"context_line":""},{"line_number":3141,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.Mock())"},{"line_number":3142,"context_line":"    def test_get_port_vnic_info_1(self, mock_get_client):"},{"line_number":3143,"context_line":"        api \u003d neutronapi.API()"},{"line_number":3144,"context_line":"        self.mox.ResetAll()"},{"line_number":3145,"context_line":"        test_port \u003d {"},{"line_number":3146,"context_line":"            \u0027port\u0027: {\u0027id\u0027: \u0027my_port_id1\u0027,"},{"line_number":3147,"context_line":"                      \u0027network_id\u0027: \u0027net-id\u0027,"},{"line_number":3148,"context_line":"                      \u0027binding:vnic_type\u0027: model.VNIC_TYPE_DIRECT,"},{"line_number":3149,"context_line":"                     },"},{"line_number":3150,"context_line":"            }"},{"line_number":3151,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3152,"context_line":""},{"line_number":3153,"context_line":"        mock_client \u003d mock_get_client()"},{"line_number":3154,"context_line":"        mock_client.show_port.return_value \u003d test_port"},{"line_number":3155,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3156,"context_line":"        vnic_type, phynet_name \u003d api._get_port_vnic_info("},{"line_number":3157,"context_line":"            self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3158,"context_line":""},{"line_number":3159,"context_line":"        mock_client.show_port.assert_called_once_with(test_port[\u0027port\u0027][\u0027id\u0027],"},{"line_number":3160,"context_line":"            fields\u003d[\u0027binding:vnic_type\u0027, \u0027network_id\u0027])"},{"line_number":3161,"context_line":"        mock_client.show_network.assert_called_once_with("},{"line_number":3162,"context_line":"            test_port[\u0027port\u0027][\u0027network_id\u0027],"},{"line_number":3163,"context_line":"            fields\u003d\u0027provider:physical_network\u0027)"},{"line_number":3164,"context_line":"        self.assertEqual(model.VNIC_TYPE_DIRECT, vnic_type)"},{"line_number":3165,"context_line":"        self.assertEqual(\u0027phynet1\u0027, phynet_name)"},{"line_number":3166,"context_line":""},{"line_number":3167,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3168,"context_line":"                                 binding_vnic_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_f99be26f","side":"PARENT","line":3165,"range":{"start_line":3141,"start_character":0,"end_line":3165,"end_character":48},"in_reply_to":"bff0334d_f36d5332","updated":"2017-04-11 10:42:55.000000000","message":"Sounds good","commit_id":"8909910b854ae194d722fbeb1939a987b3800306"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b8ef3efbeba0bfa9f2e0c4c0a60b38c39f2c6f4","unresolved":false,"context_lines":[{"line_number":3231,"context_line":"                          api._get_port_vnic_info,"},{"line_number":3232,"context_line":"                          self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3233,"context_line":""},{"line_number":3234,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3235,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3236,"context_line":"                                 binding_vnic_type\u003dNone):"},{"line_number":3237,"context_line":"        api \u003d neutronapi.API()"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f044301_5b1c9869","line":3234,"updated":"2017-05-04 21:46:10.000000000","message":"I think either remove this @mock.patch...","commit_id":"cb0529970ba95e748528c1bafd5224a109f9dd29"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b8ef3efbeba0bfa9f2e0c4c0a60b38c39f2c6f4","unresolved":false,"context_lines":[{"line_number":3234,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3235,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3236,"context_line":"                                 binding_vnic_type\u003dNone):"},{"line_number":3237,"context_line":"        api \u003d neutronapi.API()"},{"line_number":3238,"context_line":"        self.mox.ResetAll()"},{"line_number":3239,"context_line":"        binding_profile_value \u003d {\u0027capabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027]}"},{"line_number":3240,"context_line":"        test_port \u003d {\u0027port\u0027: {\u0027id\u0027: \u0027my_port_id2\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f044301_fb2c849a","line":3237,"updated":"2017-05-04 21:46:10.000000000","message":"...or slide it in here as a \u0027with\u0027...","commit_id":"cb0529970ba95e748528c1bafd5224a109f9dd29"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad7b539178710c3999fef664a90a5356909eab6f","unresolved":false,"context_lines":[{"line_number":3234,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.MagicMock())"},{"line_number":3235,"context_line":"    def _test_get_port_vnic_info(self, mock_get_client,"},{"line_number":3236,"context_line":"                                 binding_vnic_type\u003dNone):"},{"line_number":3237,"context_line":"        api \u003d neutronapi.API()"},{"line_number":3238,"context_line":"        self.mox.ResetAll()"},{"line_number":3239,"context_line":"        binding_profile_value \u003d {\u0027capabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027]}"},{"line_number":3240,"context_line":"        test_port \u003d {\u0027port\u0027: {\u0027id\u0027: \u0027my_port_id2\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f044301_e10dee3e","line":3237,"in_reply_to":"3f044301_fb2c849a","updated":"2017-05-05 07:51:24.000000000","message":"I had a problem rebasing two consecutive patches. Those mocks shouldn\u0027t be here.\n\nI\u0027ll change these functions.","commit_id":"cb0529970ba95e748528c1bafd5224a109f9dd29"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b8ef3efbeba0bfa9f2e0c4c0a60b38c39f2c6f4","unresolved":false,"context_lines":[{"line_number":3264,"context_line":"            self.assertFalse(phynet_name)"},{"line_number":3265,"context_line":"        self.assertEqual(binding_profile_value, binding_profile)"},{"line_number":3266,"context_line":""},{"line_number":3267,"context_line":"    @mock.patch.object(neutronapi, \u0027get_client\u0027, return_value\u003dmock.Mock())"},{"line_number":3268,"context_line":"    def test_get_port_vnic_info_vnic_direct(self, mock_get_client):"},{"line_number":3269,"context_line":"        self._test_get_port_vnic_info("},{"line_number":3270,"context_line":"            mock_get_client, binding_vnic_type\u003dmodel.VNIC_TYPE_DIRECT)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f044301_9b122058","line":3267,"updated":"2017-05-04 21:46:10.000000000","message":"...and/or remove this @mock.patch from all of these.","commit_id":"cb0529970ba95e748528c1bafd5224a109f9dd29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2c43e69f92e05ba79b5915da03697ab5c6f2b72d","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_9d867cdb","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"updated":"2017-05-19 10:20:02.000000000","message":"Why was it necessary to move this from a decorator to a context manager?","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0423ed296e46bade755b104174d3fe74fa7b1c43","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_aa389fed","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"in_reply_to":"ff0f0b1f_4cb9262c","updated":"2017-05-22 11:21:19.000000000","message":"Gotcha - I missed that. It\u0027s a nit, but would this be easier to read were it used as a decorator?","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3df87754d8f01a850bdf837cf41f8771aae585ae","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_4cb9262c","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"in_reply_to":"ff0f0b1f_9d867cdb","updated":"2017-05-22 08:07:13.000000000","message":"This is not function in Base L3233, it\u0027s Base L3259.\n\nBecause I refactored this code section (related to vnic_info testing), I decided to use this mocking. But please, don\u0027t get confused by the diff presentation: Base \"test_get_port_vnic_info_1\" is not PS24 \"_test_get_port_vnic_info\"","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"53ec739de8acad1b76b9bfbb0a6702004a130b33","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_cda1adfa","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"in_reply_to":"ff0f0b1f_aa389fed","updated":"2017-05-22 11:27:54.000000000","message":"I\u0027ll try it. Let me submit a new patch.","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"158e6e6ce5d1c2b7568b47715c266f1d4ff534cb","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_10457c43","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"in_reply_to":"ff0f0b1f_ade439e1","updated":"2017-05-22 11:59:02.000000000","message":"Sure you can :) You place the mock parameters after the args but before the kwargs. You might also need to change calls to \u0027_test_get_port_vnic_info\u0027 to use kwargs though.\n\n*However*, that was a nit and you\u0027ve spent enough time on it. This\u0027ll do as-is too","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b168884eadceb789fa9c154ad061a5107434c5cb","unresolved":false,"context_lines":[{"line_number":3244,"context_line":"                     }"},{"line_number":3245,"context_line":"        test_net \u003d {\u0027network\u0027: {\u0027provider:physical_network\u0027: \u0027phynet1\u0027}}"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        with mock.patch.object(neutronapi, \u0027get_client\u0027,"},{"line_number":3248,"context_line":"                               return_value\u003dmock.MagicMock()) as \\"},{"line_number":3249,"context_line":"                mock_get_client:"},{"line_number":3250,"context_line":"            mock_client \u003d mock_get_client()"},{"line_number":3251,"context_line":"            mock_client.show_port.return_value \u003d test_port"},{"line_number":3252,"context_line":"            mock_client.show_network.return_value \u003d test_net"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff0f0b1f_ade439e1","line":3249,"range":{"start_line":3247,"start_character":0,"end_line":3249,"end_character":32},"in_reply_to":"ff0f0b1f_cda1adfa","updated":"2017-05-22 11:41:33.000000000","message":"Ok, now I remember. In \"_test_get_port_vnic_info\" I\u0027m using a default parameter (binding_vnic_type). Because mock parameters must be added at the end of the function definition and those are not default, I can\u0027t use the decorator.","commit_id":"1a3bf9052e1a4a51f2674fbf48791249544a843b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":3282,"context_line":"            ])"},{"line_number":3283,"context_line":"        pci_requests \u003d objects.InstancePCIRequests(requests\u003d[])"},{"line_number":3284,"context_line":"        bprofile1 \u003d {\u0027capabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap5\u0027]}"},{"line_number":3285,"context_line":"        bprofile2 \u003d {\u0027kapabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap5\u0027]}"},{"line_number":3286,"context_line":"        mock_get_port_vnic_info.side_effect \u003d ["},{"line_number":3287,"context_line":"                (model.VNIC_TYPE_DIRECT, \u0027phynet1\u0027, {}),"},{"line_number":3288,"context_line":"                (model.VNIC_TYPE_NORMAL, \u0027\u0027, {}),"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_ede85817","line":3285,"range":{"start_line":3285,"start_character":22,"end_line":3285,"end_character":23},"updated":"2017-06-29 17:31:02.000000000","message":"took me a while to figure out that this \"k\" vs. \"c\" was what caused the assertion on line 3307 to pass. Would be useful to add a code comment about here to make it more obvious.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":3282,"context_line":"            ])"},{"line_number":3283,"context_line":"        pci_requests \u003d objects.InstancePCIRequests(requests\u003d[])"},{"line_number":3284,"context_line":"        bprofile1 \u003d {\u0027capabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap5\u0027]}"},{"line_number":3285,"context_line":"        bprofile2 \u003d {\u0027kapabilities\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap5\u0027]}"},{"line_number":3286,"context_line":"        mock_get_port_vnic_info.side_effect \u003d ["},{"line_number":3287,"context_line":"                (model.VNIC_TYPE_DIRECT, \u0027phynet1\u0027, {}),"},{"line_number":3288,"context_line":"                (model.VNIC_TYPE_NORMAL, \u0027\u0027, {}),"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_944f8bbc","line":3285,"range":{"start_line":3285,"start_character":22,"end_line":3285,"end_character":23},"in_reply_to":"3f1d235d_ede85817","updated":"2017-06-30 14:39:49.000000000","message":"Yes, I\u0027ll do this.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":3295,"context_line":"        self.assertEqual(4, len(pci_requests.requests))"},{"line_number":3296,"context_line":"        has_pci_request_id \u003d [net.pci_request_id is not None for net in"},{"line_number":3297,"context_line":"                              requested_networks.objects]"},{"line_number":3298,"context_line":"        self.assertEqual(pci_requests.requests[3].spec[0][\u0027dev_type\u0027],"},{"line_number":3299,"context_line":"                         \"type-PF\")"},{"line_number":3300,"context_line":"        expected_results \u003d [True, False, False, True, True, True]"},{"line_number":3301,"context_line":"        self.assertEqual(expected_results, has_pci_request_id)"},{"line_number":3302,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_7ee652eb","line":3299,"range":{"start_line":3298,"start_character":57,"end_line":3299,"end_character":35},"updated":"2018-01-25 11:22:22.000000000","message":"If you\u0027re going to fix it, at least fix both of them :) I assume this shouldn\u0027t be here though","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":3295,"context_line":"        self.assertEqual(4, len(pci_requests.requests))"},{"line_number":3296,"context_line":"        has_pci_request_id \u003d [net.pci_request_id is not None for net in"},{"line_number":3297,"context_line":"                              requested_networks.objects]"},{"line_number":3298,"context_line":"        self.assertEqual(pci_requests.requests[3].spec[0][\u0027dev_type\u0027],"},{"line_number":3299,"context_line":"                         \"type-PF\")"},{"line_number":3300,"context_line":"        expected_results \u003d [True, False, False, True, True, True]"},{"line_number":3301,"context_line":"        self.assertEqual(expected_results, has_pci_request_id)"},{"line_number":3302,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_e4d5f0ba","line":3299,"range":{"start_line":3298,"start_character":57,"end_line":3299,"end_character":35},"in_reply_to":"5f93b717_7ee652eb","updated":"2018-01-25 13:07:07.000000000","message":"hehe see this is why i dont like spliting things on 2 lines just for the sake of 80 columns.\n\nthat said yes this can be reverted. i first tried doing the alias the other way around e.g. dev_type -\u003e device_type but that caused issue when retriving it from the database.\nwhen i swaped the order i gues i just typed it differently.\n\ni know you hate it when constant strings are in \"\"","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"}],"nova/tests/unit/objects/test_fields.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9dc24218411ab36e3d0fa9529aba820e7cad003","unresolved":false,"context_lines":[{"line_number":721,"context_line":"            [1.1, 2.4, -23.5],"},{"line_number":722,"context_line":"            [\"string\", time],"},{"line_number":723,"context_line":"            [[\u0027v1\u0027, \u0027v2\u0027], [\u0027v3\u0027]],"},{"line_number":724,"context_line":"            [{1, 2, 3}, {4, 5}]"},{"line_number":725,"context_line":"        ]"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"    def test_coerce(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_0de39435","line":724,"updated":"2017-06-29 17:31:02.000000000","message":"please use the set() constructor instead of dict-like {1, 2, 3} constructor.\n\nalso, it would be good to have a test specifically for the ListOfDictsOfNullableStringsOrListOfDictField type that you\u0027ve added in this patch.\n\nFinally, it would be useful to have all these fields changes in a separate patch...","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"55c306adb89c054ccd4becb86196ea30418232fd","unresolved":false,"context_lines":[{"line_number":721,"context_line":"            [1.1, 2.4, -23.5],"},{"line_number":722,"context_line":"            [\"string\", time],"},{"line_number":723,"context_line":"            [[\u0027v1\u0027, \u0027v2\u0027], [\u0027v3\u0027]],"},{"line_number":724,"context_line":"            [{1, 2, 3}, {4, 5}]"},{"line_number":725,"context_line":"        ]"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"    def test_coerce(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f1d235d_47ff0701","line":724,"in_reply_to":"3f1d235d_0de39435","updated":"2017-06-30 14:39:49.000000000","message":"I\u0027m going to remove this new field type.","commit_id":"d6849d883e12228e3f8b5a41d4e628ce0ec126cd"}],"nova/tests/unit/objects/test_instance.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        inst \u003d objects.Instance._from_db_object(self.context, inst,"},{"line_number":522,"context_line":"                self.fake_instance)"},{"line_number":523,"context_line":"        inst.obj_reset_changes()"},{"line_number":524,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**"},{"line_number":525,"context_line":"            {\u0027vendor_id\u0027: \u00278086\u0027, \u0027product_id\u0027: \u00271502\u0027})"},{"line_number":526,"context_line":"        pci_req_obj \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":527,"context_line":"        inst.pci_requests \u003d ("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_7b4bd25e","line":524,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/objects/test_instance_pci_requests.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"99de9016ba60af881b0daecbd0623c937e845c41","unresolved":false,"context_lines":[{"line_number":23,"context_line":"FAKE_UUID \u003d \u002779a53d6b-0893-4838-a971-15f4f382e7c2\u0027"},{"line_number":24,"context_line":"FAKE_REQUEST_UUID \u003d \u002769b53d6b-0793-4839-c981-f5c4f382e7d2\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# NOTE(danms): Yes, these are the same right now, but going forward,"},{"line_number":27,"context_line":"# we have changes to make which will be reflected in the format"},{"line_number":28,"context_line":"# in instance_extra, but not in system_metadata."},{"line_number":29,"context_line":"spec_1 \u003d {\u0027vendor_id\u0027: \u00278086\u0027,"},{"line_number":30,"context_line":"          \u0027device_id\u0027: \u00271502\u0027}"},{"line_number":31,"context_line":"spec_2 \u003d {\u0027vendor_id\u0027: \u00276502\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_a12df4fe","line":28,"range":{"start_line":26,"start_character":0,"end_line":28,"end_character":48},"updated":"2017-07-19 16:54:56.000000000","message":"This applied to the item below but it no longer does. You should remove it","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"67efe27a70a28ba46023cc5478dc23b6fc9e23a1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"FAKE_UUID \u003d \u002779a53d6b-0893-4838-a971-15f4f382e7c2\u0027"},{"line_number":24,"context_line":"FAKE_REQUEST_UUID \u003d \u002769b53d6b-0793-4839-c981-f5c4f382e7d2\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# NOTE(danms): Yes, these are the same right now, but going forward,"},{"line_number":27,"context_line":"# we have changes to make which will be reflected in the format"},{"line_number":28,"context_line":"# in instance_extra, but not in system_metadata."},{"line_number":29,"context_line":"spec_1 \u003d {\u0027vendor_id\u0027: \u00278086\u0027,"},{"line_number":30,"context_line":"          \u0027device_id\u0027: \u00271502\u0027}"},{"line_number":31,"context_line":"spec_2 \u003d {\u0027vendor_id\u0027: \u00276502\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"1f1a1f67_44b3cee9","line":28,"range":{"start_line":26,"start_character":0,"end_line":28,"end_character":48},"in_reply_to":"1f1a1f67_a12df4fe","updated":"2017-07-19 17:20:29.000000000","message":"Yes.... I always miss this kind of things.","commit_id":"6aace6a1ef0e2616c21b548e3d6b2419ae9242b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        requests \u003d primitive[\u0027nova_object.data\u0027][\u0027requests\u0027]"},{"line_number":166,"context_line":"        self.assertEqual(\u00271.2\u0027, primitive[\u0027nova_object.version\u0027])"},{"line_number":167,"context_line":"        self.assertEqual(1, len(requests))"},{"line_number":168,"context_line":"        spec \u003d requests[0][\u0027nova_object.data\u0027][\u0027spec\u0027]"},{"line_number":169,"context_line":"        self.assertEqual(1, len(spec))"},{"line_number":170,"context_line":"        self.assertEqual(spec_data[\u0027vendor_id\u0027], spec[0][\u0027vendor_id\u0027])"},{"line_number":171,"context_line":"        self.assertEqual(spec_data[\u0027product_id\u0027], spec[0][\u0027product_id\u0027])"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_fef2629a","line":168,"range":{"start_line":168,"start_character":0,"end_line":168,"end_character":54},"updated":"2018-01-25 11:22:22.000000000","message":"nit: A newline before this line would help readability","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def test__getitem_parameter_not_found(self):"},{"line_number":86,"context_line":"        obj \u003d objects.InstancePCIRequestSpec(**data)"},{"line_number":87,"context_line":"        self.assertRaises(KeyError, obj.__getitem__, \u0027wrong_key\u0027)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class _TestInstancePCIRequests(object):"},{"line_number":91,"context_line":"    @mock.patch(\u0027nova.db.instance_extra_get_by_instance_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_5b5a8e2a","line":88,"updated":"2018-03-17 19:33:38.000000000","message":"Tests for the aliased keys device_type\u003d\u003edev_type and device_id\u003d\u003eproduct_id?","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def test__getitem_parameter_not_found(self):"},{"line_number":86,"context_line":"        obj \u003d objects.InstancePCIRequestSpec(**data)"},{"line_number":87,"context_line":"        self.assertRaises(KeyError, obj.__getitem__, \u0027wrong_key\u0027)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class _TestInstancePCIRequests(object):"},{"line_number":91,"context_line":"    @mock.patch(\u0027nova.db.instance_extra_get_by_instance_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_f187d10e","line":88,"in_reply_to":"df7087c5_5b5a8e2a","updated":"2018-03-20 13:06:45.000000000","message":"i guess i could add them but the previous test that used the previous test that used device_id were using incorrect data as there was no code path where device_id was use as it was converted in the api","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.assertEqual(\u0027alias_1\u0027, req.requests[0].alias_name)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def test_from_request_spec_instance_props(self):"},{"line_number":163,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**"},{"line_number":164,"context_line":"            {\u0027vendor_id\u0027: \u00278086\u0027, \u0027product_id\u0027: \u00271502\u0027,"},{"line_number":165,"context_line":"             \u0027capabilities_network\u0027: [\u0027rx\u0027, \u0027tso\u0027, \u0027rxvlan\u0027]})"},{"line_number":166,"context_line":"        requests \u003d objects.InstancePCIRequests("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_3b555afb","line":163,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/pci/test_manager.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                     parent_addr\u003d\u00270000:00:01.1\u0027)"},{"line_number":103,"context_line":"fake_db_devs_tree \u003d [fake_db_dev_3, fake_db_dev_4, fake_db_dev_5]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"spec_1 \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u0027v\u0027})"},{"line_number":106,"context_line":"spec_2 \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u0027v1\u0027})"},{"line_number":107,"context_line":"fake_pci_requests \u003d ["},{"line_number":108,"context_line":"    {\u0027count\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_db453e45","line":105,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/pci/test_request.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def test_alias_2_request(self):"},{"line_number":209,"context_line":"        self.flags(alias\u003d[_fake_alias1, _fake_alias3], group\u003d\u0027pci\u0027)"},{"line_number":210,"context_line":"        spec_1 \u003d objects.InstancePCIRequestSpec(**"},{"line_number":211,"context_line":"            {\u0027vendor_id\u0027: \u00278086\u0027, \u0027product_id\u0027: \u00274443\u0027, \u0027dev_type\u0027: \u0027type-PCI\u0027,"},{"line_number":212,"context_line":"             \u0027capability_type\u0027: \u0027pci\u0027})"},{"line_number":213,"context_line":"        spec_2 \u003d objects.InstancePCIRequestSpec(**"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_7b74329d","line":210,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/pci/test_stats.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        pci_requests \u003d self._get_fake_requests(vendor_ids\u003d[vendor_id],"},{"line_number":265,"context_line":"            numa_policy\u003dpolicy, count\u003dcount)"},{"line_number":266,"context_line":"        devs \u003d self.pci_stats.consume_requests(pci_requests, cells)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        if expected is None:"},{"line_number":269,"context_line":"            self.assertIsNone(devs)"},{"line_number":270,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_3e244ac6","side":"PARENT","line":267,"updated":"2018-01-25 11:22:22.000000000","message":"unrelated change","commit_id":"87ea686f9f2cc706205d188922bb14272625e7be"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            vendor_ids \u003d [\u0027v1\u0027, \u0027v2\u0027]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        specs \u003d [objects.InstancePCIRequestSpec.create("},{"line_number":77,"context_line":"            {\u0027vendor_id\u0027: str(vendor_id)}) for vendor_id in vendor_ids]"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        return [objects.InstancePCIRequest(count\u003dcount, spec\u003d[spec],"},{"line_number":80,"context_line":"                numa_policy\u003dnuma_policy) for spec in specs]"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_3e5f6a42","line":77,"range":{"start_line":77,"start_character":26,"end_line":77,"end_character":29},"updated":"2018-01-25 11:22:22.000000000","message":"Can this be unicode? If so, we should probably be using \u0027six.string_type\u0027 (or whatever it is) for safety","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            vendor_ids \u003d [\u0027v1\u0027, \u0027v2\u0027]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        specs \u003d [objects.InstancePCIRequestSpec.create("},{"line_number":77,"context_line":"            {\u0027vendor_id\u0027: str(vendor_id)}) for vendor_id in vendor_ids]"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        return [objects.InstancePCIRequest(count\u003dcount, spec\u003d[spec],"},{"line_number":80,"context_line":"                numa_policy\u003dnuma_policy) for spec in specs]"}],"source_content_type":"text/x-python","patch_set":57,"id":"5f93b717_e4bc106b","line":77,"range":{"start_line":77,"start_character":26,"end_line":77,"end_character":29},"in_reply_to":"5f93b717_3e5f6a42","updated":"2018-01-25 13:07:07.000000000","message":"no vendorid is hex\n\nthe pcie spec does not understand unicode.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                  address\u003d\u00270000:00:00.3\u0027,"},{"line_number":53,"context_line":"                  numa_node\u003d None)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"spec_1 \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u0027v1\u0027})"},{"line_number":56,"context_line":"spec_2 \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u0027v2\u0027})"},{"line_number":57,"context_line":"pci_requests \u003d [objects.InstancePCIRequest(count\u003d1,"},{"line_number":58,"context_line":"                                           spec\u003d[spec_1]),"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_9b790695","line":55,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/pci/test_utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(PciDeviceMatchTestCase, self).setUp()"},{"line_number":33,"context_line":"        self.fake_pci_1 \u003d {\u0027vendor_id\u0027: \u0027v1\u0027,"},{"line_number":34,"context_line":"                           \u0027product_id\u0027: \u0027d1\u0027,"},{"line_number":35,"context_line":"                           \u0027capabilities_network\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap3\u0027]}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_single_spec_match(self):"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_bb616ad6","line":34,"range":{"start_line":34,"start_character":28,"end_line":34,"end_character":38},"updated":"2018-03-17 19:33:38.000000000","message":"It should still work if you don\u0027t change this, right?  Because of the aliasing?","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf29bcaff816ea63ed07255365c6cc8b503e4daf","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(PciDeviceMatchTestCase, self).setUp()"},{"line_number":33,"context_line":"        self.fake_pci_1 \u003d {\u0027vendor_id\u0027: \u0027v1\u0027,"},{"line_number":34,"context_line":"                           \u0027product_id\u0027: \u0027d1\u0027,"},{"line_number":35,"context_line":"                           \u0027capabilities_network\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap3\u0027]}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_single_spec_match(self):"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_3199c91e","line":34,"range":{"start_line":34,"start_character":28,"end_line":34,"end_character":38},"in_reply_to":"df7087c5_bb616ad6","updated":"2018-03-20 13:06:45.000000000","message":"yes it should but these test were always using invalid data.\nin the real code device_id was never used as it was alised in the pci/request.py\n\nso device_type -\u003e dev_type was alised here\nhttps://github.com/openstack/nova/blob/master/nova/pci/request.py#L121-L123\n\nand device_id has never been vailid.\n\nthe alias i introduce device_id to product_id was so the test could run unmodified but then i decided that using invalid data in the test was dumb and updated them too.\n\nany tests using device_id  should never have worked\nbut because we were mocking too much they did.","commit_id":"c33b34da9949230b208058565e831de24acc0106"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                           \u0027capabilities_network\u0027: [\u0027cap1\u0027, \u0027cap2\u0027, \u0027cap3\u0027]}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_single_spec_match(self):"},{"line_number":38,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**"},{"line_number":39,"context_line":"            {\u0027vendor_id\u0027: \u0027v1\u0027, \u0027product_id\u0027: \u0027d1\u0027})"},{"line_number":40,"context_line":"        self.assertTrue(utils.pci_device_prop_match("},{"line_number":41,"context_line":"            self.fake_pci_1, [spec]))"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_3b6ebac9","line":38,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/scheduler/filters/test_pci_passthrough_filters.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def test_pci_passthrough_pass(self):"},{"line_number":29,"context_line":"        pci_stats_mock \u003d mock.MagicMock()"},{"line_number":30,"context_line":"        pci_stats_mock.support_requests.return_value \u003d True"},{"line_number":31,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u00278086\u0027})"},{"line_number":32,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":33,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":34,"context_line":"        spec_obj \u003d objects.RequestSpec(pci_requests\u003drequests)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_db5e9e11","line":31,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/scheduler/test_host_manager.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf153195e9c1d6bffae943d2a0b09a6b629be4b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5f93b717_9974989b","updated":"2018-01-25 11:22:22.000000000","message":"I\u0027m still looking into this, but isn\u0027t there a path where we pass dictionaries instead of RequestSpec objects? If so, how does the change to InstancePCIRequestSpec object affect this (by way of the intermediate InstancePCIRequests object)","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be4fd3897d66f2f70cfc0656b930975a514c4d30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"5f93b717_e43f30d4","in_reply_to":"5f93b717_9974989b","updated":"2018-01-25 13:07:07.000000000","message":"i dont think there is.\nif there is such a path it should be replaced.\ncurrently when retriving them form the db we do the conversion but when creating new specs we shoudl also be using object form. if you find one let me know.","commit_id":"470c556eb90304d54045eb6f53f7cd8a0deeeed5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"                                                      cpuset\u003dset([0]),"},{"line_number":1292,"context_line":"                                                      memory\u003d512, id\u003d0)])"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u00278086\u0027})"},{"line_number":1295,"context_line":"        fake_requests \u003d [{\u0027request_id\u0027: uuids.request_id, \u0027count\u0027: 1,"},{"line_number":1296,"context_line":"                          \u0027spec\u0027: [spec]}]"},{"line_number":1297,"context_line":"        fake_requests_obj \u003d objects.InstancePCIRequests("}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_7b9992ce","line":1294,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/scheduler/weights/test_weights_pci.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        hostinfo_list \u003d self._get_all_hosts(hosts)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # we request PCI devices"},{"line_number":114,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u00278086\u0027})"},{"line_number":115,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d4, spec\u003d[spec])"},{"line_number":116,"context_line":"        requests \u003d objects.InstancePCIRequests(requests\u003d[request])"},{"line_number":117,"context_line":"        spec_obj \u003d objects.RequestSpec(pci_requests\u003drequests)"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_9b9ee6b6","line":114,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/virt/hyperv/test_vmops.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":646,"context_line":"    def test_create_instance_pci_requested(self):"},{"line_number":647,"context_line":"        vendor_id \u003d \u0027fake_vendor_id\u0027"},{"line_number":648,"context_line":"        product_id \u003d \u0027fake_product_id\u0027"},{"line_number":649,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**"},{"line_number":650,"context_line":"            {\u0027vendor_id\u0027: vendor_id, \u0027product_id\u0027: product_id})"},{"line_number":651,"context_line":"        request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":652,"context_line":"        self._test_create_instance(enable_instance_metrics\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_3ba31a03","line":649,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2925e46c6b4abc343904483fbbda7c8199bb92cf","unresolved":false,"context_lines":[{"line_number":1733,"context_line":"        self.assertEqual(2, fitted_instance2.cells[0].id)"},{"line_number":1734,"context_line":""},{"line_number":1735,"context_line":"    def test_get_fitting_pci_success(self):"},{"line_number":1736,"context_line":"        spec \u003d objects.InstancePCIRequestSpec(**{\u0027vendor_id\u0027: \u00278086\u0027})"},{"line_number":1737,"context_line":"        pci_request \u003d objects.InstancePCIRequest(count\u003d1, spec\u003d[spec])"},{"line_number":1738,"context_line":"        pci_reqs \u003d [pci_request]"},{"line_number":1739,"context_line":"        pci_stats \u003d stats.PciDeviceStats()"}],"source_content_type":"text/x-python","patch_set":59,"id":"df7087c5_5ba84eda","line":1736,"updated":"2018-03-17 19:33:38.000000000","message":"ditto","commit_id":"c33b34da9949230b208058565e831de24acc0106"}]}
