)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Reads the NIC feature information from the \u0027net\u0027 devices"},{"line_number":10,"context_line":"given by \u0027libvirt\u0027. This information is added to"},{"line_number":11,"context_line":"pci_devices.extra_info dictionary under a dictionary"},{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_ce42b23e","line":12,"range":{"start_line":12,"start_character":9,"end_line":12,"end_character":20},"updated":"2017-04-10 16:15:04.000000000","message":"capabilities","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Reads the NIC feature information from the \u0027net\u0027 devices"},{"line_number":10,"context_line":"given by \u0027libvirt\u0027. This information is added to"},{"line_number":11,"context_line":"pci_devices.extra_info dictionary under a dictionary"},{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_93ee11eb","line":12,"range":{"start_line":12,"start_character":28,"end_line":12,"end_character":38},"updated":"2017-04-10 16:15:04.000000000","message":"dictionary","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Reads the NIC feature information from the \u0027net\u0027 devices"},{"line_number":10,"context_line":"given by \u0027libvirt\u0027. This information is added to"},{"line_number":11,"context_line":"pci_devices.extra_info dictionary under a dictionary"},{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_cfc2ad34","line":12,"range":{"start_line":12,"start_character":28,"end_line":12,"end_character":38},"in_reply_to":"bff0334d_93ee11eb","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Reads the NIC feature information from the \u0027net\u0027 devices"},{"line_number":10,"context_line":"given by \u0027libvirt\u0027. This information is added to"},{"line_number":11,"context_line":"pci_devices.extra_info dictionary under a dictionary"},{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_afbf69a8","line":12,"range":{"start_line":12,"start_character":9,"end_line":12,"end_character":20},"in_reply_to":"bff0334d_ce42b23e","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"},{"line_number":16,"context_line":"                {\u0027network\u0027: [\u0027gso\u0027, \u0027sg\u0027, \u0027tso\u0027, \u0027tx\u0027]}"},{"line_number":17,"context_line":"              }"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\u0027libvirt\u0027 implemented the NIC feature discovery on version"},{"line_number":20,"context_line":"1.2.14 (https://libvirt.org/news-2015.html)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_2ed91e7e","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":15},"updated":"2017-04-10 16:15:04.000000000","message":"Could you add a before (i.e. before vs. after) for this too?","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"labeled \u0027capabilites\u0027; this dictionaty will contain a key"},{"line_number":13,"context_line":"labeled \u0027network\u0027 with the list of capabilities. E.g.:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"  extra_info: {\u0027capabilities\u0027:"},{"line_number":16,"context_line":"                {\u0027network\u0027: [\u0027gso\u0027, \u0027sg\u0027, \u0027tso\u0027, \u0027tx\u0027]}"},{"line_number":17,"context_line":"              }"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\u0027libvirt\u0027 implemented the NIC feature discovery on version"},{"line_number":20,"context_line":"1.2.14 (https://libvirt.org/news-2015.html)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_efc9f158","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":15},"in_reply_to":"bff0334d_2ed91e7e","updated":"2017-04-10 19:15:49.000000000","message":"Actually extra_info is not used now.","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"                {\u0027network\u0027: [\u0027gso\u0027, \u0027sg\u0027, \u0027tso\u0027, \u0027tx\u0027]}"},{"line_number":17,"context_line":"              }"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\u0027libvirt\u0027 implemented the NIC feature discovery on version"},{"line_number":20,"context_line":"1.2.14 (https://libvirt.org/news-2015.html)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"blueprint enable-sriov-nic-features"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_73eb8ddb","line":19,"range":{"start_line":19,"start_character":48,"end_line":19,"end_character":50},"updated":"2017-04-10 16:15:04.000000000","message":"in","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"                {\u0027network\u0027: [\u0027gso\u0027, \u0027sg\u0027, \u0027tso\u0027, \u0027tx\u0027]}"},{"line_number":17,"context_line":"              }"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"\u0027libvirt\u0027 implemented the NIC feature discovery on version"},{"line_number":20,"context_line":"1.2.14 (https://libvirt.org/news-2015.html)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"blueprint enable-sriov-nic-features"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bff0334d_efd8d1ef","line":19,"range":{"start_line":19,"start_character":48,"end_line":19,"end_character":50},"in_reply_to":"bff0334d_73eb8ddb","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"}],"nova/objects/pci_device.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34d4ceed8ee30df9890bc2e278642510b027ec85","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    # Version 1.3: Added field to represent PCI device NUMA node"},{"line_number":93,"context_line":"    # Version 1.4: Added parent_addr field"},{"line_number":94,"context_line":"    # Version 1.5: Added 2 new device statuses: UNCLAIMABLE and UNAVAILABLE"},{"line_number":95,"context_line":"    VERSION \u003d \u00271.5\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    fields \u003d {"},{"line_number":98,"context_line":"        \u0027id\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_628cdd35","line":95,"updated":"2017-04-10 14:59:09.000000000","message":"Its non-obvious this doesn\u0027t need a version bump, but I believe this is actually correct, because its on the code side of the RPC divide, and the resultant object is backwards compatible.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f94a5b67720840270e624b1a0d4aaabcd833a17","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    # Version 1.3: Added field to represent PCI device NUMA node"},{"line_number":93,"context_line":"    # Version 1.4: Added parent_addr field"},{"line_number":94,"context_line":"    # Version 1.5: Added 2 new device statuses: UNCLAIMABLE and UNAVAILABLE"},{"line_number":95,"context_line":"    VERSION \u003d \u00271.5\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    fields \u003d {"},{"line_number":98,"context_line":"        \u0027id\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_73d5cde4","line":95,"in_reply_to":"bff0334d_628cdd35","updated":"2017-04-10 16:24:17.000000000","message":"I didn\u0027t bump the version because I didn\u0027t change the object. Instead of this, I added the logic of converting to a string all possible \"extra_info\" parameters, mantaining the compatibility.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34d4ceed8ee30df9890bc2e278642510b027ec85","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":158,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":159,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":160,"context_line":"                extra_info.update({k: jsonutils.dumps(v)})"},{"line_number":161,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_9d33c2f6","line":160,"updated":"2017-04-10 14:59:09.000000000","message":"I am not keen on this kind of hidden logic.\n\nSeems nicer for the writer to explicitly convert to a string?\n\nThe reader would probably see the code writing the list, and expect to get a list out of the object, but it turns into a string.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f94a5b67720840270e624b1a0d4aaabcd833a17","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":158,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":159,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":160,"context_line":"                extra_info.update({k: jsonutils.dumps(v)})"},{"line_number":161,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_13120163","line":160,"in_reply_to":"bff0334d_9d33c2f6","updated":"2017-04-10 16:24:17.000000000","message":"The problem is \"v\" could be a nested dict. E.g.:\n{\u0027network\u0027: {\u0027capabilities\u0027: [\u0027val_1\u0027, \u0027val_2\u0027]}}\n--\u003e k\u003dnetwork\n    v\u003d{\u0027capabilities\u0027: [\u0027val_1\u0027, \u0027val_2\u0027]}\n\nThat\u0027s why I\u0027m using jsonutils. The information stored in \"dev_dict\" comes from libvirt description. Those parameters not beloging to regular ones (vendor_id, product_id, etc) go to this extra_info bucket.\n\nIn next patches, this information is extracted and processed. User won\u0027t see this information (unless you access to the DB).","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":158,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":159,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":160,"context_line":"                extra_info.update({k: jsonutils.dumps(v)})"},{"line_number":161,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_eed336d4","line":160,"range":{"start_line":160,"start_character":16,"end_line":160,"end_character":58},"updated":"2017-04-10 16:15:04.000000000","message":"This is going to change what we\u0027re storing in the db.\nFar as I can see, we\u0027re doing this json dumping now because capabilities, unlike the rest of the current extra_info fields, is a dict and that dict needs to be serialized. However, \u0027jsonutils.dumps\u0027 (or at least \u0027json.dumps\u0027, upon which that\u0027s based, doesn\u0027t result in the same output as we currently have:\n\n  \u003e\u003e\u003e import json\n  \u003e\u003e\u003e x \u003d \u0027test\u0027\n  \u003e\u003e\u003e {\u0027y\u0027: x}\n  {\u0027y\u0027: \u0027test\u0027}\n  \u003e\u003e\u003e {\u0027y\u0027: json.dumps(x)}\n  {\u0027y\u0027: \u0027\"test\"\u0027}\n\nNow, I don\u0027t know if this is going to be an issue and I can\u0027t figure out where this is actually used (I\u0027m looking for a \u0027loads\u0027 change but can\u0027t find it). However, changing the encoding of existing fields on something unversioned like this sounds like a bad idea.\n\nWhere is this actually be loaded, our of curiosity?","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"254165bdf21f2845b4097b0f986c0ea41a17b434","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":158,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":159,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":160,"context_line":"                extra_info.update({k: jsonutils.dumps(v)})"},{"line_number":161,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_d9449e49","line":160,"range":{"start_line":160,"start_character":16,"end_line":160,"end_character":58},"in_reply_to":"bff0334d_a6d42e21","updated":"2017-04-11 10:39:00.000000000","message":"I wasn\u0027t aware of this context. Comments left on PS12 as a follow up","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":158,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":159,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":160,"context_line":"                extra_info.update({k: jsonutils.dumps(v)})"},{"line_number":161,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_a6d42e21","line":160,"range":{"start_line":160,"start_character":16,"end_line":160,"end_character":58},"in_reply_to":"bff0334d_eed336d4","updated":"2017-04-10 19:15:49.000000000","message":"Since https://github.com/openstack/nova/blob/master/releasenotes/notes/removing-pci-parent_addr-migration-f7dfa2b441cf30e8.yaml there are no other parameters in extra_info.\n\nBut for the sake of compatibility, I\u0027ll check if \"v\" is a string or not. I\u0027ll change also the tests to inspect this behaviour (https://review.openstack.org/#/c/444415/10/nova/tests/unit/objects/test_pci_device.py@137).","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        for k, v in dev_dict.items():"},{"line_number":155,"context_line":"            if k in self.fields.keys():"},{"line_number":156,"context_line":"                setattr(self, k, v)"},{"line_number":157,"context_line":"            else:"},{"line_number":158,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":159,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":160,"context_line":"                extra_info \u003d self.extra_info"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_795472fe","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":17},"updated":"2017-04-11 10:38:53.000000000","message":"I wonder if there\u0027s value in explicitly checking for \u0027capabilities\u0027 here, then adding a final fallthrough else that raises an exception. No one should be storing anything else in this column now.","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cf9ad17dd4cfcc18a8f036c54c59f84154466031","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        for k, v in dev_dict.items():"},{"line_number":155,"context_line":"            if k in self.fields.keys():"},{"line_number":156,"context_line":"                setattr(self, k, v)"},{"line_number":157,"context_line":"            else:"},{"line_number":158,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":159,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":160,"context_line":"                extra_info \u003d self.extra_info"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_d2cea961","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":17},"in_reply_to":"bff0334d_4a242eaf","updated":"2017-04-11 16:48:56.000000000","message":"Then again, based on the upstream source there shouldn\u0027t be anything else in here and the check would make sure that of that. Not a big deal though as the comment is enough","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        for k, v in dev_dict.items():"},{"line_number":155,"context_line":"            if k in self.fields.keys():"},{"line_number":156,"context_line":"                setattr(self, k, v)"},{"line_number":157,"context_line":"            else:"},{"line_number":158,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":159,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":160,"context_line":"                extra_info \u003d self.extra_info"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_4a242eaf","line":157,"range":{"start_line":157,"start_character":12,"end_line":157,"end_character":17},"in_reply_to":"bff0334d_795472fe","updated":"2017-04-11 14:02:51.000000000","message":"\"extra_info\" in meant to be a bucket for other parameters not explicitly defined in PciDevice class. By adding this filter we are changing this behaviour. I prefer, as you say in the next comment, to add a note about the expected parameters here.","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":159,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":160,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":161,"context_line":"                data \u003d (v if isinstance(v, six.string_types) else"},{"line_number":162,"context_line":"                        jsonutils.dumps(v))"},{"line_number":163,"context_line":"                extra_info.update({k: data})"},{"line_number":164,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_f947624b","line":162,"range":{"start_line":161,"start_character":16,"end_line":162,"end_character":43},"updated":"2017-04-11 10:38:53.000000000","message":"I wasn\u0027t aware of the context on this field (i.e. the fact that it was no longer used for anything). Personally, I\u0027d love to see a NOTE detailing how this column used to be used for different things but is now only used for \u0027capabilities\u0027. Could you add these?","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                # Note (yjiang5) extra_info.update does not update"},{"line_number":159,"context_line":"                # obj_what_changed, set it explicitly"},{"line_number":160,"context_line":"                extra_info \u003d self.extra_info"},{"line_number":161,"context_line":"                data \u003d (v if isinstance(v, six.string_types) else"},{"line_number":162,"context_line":"                        jsonutils.dumps(v))"},{"line_number":163,"context_line":"                extra_info.update({k: data})"},{"line_number":164,"context_line":"                self.extra_info \u003d extra_info"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_8fc488f6","line":162,"range":{"start_line":161,"start_character":16,"end_line":162,"end_character":43},"in_reply_to":"bff0334d_f947624b","updated":"2017-04-11 14:02:51.000000000","message":"Done","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"}],"nova/pci/utils.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_01852f5a","line":177,"updated":"2017-03-27 18:52:11.000000000","message":"What precisely is this function for, though? So we have consistent network device naming for VFs?","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_408f2d29","line":177,"in_reply_to":"ffe62b97_01852f5a","updated":"2017-03-30 08:37:41.000000000","message":"This function is returning the libvirt name given to a network card, given a child (virtual function) PCI address.\n\nWith L179 we retrieve the physical NIC mac address and with L180 we retrieve the name (Linux name) of this network card.\n\nNow we can assemble the libvirt name. An example:\n\nroot@silpixa00394062:~# virsh nodedev-dumpxml net_ens785_68_05_ca_34_83_60\n\u003cdevice\u003e\n  \u003cname\u003enet_ens785_68_05_ca_34_83_60\u003c/name\u003e       \u003c------------- NAME\n  \u003cpath\u003e/sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/net/ens785\u003c/path\u003e\n  \u003cparent\u003epci_0000_02_00_0\u003c/parent\u003e\n  \u003ccapability type\u003d\u0027net\u0027\u003e\n    \u003cinterface\u003eens785\u003c/interface\u003e\n    \u003caddress\u003e68:05:ca:34:83:60\u003c/address\u003e\n    \u003clink state\u003d\u0027down\u0027/\u003e\n    \u003cfeature name\u003d\u0027rx\u0027/\u003e\n    \u003cfeature name\u003d\u0027tx\u0027/\u003e\n    \u003cfeature name\u003d\u0027sg\u0027/\u003e\n    \u003cfeature name\u003d\u0027tso\u0027/\u003e\n    \u003cfeature name\u003d\u0027gso\u0027/\u003e\n    \u003cfeature name\u003d\u0027gro\u0027/\u003e\n    \u003cfeature name\u003d\u0027rxvlan\u0027/\u003e\n    \u003cfeature name\u003d\u0027txvlan\u0027/\u003e\n    \u003cfeature name\u003d\u0027rxhash\u0027/\u003e\n    \u003ccapability type\u003d\u002780203\u0027/\u003e\n  \u003c/capability\u003e\n\u003c/device\u003e","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"},{"line_number":181,"context_line":"        return (\"net_%(ifname)s_%(mac)s\" %"},{"line_number":182,"context_line":"                {\u0027ifname\u0027: ifname, \u0027mac\u0027: \u0027_\u0027.join(mac)})"},{"line_number":183,"context_line":"    except Exception:"},{"line_number":184,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_414b3758","line":182,"updated":"2017-03-27 18:52:11.000000000","message":"mac is a string, not an iterable. So, \u0027_\u0027.join(mac) will return something different from what I believe you are looking for?\n\n \u003e\u003e\u003e s \u003d \"00-14-22-01-23-45\"\n \u003e\u003e\u003e \u0027_\u0027.join(s)\n \u00270_0_-_1_4_-_2_2_-_0_1_-_2_3_-_4_5\u0027","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"},{"line_number":181,"context_line":"        return (\"net_%(ifname)s_%(mac)s\" %"},{"line_number":182,"context_line":"                {\u0027ifname\u0027: ifname, \u0027mac\u0027: \u0027_\u0027.join(mac)})"},{"line_number":183,"context_line":"    except Exception:"},{"line_number":184,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_6008f190","line":182,"in_reply_to":"ffe62b97_414b3758","updated":"2017-03-30 08:37:41.000000000","message":"\"mac\" in L179 is a string and then splitted in chunks. Please, notice at the end of L179 the split command.\n\n\"mac\" is a list of six strings.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return (\"net_%(ifname)s_%(mac)s\" %"},{"line_number":182,"context_line":"                {\u0027ifname\u0027: ifname, \u0027mac\u0027: \u0027_\u0027.join(mac)})"},{"line_number":183,"context_line":"    except Exception:"},{"line_number":184,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_c1f3c709","line":184,"updated":"2017-03-27 18:52:11.000000000","message":"So we just ignore errors? :) And provide None as the network device name?","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return (\"net_%(ifname)s_%(mac)s\" %"},{"line_number":182,"context_line":"                {\u0027ifname\u0027: ifname, \u0027mac\u0027: \u0027_\u0027.join(mac)})"},{"line_number":183,"context_line":"    except Exception:"},{"line_number":184,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_c069fd24","line":184,"in_reply_to":"ffe62b97_c1f3c709","updated":"2017-03-30 08:37:41.000000000","message":"If the name returned is None, nothing is done (take a look at nova.virt.libvirt.driver L5242)\n\nBut you are right: here I\u0027m going to write a warning message.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4546bd722e2b7d1c5d627093803b608d2091302","unresolved":false,"context_lines":[{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"},{"line_number":181,"context_line":"        return (\"net_%(ifname)s_%(mac)s\" %"},{"line_number":182,"context_line":"                {\u0027ifname\u0027: ifname, \u0027mac\u0027: \u0027_\u0027.join(mac)})"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_e701b1b1","line":179,"updated":"2017-04-05 15:36:44.000000000","message":"Yeah, I didn\u0027t catch the split(\u0027:\u0027) at the end of the above line. All good, thanks!","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_2e6a3eed","line":177,"range":{"start_line":177,"start_character":41,"end_line":177,"end_character":44},"updated":"2017-04-10 16:15:04.000000000","message":"nit: is this \u0027the\u0027 or \u0027a\u0027. If the former, what does it correspond to? Something in the nova database, or on the system, or something else entirely? If the latter, maybe change it and explain why you\u0027d want to use this.","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_5bb3fb0a","line":177,"range":{"start_line":177,"start_character":41,"end_line":177,"end_character":44},"in_reply_to":"bff0334d_2e6a3eed","updated":"2017-04-10 19:15:49.000000000","message":"Is the former one.\n\nEvery VF is associated to a PCI net physical device. This function returns the libvirt name given to this net device. In the libvirt parser, the net device stores de network capabilities associated to this device.","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_f96082d1","line":177,"updated":"2017-04-11 10:38:53.000000000","message":"From your comments in PS11\n\n  Every VF is associated to a PCI net physical device. This \n  function returns the libvirt name given to this net device. \n  In the libvirt parser, the net device stores the network \n  capabilities associated to this device.\n\nYou should add something like this ^ to the docstring","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name.\"\"\""},{"line_number":178,"context_line":"    try:"},{"line_number":179,"context_line":"        mac \u003d get_mac_by_pci_address(vfaddress).split(\u0027:\u0027)"},{"line_number":180,"context_line":"        ifname \u003d get_ifname_by_pci_address(vfaddress)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_2a6b2ab7","line":177,"in_reply_to":"bff0334d_f96082d1","updated":"2017-04-11 14:02:51.000000000","message":"Done","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"521a78d3d9ddf473316287f87a732cda764093c4","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    return vf_num"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"def get_net_name_by_vf_pci_address(vfaddress):"},{"line_number":177,"context_line":"    \"\"\"Given the VF PCI address, returns the net device name."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    Every VF is associated to a PCI network device. This function"}],"source_content_type":"text/x-python","patch_set":13,"id":"bff0334d_794900b5","line":176,"updated":"2017-04-11 19:47:25.000000000","message":"This is OK to put here I suppose, but it would be good to mention in the function name that it\u0027s a libvirt-specific thing. Maybe libvirt_net_name_by_vf_pci_address()? Alternately, you could place this method as-is into the libvirt/utils.py module.","commit_id":"e6829f872aca03af6181557260637c8b601e476a"}],"nova/tests/unit/objects/test_pci_device.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34d4ceed8ee30df9890bc2e278642510b027ec85","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(jsonutils.loads(extra_value.get(\u0027k1\u0027)),"},{"line_number":138,"context_line":"                         self.dev_dict[\u0027k1\u0027])"},{"line_number":139,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":140,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_421b19cf","line":137,"range":{"start_line":137,"start_character":25,"end_line":137,"end_character":41},"updated":"2017-04-10 14:59:09.000000000","message":"I would feel happier about backwards compatibility, if we didn\u0027t have this bit here.\n\nI assume that is not required here?","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f94a5b67720840270e624b1a0d4aaabcd833a17","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(jsonutils.loads(extra_value.get(\u0027k1\u0027)),"},{"line_number":138,"context_line":"                         self.dev_dict[\u0027k1\u0027])"},{"line_number":139,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":140,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_0e6e5ac8","line":137,"range":{"start_line":137,"start_character":25,"end_line":137,"end_character":41},"in_reply_to":"bff0334d_421b19cf","updated":"2017-04-10 16:24:17.000000000","message":"In L137 and L150 I\u0027m testing the same functionality in the same way, regardless of the type of data, proving that the code is consistent.\n\nThe value stored in extra_info is going to be treated always in the same way. For consistency, regardless of the type of data, I\u0027m using the same method.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(jsonutils.loads(extra_value.get(\u0027k1\u0027)),"},{"line_number":138,"context_line":"                         self.dev_dict[\u0027k1\u0027])"},{"line_number":139,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":140,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"},{"line_number":141,"context_line":"                         set([\u0027compute_node_id\u0027, \u0027address\u0027, \u0027product_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_ee48d687","line":138,"range":{"start_line":137,"start_character":25,"end_line":138,"end_character":45},"updated":"2017-04-10 16:15:04.000000000","message":"Again, I\u0027m really not sure we can do this. For example, loading an existing, non-JSON encoded field from the database would fail:\n\n  \u003e\u003e\u003e from oslo_serialization import jsonutils\n  \u003e\u003e\u003e jsonutils.loads(\u0027x\u0027)\n  Traceback (most recent call last):\n    File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n    File \"/tmp/venv/lib/python2.7/sitepackages/oslo_serialization/jsonutils.py\", line 241, in loads\n      return json.loads(encodeutils.safe_decode(s, encoding), **kwargs)\n    File \"/usr/lib64/python2.7/json/__init__.py\", line 339, in loads\n      return _default_decoder.decode(s)\n    File \"/usr/lib64/python2.7/json/decoder.py\", line 364, in decode\n      obj, end \u003d self.raw_decode(s, idx\u003d_w(s, 0).end())\n    File \"/usr/lib64/python2.7/json/decoder.py\", line 382, in raw_decode\n      raise ValueError(\"No JSON object could be decoded\")\n  ValueError: No JSON object could be decoded","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(jsonutils.loads(extra_value.get(\u0027k1\u0027)),"},{"line_number":138,"context_line":"                         self.dev_dict[\u0027k1\u0027])"},{"line_number":139,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":140,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"},{"line_number":141,"context_line":"                         set([\u0027compute_node_id\u0027, \u0027address\u0027, \u0027product_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_92de080f","line":138,"range":{"start_line":137,"start_character":25,"end_line":138,"end_character":45},"in_reply_to":"bff0334d_ee48d687","updated":"2017-04-10 19:15:49.000000000","message":"Remember the value stored in \"extra_info\" comes from the opposite process, jsonutils.dumps(value).\n\nTry this code (with value1 or 2 or 2):\n\nfrom oslo_serialization import jsonutils\nvalue1 \u003d {\u0027a\u0027: \u0027b\u0027}\nvalue2 \u003d \"string___\"\nvalue3 \u003d 1\nin \u003d jsonutils.dumps(value1)\nout \u003d jsonutils.loads(value1) # out \u003d\u003d value1","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                              \u0027numa_node\u0027, \u0027status\u0027, \u0027address\u0027, \u0027extra_info\u0027,"},{"line_number":129,"context_line":"                              \u0027dev_type\u0027, \u0027parent_addr\u0027]))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_pci_device_extra_info(self):"},{"line_number":132,"context_line":"        self.dev_dict \u003d copy.copy(dev_dict)"},{"line_number":133,"context_line":"        self.dev_dict[\u0027k1\u0027] \u003d \u0027v1\u0027"},{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(extra_value.get(\u0027k1\u0027), self.dev_dict[\u0027k1\u0027])"},{"line_number":138,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":139,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"},{"line_number":140,"context_line":"                         set([\u0027compute_node_id\u0027, \u0027address\u0027, \u0027product_id\u0027,"},{"line_number":141,"context_line":"                              \u0027vendor_id\u0027, \u0027numa_node\u0027, \u0027status\u0027,"},{"line_number":142,"context_line":"                              \u0027extra_info\u0027, \u0027dev_type\u0027, \u0027parent_addr\u0027]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_pci_device_extra_info_with_dict(self):"},{"line_number":145,"context_line":"        self.dev_dict \u003d copy.copy(dev_dict)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_59808e46","line":142,"range":{"start_line":131,"start_character":0,"end_line":142,"end_character":72},"updated":"2017-04-11 10:38:53.000000000","message":"If you were to only filter on capabilities, you could remove this entire test in favour of the below (there\u0027d be no reason to handle anything else like strings)","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                              \u0027numa_node\u0027, \u0027status\u0027, \u0027address\u0027, \u0027extra_info\u0027,"},{"line_number":129,"context_line":"                              \u0027dev_type\u0027, \u0027parent_addr\u0027]))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_pci_device_extra_info(self):"},{"line_number":132,"context_line":"        self.dev_dict \u003d copy.copy(dev_dict)"},{"line_number":133,"context_line":"        self.dev_dict[\u0027k1\u0027] \u003d \u0027v1\u0027"},{"line_number":134,"context_line":"        self.dev_dict[\u0027k2\u0027] \u003d \u0027v2\u0027"},{"line_number":135,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":136,"context_line":"        extra_value \u003d self.pci_device.extra_info"},{"line_number":137,"context_line":"        self.assertEqual(extra_value.get(\u0027k1\u0027), self.dev_dict[\u0027k1\u0027])"},{"line_number":138,"context_line":"        self.assertEqual(set(extra_value.keys()), set((\u0027k1\u0027, \u0027k2\u0027)))"},{"line_number":139,"context_line":"        self.assertEqual(self.pci_device.obj_what_changed(),"},{"line_number":140,"context_line":"                         set([\u0027compute_node_id\u0027, \u0027address\u0027, \u0027product_id\u0027,"},{"line_number":141,"context_line":"                              \u0027vendor_id\u0027, \u0027numa_node\u0027, \u0027status\u0027,"},{"line_number":142,"context_line":"                              \u0027extra_info\u0027, \u0027dev_type\u0027, \u0027parent_addr\u0027]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_pci_device_extra_info_with_dict(self):"},{"line_number":145,"context_line":"        self.dev_dict \u003d copy.copy(dev_dict)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_8b959989","line":142,"range":{"start_line":131,"start_character":0,"end_line":142,"end_character":72},"in_reply_to":"bff0334d_59808e46","updated":"2017-04-11 14:02:51.000000000","message":"IMO, we shouldn\u0027t filter other parameters to go to \"extra_info\". This is out of scope in this feature and we should keep the current behaviour.\n\nOf course, that could be something easy to implement but this should be in a separate small BP.","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"}],"nova/tests/unit/pci/test_utils.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            f.write(mac)"},{"line_number":262,"context_line":"        self._listdir \u003d mock.patch.object(os, \u0027listdir\u0027)"},{"line_number":263,"context_line":"        self.mock_listdir \u003d self._listdir.start()"},{"line_number":264,"context_line":"        self._join \u003d mock.patch.object(os.path, \u0027join\u0027)"},{"line_number":265,"context_line":"        self.mock_join \u003d self._join.start()"},{"line_number":266,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":267,"context_line":"                         \u0027_\u0027.join(mac.strip().split(\u0027:\u0027)))"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_01908f42","line":264,"updated":"2017-03-27 18:52:11.000000000","message":"Instead of mocking out the os.path.join and os.listdir functions, just mock out the utils.get_mac_address_from_pci_address() and get_ifname_from_pci_address() functions. We already unit test those two functions, so unit testing the get_net_name_by_vf_pci_address() should simply assume those functions return appropriate information.\n\nSince both test methods will mock out the get_mac_address_from_pci_address() and get_ifname_from_pci_address() functions, you can decorate the test class object instead of each individual test method.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            f.write(mac)"},{"line_number":262,"context_line":"        self._listdir \u003d mock.patch.object(os, \u0027listdir\u0027)"},{"line_number":263,"context_line":"        self.mock_listdir \u003d self._listdir.start()"},{"line_number":264,"context_line":"        self._join \u003d mock.patch.object(os.path, \u0027join\u0027)"},{"line_number":265,"context_line":"        self.mock_join \u003d self._join.start()"},{"line_number":266,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":267,"context_line":"                         \u0027_\u0027.join(mac.strip().split(\u0027:\u0027)))"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_e02641ce","line":264,"in_reply_to":"ffe62b97_01908f42","updated":"2017-03-30 08:37:41.000000000","message":"You are right. I wanted to test the whole process, from reading the mac file to assembling the name.\n\nI\u0027ll reduce the scope of this tests.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        self._join \u003d mock.patch.object(os.path, \u0027join\u0027)"},{"line_number":265,"context_line":"        self.mock_join \u003d self._join.start()"},{"line_number":266,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":267,"context_line":"                         \u0027_\u0027.join(mac.strip().split(\u0027:\u0027)))"},{"line_number":268,"context_line":"        self.addCleanup(self._listdir.stop)"},{"line_number":269,"context_line":"        self.addCleanup(self._join.stop)"},{"line_number":270,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_61f4fbcf","line":267,"updated":"2017-03-27 18:52:11.000000000","message":"Here, you are emulating a *different* behaviour than the utils.get_mac_address_from_pci_address() function and returning a *list* instead of a *string*:\n\nhttps://github.com/openstack/nova/blob/master/nova/pci/utils.py#L144-L145","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        self._join \u003d mock.patch.object(os.path, \u0027join\u0027)"},{"line_number":265,"context_line":"        self.mock_join \u003d self._join.start()"},{"line_number":266,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":267,"context_line":"                         \u0027_\u0027.join(mac.strip().split(\u0027:\u0027)))"},{"line_number":268,"context_line":"        self.addCleanup(self._listdir.stop)"},{"line_number":269,"context_line":"        self.addCleanup(self._join.stop)"},{"line_number":270,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_80a4154c","line":267,"in_reply_to":"ffe62b97_61f4fbcf","updated":"2017-03-30 08:37:41.000000000","message":"No, I\u0027m emulating the whole process:\n- Retrieving the mac address from a text file.\n- Stripping the EOF (done in https://github.com/openstack/nova/blob/master/nova/pci/utils.py#L144-L145)\n- Then dividing the string in a list of string.\n\nThis code is working in a real environment.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4546bd722e2b7d1c5d627093803b608d2091302","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"},{"line_number":265,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":266,"context_line":"                         \u0027_\u0027.join(self.mac.split(\u0027:\u0027)))"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_correct_behaviour(self):"},{"line_number":269,"context_line":"        self.mock_get_mac.return_value \u003d self.mac"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_07f5b5cb","line":266,"updated":"2017-04-05 15:36:44.000000000","message":"Might be easier to read the test by just doing:\n self.net_name \u003d \u0027net_enp7s0f0_ca_fe_ca_fe_ca_fe\u0027\n\nAlso, since the above variable is only used in the test_correct_behaviour() test case, it would be good to move it in there instead of in the class scope.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f0789bb3e5872c49a08741c798d368842acec2e7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"},{"line_number":265,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":266,"context_line":"                         \u0027_\u0027.join(self.mac.split(\u0027:\u0027)))"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_correct_behaviour(self):"},{"line_number":269,"context_line":"        self.mock_get_mac.return_value \u003d self.mac"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_b6f85cc4","line":266,"in_reply_to":"bff0334d_07f5b5cb","updated":"2017-04-06 08:25:28.000000000","message":"If I need to respin the patch, I\u0027ll change it. Thanks!","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            utils, \u0027get_ifname_by_pci_address\u0027)"},{"line_number":259,"context_line":"        self.mock_get_ifname \u003d self._get_ifname.start()"},{"line_number":260,"context_line":"        self.addCleanup(self._get_mac.stop)"},{"line_number":261,"context_line":"        self.addCleanup(self._get_ifname.stop)"},{"line_number":262,"context_line":"        self.mac \u003d \u0027ca:fe:ca:fe:ca:fe\u0027"},{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_4c1fcb5a","line":261,"updated":"2017-04-10 16:15:04.000000000","message":"femtonit: a line break here would help delineate this block of code into mock setup and other config","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            utils, \u0027get_ifname_by_pci_address\u0027)"},{"line_number":259,"context_line":"        self.mock_get_ifname \u003d self._get_ifname.start()"},{"line_number":260,"context_line":"        self.addCleanup(self._get_mac.stop)"},{"line_number":261,"context_line":"        self.addCleanup(self._get_ifname.stop)"},{"line_number":262,"context_line":"        self.mac \u003d \u0027ca:fe:ca:fe:ca:fe\u0027"},{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_d26a507f","line":261,"in_reply_to":"bff0334d_4c1fcb5a","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.mac \u003d \u0027ca:fe:ca:fe:ca:fe\u0027"},{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"},{"line_number":265,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":266,"context_line":"                         \u0027_\u0027.join(self.mac.split(\u0027:\u0027)))"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_correct_behaviour(self):"},{"line_number":269,"context_line":"        self.mock_get_mac.return_value \u003d self.mac"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_ac2f7786","line":266,"range":{"start_line":265,"start_character":0,"end_line":266,"end_character":55},"updated":"2017-04-10 16:15:04.000000000","message":"nit: This probably belongs in the \u0027test_correct_behavior\u0027","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.mac \u003d \u0027ca:fe:ca:fe:ca:fe\u0027"},{"line_number":263,"context_line":"        self.if_name \u003d \u0027enp7s0f0\u0027"},{"line_number":264,"context_line":"        self.pci_address \u003d \u00270000:07:02.1\u0027"},{"line_number":265,"context_line":"        self.net_name \u003d (\u0027net_\u0027 + self.if_name + \u0027_\u0027 +"},{"line_number":266,"context_line":"                         \u0027_\u0027.join(self.mac.split(\u0027:\u0027)))"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_correct_behaviour(self):"},{"line_number":269,"context_line":"        self.mock_get_mac.return_value \u003d self.mac"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_12755864","line":266,"range":{"start_line":265,"start_character":0,"end_line":266,"end_character":55},"in_reply_to":"bff0334d_ac2f7786","updated":"2017-04-10 19:15:49.000000000","message":"Yes, it\u0027s used only there.","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34d4ceed8ee30df9890bc2e278642510b027ec85","unresolved":false,"context_lines":[{"line_number":12581,"context_line":"        def fake_nodeDeviceLookupByName(_, name):"},{"line_number":12582,"context_line":"            return FakeNodeDevice(_fake_NodeDevXml[name])"},{"line_number":12583,"context_line":""},{"line_number":12584,"context_line":"        self.mox.StubOutWithMock(host.Host, \u0027device_lookup_by_name\u0027)"},{"line_number":12585,"context_line":"        host.Host.device_lookup_by_name \u003d fake_nodeDeviceLookupByName"},{"line_number":12586,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":12587,"context_line":"        dev_name \u003d \"net_enp2s2_02_9a_a1_37_be_54\""}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_223935f1","line":12584,"updated":"2017-04-10 14:59:09.000000000","message":"this is not allowed, no new mox based tests please (even for file level consistency). Should be an easy convert to self.stub_out.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f94a5b67720840270e624b1a0d4aaabcd833a17","unresolved":false,"context_lines":[{"line_number":12581,"context_line":"        def fake_nodeDeviceLookupByName(_, name):"},{"line_number":12582,"context_line":"            return FakeNodeDevice(_fake_NodeDevXml[name])"},{"line_number":12583,"context_line":""},{"line_number":12584,"context_line":"        self.mox.StubOutWithMock(host.Host, \u0027device_lookup_by_name\u0027)"},{"line_number":12585,"context_line":"        host.Host.device_lookup_by_name \u003d fake_nodeDeviceLookupByName"},{"line_number":12586,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":12587,"context_line":"        dev_name \u003d \"net_enp2s2_02_9a_a1_37_be_54\""}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_6eb3a64e","line":12584,"in_reply_to":"bff0334d_223935f1","updated":"2017-04-10 16:24:17.000000000","message":"Thanks for the tip.\n\nDone.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":12634,"context_line":""},{"line_number":12635,"context_line":"    def test_get_pcinet_info(self):"},{"line_number":12636,"context_line":""},{"line_number":12637,"context_line":"        # def fake_nodeDeviceLookupByName(_, name):"},{"line_number":12638,"context_line":"        #     return FakeNodeDevice(_fake_NodeDevXml[name])"},{"line_number":12639,"context_line":""},{"line_number":12640,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":12641,"context_line":"        dev_name \u003d \"net_enp2s2_02_9a_a1_37_be_54\""}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_39deea6c","line":12638,"range":{"start_line":12637,"start_character":0,"end_line":12638,"end_character":59},"updated":"2017-04-11 10:38:53.000000000","message":"Burn it. Burn it with fire","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":12634,"context_line":""},{"line_number":12635,"context_line":"    def test_get_pcinet_info(self):"},{"line_number":12636,"context_line":""},{"line_number":12637,"context_line":"        # def fake_nodeDeviceLookupByName(_, name):"},{"line_number":12638,"context_line":"        #     return FakeNodeDevice(_fake_NodeDevXml[name])"},{"line_number":12639,"context_line":""},{"line_number":12640,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":12641,"context_line":"        dev_name \u003d \"net_enp2s2_02_9a_a1_37_be_54\""}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_ca671eb7","line":12638,"range":{"start_line":12637,"start_character":0,"end_line":12638,"end_character":59},"in_reply_to":"bff0334d_39deea6c","updated":"2017-04-11 14:02:51.000000000","message":"Uffff, I forgot to delete it!","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"}],"nova/virt/libvirt/config.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":2313,"context_line":"                self.vendor_id \u003d int(c.get(\u0027id\u0027), 16)"},{"line_number":2314,"context_line":"            elif c.tag \u003d\u003d \"numa\":"},{"line_number":2315,"context_line":"                self.numa_node \u003d int(c.get(\u0027node\u0027))"},{"line_number":2316,"context_line":"            if c.tag \u003d\u003d \"interface\":"},{"line_number":2317,"context_line":"                self.interface \u003d c.text"},{"line_number":2318,"context_line":"            elif c.tag \u003d\u003d \"address\":"},{"line_number":2319,"context_line":"                self.address \u003d c.text"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_356e2d95","line":2316,"updated":"2017-03-27 18:52:11.000000000","message":"should be an elif, though doesn\u0027t really matter...","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":2313,"context_line":"                self.vendor_id \u003d int(c.get(\u0027id\u0027), 16)"},{"line_number":2314,"context_line":"            elif c.tag \u003d\u003d \"numa\":"},{"line_number":2315,"context_line":"                self.numa_node \u003d int(c.get(\u0027node\u0027))"},{"line_number":2316,"context_line":"            if c.tag \u003d\u003d \"interface\":"},{"line_number":2317,"context_line":"                self.interface \u003d c.text"},{"line_number":2318,"context_line":"            elif c.tag \u003d\u003d \"address\":"},{"line_number":2319,"context_line":"                self.address \u003d c.text"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_2012e962","line":2316,"in_reply_to":"ffe62b97_356e2d95","updated":"2017-03-30 08:37:41.000000000","message":"Yes, my bad!","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":2343,"context_line":"                self.pci_capability \u003d pcicap"},{"line_number":2344,"context_line":""},{"line_number":2345,"context_line":""},{"line_number":2346,"context_line":"class LibvirtConfigNodeDevicePciCap(LibvirtConfigObject):"},{"line_number":2347,"context_line":"    \"\"\"Libvirt Node Devices pci capability parser.\"\"\""},{"line_number":2348,"context_line":""},{"line_number":2349,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_0c42e33e","line":2346,"updated":"2017-04-10 16:15:04.000000000","message":"I\u0027m assuming these things are internal only and unversioned","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":2343,"context_line":"                self.pci_capability \u003d pcicap"},{"line_number":2344,"context_line":""},{"line_number":2345,"context_line":""},{"line_number":2346,"context_line":"class LibvirtConfigNodeDevicePciCap(LibvirtConfigObject):"},{"line_number":2347,"context_line":"    \"\"\"Libvirt Node Devices pci capability parser.\"\"\""},{"line_number":2348,"context_line":""},{"line_number":2349,"context_line":"    def __init__(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_723dc48d","line":2346,"in_reply_to":"bff0334d_0c42e33e","updated":"2017-04-10 19:15:49.000000000","message":"Yes, this information is stored later. This is just a XML parser for libvirt. Those modules (compute) calling it, will take care of this information properly (using, for example, DB versioned objects).","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":2358,"context_line":"        self.vendor \u003d None"},{"line_number":2359,"context_line":"        self.vendor_id \u003d None"},{"line_number":2360,"context_line":"        self.numa_node \u003d None"},{"line_number":2361,"context_line":"        self.fun_capability \u003d []"},{"line_number":2362,"context_line":"        self.interface \u003d None"},{"line_number":2363,"context_line":"        self.address \u003d None"},{"line_number":2364,"context_line":"        self.link_state \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_ae688eb8","line":2361,"range":{"start_line":2361,"start_character":13,"end_line":2361,"end_character":27},"updated":"2017-04-10 16:15:04.000000000","message":"what a fun name","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"254165bdf21f2845b4097b0f986c0ea41a17b434","unresolved":false,"context_lines":[{"line_number":2358,"context_line":"        self.vendor \u003d None"},{"line_number":2359,"context_line":"        self.vendor_id \u003d None"},{"line_number":2360,"context_line":"        self.numa_node \u003d None"},{"line_number":2361,"context_line":"        self.fun_capability \u003d []"},{"line_number":2362,"context_line":"        self.interface \u003d None"},{"line_number":2363,"context_line":"        self.address \u003d None"},{"line_number":2364,"context_line":"        self.link_state \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_b9d31a60","line":2361,"range":{"start_line":2361,"start_character":13,"end_line":2361,"end_character":27},"in_reply_to":"bff0334d_32805c46","updated":"2017-04-11 10:39:00.000000000","message":"I know - I kid, I kid :)","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":2358,"context_line":"        self.vendor \u003d None"},{"line_number":2359,"context_line":"        self.vendor_id \u003d None"},{"line_number":2360,"context_line":"        self.numa_node \u003d None"},{"line_number":2361,"context_line":"        self.fun_capability \u003d []"},{"line_number":2362,"context_line":"        self.interface \u003d None"},{"line_number":2363,"context_line":"        self.address \u003d None"},{"line_number":2364,"context_line":"        self.link_state \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_32805c46","line":2361,"range":{"start_line":2361,"start_character":13,"end_line":2361,"end_character":27},"in_reply_to":"bff0334d_ae688eb8","updated":"2017-04-10 19:15:49.000000000","message":"That\u0027t not mine! (I just substituted the list call for the literal, for conssitency with L2365)","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4127d76a7bf4eb1e6f54def843564f0e76229ea8","unresolved":false,"context_lines":[{"line_number":197,"context_line":"# versions. Over time, this will become a common min version"},{"line_number":198,"context_line":"# for all architectures/hypervisors, as this value rises to"},{"line_number":199,"context_line":"# meet them."},{"line_number":200,"context_line":"MIN_LIBVIRT_VERSION \u003d (1, 2, 9)"},{"line_number":201,"context_line":"MIN_QEMU_VERSION \u003d (2, 1, 0)"},{"line_number":202,"context_line":"# TODO(berrange): Re-evaluate this at start of each release cycle"},{"line_number":203,"context_line":"# to decide if we want to plan a future min version bump."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_5b644221","line":200,"updated":"2017-03-20 17:46:37.000000000","message":"If the nic feature discovery was added in 1.2.14 then you need to make the code conditional on the version, since we support 1.2.9 at a minimum.","commit_id":"5fc923db030c6ae54458cef256c5234c49d02348"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6953234f848679fe76ca86c076ddf2a11c8f3be1","unresolved":false,"context_lines":[{"line_number":197,"context_line":"# versions. Over time, this will become a common min version"},{"line_number":198,"context_line":"# for all architectures/hypervisors, as this value rises to"},{"line_number":199,"context_line":"# meet them."},{"line_number":200,"context_line":"MIN_LIBVIRT_VERSION \u003d (1, 2, 9)"},{"line_number":201,"context_line":"MIN_QEMU_VERSION \u003d (2, 1, 0)"},{"line_number":202,"context_line":"# TODO(berrange): Re-evaluate this at start of each release cycle"},{"line_number":203,"context_line":"# to decide if we want to plan a future min version bump."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_ae809647","line":200,"in_reply_to":"1a1ced50_5b644221","updated":"2017-03-20 18:01:02.000000000","message":"You are right! Thanks.\n\nThe code doesn\u0027t need to be conditional: if libvirt can\u0027t read these features, there won\u0027t be any new parameter added to pci_devices (like not having this feature)","commit_id":"5fc923db030c6ae54458cef256c5234c49d02348"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":5249,"context_line":"        cpu_info[\u0027features\u0027] \u003d features"},{"line_number":5250,"context_line":"        return cpu_info"},{"line_number":5251,"context_line":""},{"line_number":5252,"context_line":"    def _get_pcinet_info(self, pci_parent_address):"},{"line_number":5253,"context_line":"        \"\"\"Returns a dict of NET device.\"\"\""},{"line_number":5254,"context_line":"        devname \u003d pci_utils.get_net_name_by_vf_pci_address(pci_parent_address)"},{"line_number":5255,"context_line":"        if not devname:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_f58fa520","line":5252,"updated":"2017-03-27 18:52:11.000000000","message":"This isn\u0027t the PCI parent address you are passing in but rather the *VF*\u0027s address.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":5249,"context_line":"        cpu_info[\u0027features\u0027] \u003d features"},{"line_number":5250,"context_line":"        return cpu_info"},{"line_number":5251,"context_line":""},{"line_number":5252,"context_line":"    def _get_pcinet_info(self, pci_parent_address):"},{"line_number":5253,"context_line":"        \"\"\"Returns a dict of NET device.\"\"\""},{"line_number":5254,"context_line":"        devname \u003d pci_utils.get_net_name_by_vf_pci_address(pci_parent_address)"},{"line_number":5255,"context_line":"        if not devname:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_22cf8eb1","line":5252,"in_reply_to":"ffe62b97_f58fa520","updated":"2017-03-30 08:37:41.000000000","message":"Yes, you are right. I think I copied/pasted other function definition...\n\nThis should be the VF address.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":5313,"context_line":"            cfgdev.pci_capability.domain,"},{"line_number":5314,"context_line":"            cfgdev.pci_capability.bus,"},{"line_number":5315,"context_line":"            cfgdev.pci_capability.slot,"},{"line_number":5316,"context_line":"            cfgdev.pci_capability.function)"},{"line_number":5317,"context_line":""},{"line_number":5318,"context_line":"        device \u003d {"},{"line_number":5319,"context_line":"            \"dev_id\": cfgdev.name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_9503b973","line":5316,"updated":"2017-03-27 18:52:11.000000000","message":"Per comment above about you not passing in the parent\u0027s address... the above is the VF\u0027s address, not the physical functions. The parent_addr field of the device dict is the PF\u0027s address. See line 5291 above...","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":5313,"context_line":"            cfgdev.pci_capability.domain,"},{"line_number":5314,"context_line":"            cfgdev.pci_capability.bus,"},{"line_number":5315,"context_line":"            cfgdev.pci_capability.slot,"},{"line_number":5316,"context_line":"            cfgdev.pci_capability.function)"},{"line_number":5317,"context_line":""},{"line_number":5318,"context_line":"        device \u003d {"},{"line_number":5319,"context_line":"            \"dev_id\": cfgdev.name,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_82889a22","line":5316,"in_reply_to":"ffe62b97_9503b973","updated":"2017-03-30 08:37:41.000000000","message":"Yes, that was my fault naming the input function parameter.","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"904c48e2edc7fc882dfa89a1bc1b7166844b5c23","unresolved":false,"context_lines":[{"line_number":5328,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5329,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5330,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5331,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5332,"context_line":"            if pcinet_info:"},{"line_number":5333,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5334,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_b5359d48","line":5331,"updated":"2017-03-27 18:52:11.000000000","message":"This should be:\n\n parent_addr \u003d device[\u0027parent_addr\u0027]\n pcinet_info \u003d self._get_pcinet_info(parent_addr)","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"94556bc95624eead4ed33cf003a659b03d98fabd","unresolved":false,"context_lines":[{"line_number":5328,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5329,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5330,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5331,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5332,"context_line":"            if pcinet_info:"},{"line_number":5333,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5334,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_02936a5e","line":5331,"in_reply_to":"ffe62b97_b5359d48","updated":"2017-03-30 08:37:41.000000000","message":"No, we need the VF PCI address","commit_id":"0c735698921758bcf3d0a30adb981ef89267b74e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34d4ceed8ee30df9890bc2e278642510b027ec85","unresolved":false,"context_lines":[{"line_number":5349,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5350,"context_line":"            if pcinet_info:"},{"line_number":5351,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5352,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"},{"line_number":5353,"context_line":"        return device"},{"line_number":5354,"context_line":""},{"line_number":5355,"context_line":"    def _get_pci_passthrough_devices(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_7db35e4e","line":5352,"range":{"start_line":5352,"start_character":31,"end_line":5352,"end_character":62},"updated":"2017-04-10 14:59:09.000000000","message":"I am tempted to say convert this list to a string, or something like that in here, so its clear to the readers what is going on. See comments in the PCI device object code.","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f94a5b67720840270e624b1a0d4aaabcd833a17","unresolved":false,"context_lines":[{"line_number":5349,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5350,"context_line":"            if pcinet_info:"},{"line_number":5351,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5352,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"},{"line_number":5353,"context_line":"        return device"},{"line_number":5354,"context_line":""},{"line_number":5355,"context_line":"    def _get_pci_passthrough_devices(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bff0334d_8cdef30e","line":5352,"range":{"start_line":5352,"start_character":31,"end_line":5352,"end_character":62},"in_reply_to":"bff0334d_7db35e4e","updated":"2017-04-10 16:24:17.000000000","message":"I have just the opposite way of thinking: to deal with the object (string, list) and convert to a string in the very last moment, when we need to fill the DB object member (pci_device.extra_info).","commit_id":"d1c5d35bc6e616d9863f3150eaa76dfd79a31c8d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":5353,"context_line":"        # requirement by DataBase Model"},{"line_number":5354,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5355,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5356,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5357,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5358,"context_line":"            if pcinet_info:"},{"line_number":5359,"context_line":"                device[\u0027capabilities\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_3353c541","line":5356,"updated":"2017-04-10 16:15:04.000000000","message":"A comment about why we treat SRIOV_VF differently would be appreciated","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":5353,"context_line":"        # requirement by DataBase Model"},{"line_number":5354,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5355,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5356,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5357,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5358,"context_line":"            if pcinet_info:"},{"line_number":5359,"context_line":"                device[\u0027capabilities\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_cfa86d21","line":5356,"in_reply_to":"bff0334d_3353c541","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e70e6e591312cd649417411fd826d21dab29bda4","unresolved":false,"context_lines":[{"line_number":5353,"context_line":"        # requirement by DataBase Model"},{"line_number":5354,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5355,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5356,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5357,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5358,"context_line":"            if pcinet_info:"},{"line_number":5359,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5360,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"},{"line_number":5361,"context_line":"        return device"},{"line_number":5362,"context_line":""},{"line_number":5363,"context_line":"    def _get_pci_passthrough_devices(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_b302353c","line":5360,"range":{"start_line":5356,"start_character":0,"end_line":5360,"end_character":63},"updated":"2017-04-10 16:15:04.000000000","message":"I\u0027d like to see this moved to a \u0027_get_device_capabilities\u0027 function. It would be easier to test and read (this function is already rather complicated :()","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9db51a9b239be1ccac8fd176c17ac2339d04028a","unresolved":false,"context_lines":[{"line_number":5353,"context_line":"        # requirement by DataBase Model"},{"line_number":5354,"context_line":"        device[\u0027label\u0027] \u003d \u0027label_%(vendor_id)s_%(product_id)s\u0027 % device"},{"line_number":5355,"context_line":"        device.update(_get_device_type(cfgdev, address))"},{"line_number":5356,"context_line":"        if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5357,"context_line":"            pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5358,"context_line":"            if pcinet_info:"},{"line_number":5359,"context_line":"                device[\u0027capabilities\u0027] \u003d {"},{"line_number":5360,"context_line":"                    \u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}"},{"line_number":5361,"context_line":"        return device"},{"line_number":5362,"context_line":""},{"line_number":5363,"context_line":"    def _get_pci_passthrough_devices(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_afa52949","line":5360,"range":{"start_line":5356,"start_character":0,"end_line":5360,"end_character":63},"in_reply_to":"bff0334d_b302353c","updated":"2017-04-10 19:15:49.000000000","message":"Done","commit_id":"c364ee96e0afe483230aefd60373291156f37ae6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7caa767796ab8e3b0be81af742f86049b74190c9","unresolved":false,"context_lines":[{"line_number":5337,"context_line":"            parent\u0027s network capabilities (must be always a NIC device) and"},{"line_number":5338,"context_line":"            appends this information to the device\u0027s dictionary."},{"line_number":5339,"context_line":"            \"\"\""},{"line_number":5340,"context_line":"            if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5341,"context_line":"                pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5342,"context_line":"                if pcinet_info:"},{"line_number":5343,"context_line":"                    device[\u0027capabilities\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_5911ae03","line":5340,"range":{"start_line":5340,"start_character":12,"end_line":5340,"end_character":71},"updated":"2017-04-11 10:38:53.000000000","message":"nit: I find this use of inner functions without arguments confusing. Which version of \u0027device\u0027 is being passed through? The version on line 5332 or 5368? I\u0027m guessing the latter but eh.\n\nI guess we could move this check back to line 5369, pass \u0027device\u0027 and \u0027address\u0027 as arguments, and return a dict a la the \u0027_get_device_type\u0027 function","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"394ab2beef63bc9b0d3bb9dde3e244c18ddfad32","unresolved":false,"context_lines":[{"line_number":5337,"context_line":"            parent\u0027s network capabilities (must be always a NIC device) and"},{"line_number":5338,"context_line":"            appends this information to the device\u0027s dictionary."},{"line_number":5339,"context_line":"            \"\"\""},{"line_number":5340,"context_line":"            if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5341,"context_line":"                pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5342,"context_line":"                if pcinet_info:"},{"line_number":5343,"context_line":"                    device[\u0027capabilities\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"bff0334d_f10c1295","line":5340,"range":{"start_line":5340,"start_character":12,"end_line":5340,"end_character":71},"in_reply_to":"bff0334d_5911ae03","updated":"2017-04-11 14:02:51.000000000","message":"I\u0027ll rewrite this function.","commit_id":"dcd4b389804708e500d983783da07cdc440d2b9f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e87678abae2fcdb727c60134872e9b5c5b07ee71","unresolved":false,"context_lines":[{"line_number":5330,"context_line":""},{"line_number":5331,"context_line":"            return {\u0027dev_type\u0027: fields.PciDeviceType.STANDARD}"},{"line_number":5332,"context_line":""},{"line_number":5333,"context_line":"        def _get_device_capabilities(device, address):"},{"line_number":5334,"context_line":"            \"\"\"Get PCI VF device\u0027s additional capabilities."},{"line_number":5335,"context_line":""},{"line_number":5336,"context_line":"            If a PCI device is a virtual function, this function reads the PCI"},{"line_number":5337,"context_line":"            parent\u0027s network capabilities (must be always a NIC device) and"},{"line_number":5338,"context_line":"            appends this information to the device\u0027s dictionary."},{"line_number":5339,"context_line":"            \"\"\""},{"line_number":5340,"context_line":"            if device.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":5341,"context_line":"                pcinet_info \u003d self._get_pcinet_info(address)"},{"line_number":5342,"context_line":"                if pcinet_info:"},{"line_number":5343,"context_line":"                    return {\u0027capabilities\u0027:"},{"line_number":5344,"context_line":"                                {\u0027network\u0027: pcinet_info.get(\u0027capabilities\u0027)}}"},{"line_number":5345,"context_line":"            return {}"},{"line_number":5346,"context_line":""},{"line_number":5347,"context_line":"        virtdev \u003d self._host.device_lookup_by_name(devname)"},{"line_number":5348,"context_line":"        xmlstr \u003d virtdev.XMLDesc(0)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bff0334d_b23c452f","line":5345,"range":{"start_line":5333,"start_character":0,"end_line":5345,"end_character":21},"updated":"2017-04-11 16:48:47.000000000","message":"Ta. Much prefered","commit_id":"e6829f872aca03af6181557260637c8b601e476a"}]}
